Możesz przekierować wszystko, co chcesz, echoale nic z tym nie zrobi. echonie 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 echoimplementacjami z pewnymi sekwencjami ucieczki w nich rozwiniętymi i / lub argumentami zaczynającymi się od -ewentualnie traktowanych jako opcje).
Jeśli chcesz echowyś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 catpolecenia i echododaje jeden plecy.
Zauważ też, że oprócz „ zshnie” nie można przekazać znaków NUL w argumentach polecenia, więc powyższe zwykle nie będzie działać z plikami binarnymi. yashusunie 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 echoimplementacje zrobić, ale nie wszystkie ), to wolisz używać printfzamiast :
printf '%b\n' "$(cat my_file.txt)"
W przeciwieństwie do echotego, 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, zsha bash, można również zrobić:$(<file) . Jest to specjalny operator, w którym powłoka w przeciwieństwie do catodczytu zawartości pliku stanowi uzupełnienie. Nadal usuwa końcowe znaki nowej linii i dławiki na bajtach NUL z wyjątkiem zsh. W bashtym 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?