Czy w bashu można używać wielu dokumentów tutaj?


14

Czy można użyć wielu dokumentów tutaj, aby wprowadzić dane wejściowe do polecenia w bash?

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

Oczywiście w obu przypadkach drugi tutaj dokument jest używany jako stdin i zastępuje pierwsze odniesienie. Czy echozamiast tego można użyć s?

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

Z jakiegoś powodu użycie kombinacji nie działało dla mnie. Dlaczego miałoby to być?

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

Czy jest jakiś powód, dla którego chcesz użyć dwóch dokumentów tutaj zamiast ich łączenia w jeden?
fasola

1
@ beans Właściwie natknąłem się na to podczas testowania pastez fałszywymi danymi wejściowymi. Myślę, że mogę wymyślić kilka innych scenariuszy. Gdybym miał skrypt z wstępnie zmanipulowanym tekstem w kilku zmiennych, to mógłbym chcieć coś zrobić z oboma za pomocą polecenia, które pobiera tylko pliki diff.
Sparhawk

Innym zastosowaniem-case (Znalazłem ten używając tutaj-docs, aby utworzyć skrypt): chcesz kilka wierszy o zmiennej ekspansji, a następnie niektóre linie bez: cat <<EOF1 <<"EOF2".
Toby Speight

Odpowiedzi:


18

Możesz to zrobić:

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

Może być tylko jedno wejście standardowe, ponieważ istnieje tylko jeden deskryptor pliku 0.

cat << EOF
eof
EOF

jest skrótem od:

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

I:

cat <<< foo

jest:

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

Musisz zdecydować, co otworzyć w deskryptorze pliku 0.

cat <(echo foo)

Jest:

cat /dev/fd/123

Gdzie 123znajduje się deskryptor pliku dla potoku i równolegle bash działa echo foow innym procesie, a standardowe wyjście jest przekierowywane na drugi koniec potoku.

Po przekazać nazwę pliku cat, catnie czytać ze standardowego wejścia. Potrzebujesz:

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

Lub:

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

( -ma powiedzieć, cataby czytać ze standardowego wejścia).


1
cat <<EOFnie jest dokładnie taki sam jak cat /dev/fd/0...: w tym drugim przypadku catwidzi nazwę pliku i otwiera.
Mikel

@Mikel, miałem na myśli to, że jest funkcjonalnie równoważny . Gdy nie przekazuje żadnego argumentu, catodczytuje z jego fd0, jakby przekazał argument -lub /dev/fd/0(choć w Linuksie (i tylko w Linuksie), otwarcie /dev/fd/0nie jest dokładnie takie jak powielanie deskryptora pliku 0).
Stéphane Chazelas

Byłem bardzo zaskoczony /dev/fd/3 3<< E1konstrukcją i zastanawiam się teraz, czym dokładnie są przedmioty w katalogu / dev / fd /. Wydaje mi się, że w jakiś sposób pojawiają się magicznie, gdy proces otwiera plik gdzieś w systemie plików, z wyjątkiem 1 i 2, które są tam domyślnie dla każdego procesu. Ale w twoim przykładzie używasz deskryptora pliku 3 i 4, które nie są podłączone do żadnego rzeczywistego pliku oprócz tego przekierowania wejściowego. Nie mogę tego pojąć w moim mentalnym modelu deskryptorów plików. Co jeśli proces chce otworzyć inny plik, czy wiedziałby, że musi użyć fd 5? Czy fds musi być 3, 4, 5 ... czy może być czymkolwiek?
calavera.info

@ calavera.info, wygląda na to, że chcesz utworzyć pytanie uzupełniające.
Stéphane Chazelas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.