Możesz przekierować wszystko, co chcesz, echo
ale nic z tym nie zrobi. echo
nie odczytuje standardowego wejścia. Wszystko, co robi, to zapisywanie na standardowe wyjście argumentów oddzielonych znakiem spacji i zakończonych znakiem nowego wiersza (oraz z niektórymi echo
implementacjami z pewnymi sekwencjami ucieczki w nich rozwiniętymi i / lub argumentami zaczynającymi się od -
ewentualnie traktowanych jako opcje).
Jeśli chcesz echo
wyświetlić zawartość pliku, musisz przekazać tę treść jako argument echo
. Coś jak:
echo "$(cat my_file.txt)"
Należy zauważyć, że $(...)
paski znak nowej linii spływu s od wyjścia tego cat
polecenia i echo
dodaje jeden plecy.
Zauważ też, że oprócz „ zsh
nie” nie można przekazać znaków NUL w argumentach polecenia, więc powyższe zwykle nie będzie działać z plikami binarnymi. yash
usunie również bajty, które nie stanowią części prawidłowych znaków.
Jeśli powodem chce zrobić to dlatego, że chcesz echo
, aby rozwinąć \n
, \b
, \0351
... sekwencje w pliku (jako zgodne z normą UNIX echo
implementacje zrobić, ale nie wszystkie ), to wolisz używać printf
zamiast :
printf '%b\n' "$(cat my_file.txt)"
W przeciwieństwie do echo
tego, ten jest przenośny i nie będzie miał problemów, jeśli zawartość pliku zaczyna się od -
.
Jako alternatywę do $(cat file)
, z ksh
, zsh
a bash
, można również zrobić:$(<file)
. Jest to specjalny operator, w którym powłoka w przeciwieństwie do cat
odczytu zawartości pliku stanowi uzupełnienie. Nadal usuwa końcowe znaki nowej linii i dławiki na bajtach NUL z wyjątkiem zsh
. W bash
tym nadal widnieje dodatkowy proces. Zauważ również, że jedną różnicą jest to, że nie dostaniesz żadnego błędu, jeśli spróbujesz odczytać plik katalogu typu w ten sposób. Ponadto, chociaż $(< file)
jest wyjątkowy, $(< file; other command)
nie jest (w zsh
, gdy nie emuluje innej powłoki, która nadal rozszerzałaby zawartość file
, uruchamiając polecenie niejawne $READNULLCMD
(zwykle pager)).
echo
?