Просто в дополнение к fredtantini и в качестве общего разъяснения (, поскольку документы немного запутаны):
xargs -I {}
возьмет символы '{}' из стандартного ввода и заменит их тем, что поступает из конвейера. Это означает, что вы можете заменить {}
любой комбинацией символов (, возможно, чтобы лучше соответствовать вашему предпочтительному варианту программирования ). Например:xargs -I % sh -c "echo %"
. Если вы всегда используете xargs -I {}
, вы можете заменить его на xargs -i
, так как это сокращение. РЕДАКТИРОВАТЬ:Опция xargs -i
устарела, поэтому придерживайтесь xargs -I{}
.
sh -c
скажет вашему bash/shell читать следующую команду из строки, а не из стандартного ввода. Таким образом, запись sh -c "echo something"
эквивалентна echo something
.
xargs -I {} sh -c "echo {}"
будет считывать ввод, созданный вами с помощью sh -c
, то есть echo {}
. Поскольку вы сказали заменить {}
аргументами, полученными из канала, вот что произойдет.
Вы можете легко проверить это даже без конвейера, просто введите указанную выше команду в терминале. Все, что вы напишете дальше, будет выведено на терминал (Ctrl -D для выхода ).
В команде ls -la {}
происходит то же самое. {}
заменяется содержимым команды pre -pipe.
Стандартная практика именования исполняемых файлов состоит в том, чтобы дать им имя команды, которую они должны реализовать :ls
, cat
... Нет условий для расширений, которые в конечном итоге игнорируются из командной строки.
Чтобы проверить, что содержит файл перед передачей его в cat
, запустите file
на нем:
$ file /bin/ls
/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=b6b1291d0cead046ed0fa5734037fa87a579adee, for GNU/Linux 3.2.0, stripped, too many notes (256)
$ file /bin/zgrep
/bin/zgrep: a /usr/bin/sh script, ASCII text executable
Это говорит мне о том, что cat /bin/zgrep
не будет делать ничего странного с моим терминалом (он даже не содержит управляющих последовательностей, которые идентифицируются отдельно с помощьюfile
).
Я предпочитаю использовать less
вообще :он предупредит о бинарных файлах перед их отображением и в любом случае не испортит работу терминала. Его также можно настроить так, чтобы он вел себя как cat
для коротких файлов (, см. параметр -F
).
Как указывает mosvy , вы можете сделать cat
безопасным для использования в двоичных файлах, добавив параметр -v
, который заменяет непечатаемые символы -видимыми представлениями(^
и M-
. ] префиксы ). (Роб Пайк считал эту опцию вредной — не из-за ее влияния на терминал, а из-за ее влияния на стиль команд.)