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.