Burada burada birden fazla doküman kullanmak mümkün müdür?


14

Bash'daki bir komuta girdi sağlamak için burada birden fazla doküman kullanılabilir mi?

$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar

Açıkçası, her iki durumda da, ikinci ikinci doküman stdin olarak kullanılır ve ilk referansın yerini alır. Onun echoyerine çözüm s mi?

$ cat <(echo -n foo) <(echo bar)
foobar

Ayrıca, bir nedenden dolayı, bir kombinasyon kullanmak benim için işe yaramadı. Neden olsun ki?

$ cat <<<foo <(echo bar)
bar
$ cat <(echo -n foo) <<<bar
foo

Burada iki belgeyi birleştirmek yerine kullanmak istediğinizin arkasında bir neden var mı?
fasulye

1
@ fasulye aslında pastekukla girişlerle test ederken içine koştu . Sanırım birkaç senaryo daha düşünebilirim. Birkaç değişkente önceden manipüle edilmiş metin içeren bir komut dosyam olsaydı, örneğin sadece dosyaları alan bir komutla her ikisine de bir şeyler yapmak isteyebilirdim diff.
Sparhawk

Başka bir kullanım-case (Bir kabuk komut dosyası oluşturmak için buraya-docs kullanarak bu bulundu): Eğer olmadan ardından birkaç değişken genişleme hatları ve bazı hatlar istiyorum: cat <<EOF1 <<"EOF2".
Toby Speight

Yanıtlar:


18

Yapabilirsin:

cat /dev/fd/3 3<< E1 /dev/fd/4 4<< E2
foo
E1
bar
E2

Yalnızca bir dosya tanımlayıcısı 0 olduğu için yalnızca bir stdin olabilir.

cat << EOF
eof
EOF

İçin Kısa:

cat /dev/fd/0 0<< EOF
eof
EOF

Ve:

cat <<< foo

dır-dir:

cat /dev/fd/0 0<<< foo

0 dosya tanıtıcısında ne açacağınızı kararlaştırmanız gerekir.

cat <(echo foo)

Dır-dir:

cat /dev/fd/123

Nerede 123Bir borunun dosya tanımlayıcısı ve paralel olarak bash echo foo, başka bir işlemde borunun diğer ucuna yönlendirilen stdout ile çalışır .

Bir dosya adını ilettiğinizde cat,cat artık standart girdiden okunur. İhtiyacınız olan:

cat <(echo foo) /dev/fd/0 << EOF
bar
EOF

Veya:

cat <(echo foo) - << EOF
bar
EOF

( stdin'den okumayı -söylemektir cat).


1
cat <<EOFtam olarak aynı değildir cat /dev/fd/0...: ikinci durumda catdosya adını görür ve açmayı yapar.
Mikel

@Mikel, demek istediğim işlevsel olarak eşdeğer . Herhangi bir argüman iletilmediğinde cat, fd0 değerinden okur , sanki -veya argümanını /dev/fd/0geçirmiş gibi (yalnızca Linux'ta (ve sadece Linux'ta), açılış /dev/fd/0tam olarak dosya tanımlayıcı 0'ı kopyalamak gibi değildir).
Stéphane Chazelas

/dev/fd/3 3<< E1Yapı tarafından çok şaşırdım ve şimdi / dev / fd / altındaki öğelerin tam olarak ne olduğunu merak ediyorum. Her ne kadar işlem her yerde varsayılan olarak orada 1 ve 2 dışında dosya sisteminde bir dosyayı açtıktan sonra bir şekilde büyülü görünüyor olsa da. Ancak örneğinizde, giriş yeniden yönlendirmesi dışında herhangi bir gerçek dosyaya bağlı olmayan dosya tanımlayıcı 3 ve 4'ü kullanıyorsunuz. Bunu zihinsel dosya tanımlayıcılarım modelinde anlayamıyorum. İşlem başka bir dosya açmak istiyorsa, fd 5 kullanması gerektiğini biliyor mu? Fds 3, 4, 5 olmalı mı yoksa bir şey olabilir mi?
calavera.info

@ calavera.info, takip sorusu oluşturmak istediğiniz gibi geliyor.
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.