Стандартная практика именования исполняемых файлов (двоичных файлов) и как узнать, есть ли в файле непечатаемые символы?

Просто в дополнение к 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.

1
11.03.2020, 19:38
1 ответ

Стандартная практика именования исполняемых файлов состоит в том, чтобы дать им имя команды, которую они должны реализовать :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-. ] префиксы ). (Роб Пайк считал эту опцию вредной — не из-за ее влияния на терминал, а из-за ее влияния на стиль команд.)

6
28.04.2021, 23:21

Теги

Похожие вопросы