Mam plik o nazwie, my_file.txt
którego treść jest tylko ciągiem Hello
. Jak mogę przekierować jego treść do polecenia echo
?
Wiem, że mam polecenia less
, cat
, more
... ale muszę to zrobić z echo
.
Próbowałem tego:
$ cat my_file.txt | echo
a także to:
$ echo < my_file.txt
Ale w obu przypadkach pojawia się tylko puste miejsce na standardowym wyjściu, a nie zawartość my_file.txt.
Jak mogłem to zrobić?
shell
io-redirection
echo
danielmbcn
źródło
źródło
echo
?\n
,b
...) w pliku, co byłoby poprawnym użyciemecho
(przynajmniej standarduecho
). Lub prawdopodobnie chce zrozumieć, dlaczego to nie działa w ten sposób. W każdym razie nie ma powodu, by głosować za IMO.Odpowiedzi:
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órymiecho
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 argumentecho
. Coś jak:Należy zauważyć, że
$(...)
paski znak nowej linii spływu s od wyjścia tegocat
polecenia iecho
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ą UNIXecho
implementacje zrobić, ale nie wszystkie ), to wolisz używaćprintf
zamiast :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)
, zksh
,zsh
abash
, można również zrobić:$(<file)
. Jest to specjalny operator, w którym powłoka w przeciwieństwie docat
odczytu zawartości pliku stanowi uzupełnienie. Nadal usuwa końcowe znaki nowej linii i dławiki na bajtach NUL z wyjątkiemzsh
. Wbash
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 (wzsh
, gdy nie emuluje innej powłoki, która nadal rozszerzałaby zawartośćfile
, uruchamiając polecenie niejawne$READNULLCMD
(zwykle pager)).źródło
cat
i po prostu powłoka czytać go bezpośrednio:echo "$(<my_file.txt)"
.$(<filename)
.Dodając do innych odpowiedzi, możesz również spróbować przekierować wejście zamiast
cat
lub
$()
i `` wykonują to samo, uruchamiają polecenia w swoim zakresie i przekazują dane wyjściowe do powłoki tak, jakby była podana przez użytkownika jako dane wejściowe. Jedyną różnicą między tymi dwoma jest to, że $ () może być rekurencyjny i `` nie może być rekurencyjny.źródło
Prosta odpowiedź: nie możesz.
echo
(czy to wbudowany w powłokę, czy zwykły plik binarny) nie przetwarza standardowego wejścia - jest tylko jeden sposób.źródło
Jak powiedziano
Na przykład możesz to zrobić w następujący sposób
xargs
(biorąc pod uwagę, że musisz włączyć interpretację ucieczek odwrotnego ukośnika ):Lub po prostu to, o co prosiłeś (bez interpretacji sekwencji ucieczki ):
źródło
xargs echo
(tak samo jakxargs
btw jakecho
domyślne polecenie), uruchomione zostanieecho
polecenie z systemu plików, a nie wbudowaneecho
polecenie powłoki . Zauważ też, żexargs
oczekuje danych wejściowych w bardzo specyficznym formacie (gdzie spacje, znaki nowej linii, cudzysłowy, odwrotne ukośniki mają specjalne znaczenie).cat
nie ma większego sensu tu jest tylko jeden plik do łączenia (tak samo jak< file.txt xargs echo
Zauważ, że Unix zgodny.echo
s zrobić ekspansję ucieczki backslash domyślnie i wyjście-e
naecho -e
.W bash powinny działać również następujące elementy:
Część w backticks jest zastępowana przez dane wyjściowe tego polecenia, tj. W tym przypadku jest zastępowana przez zawartość pliku.
źródło
$( . . . )
. Ludzie, którzy używają$()
zwykle wolą je, ponieważ można je zagnieżdżać. To pytanie jest jednak stare, o wiele bardziej satysfakcjonujące jest odpowiadanie na pytania, na które jeszcze nie ma odpowiedzi!my_file.txt
zawiera*
, spowoduje to wydrukowanie listy nazw plików w bieżącym katalogu.