используя Linux, как я могу передать содержимое файла в качестве параметра в исполняемый файл? - PullRequest
26 голосов
/ 22 ноября 2010

допустим, я хочу запустить ./program со строковым аргументом

вместо ввода ./program string каждый раз, как я могу сделать ./program <file>, где <file> - это файл, содержащий строку?

спасибо

Ответы [ 5 ]

47 голосов
/ 22 ноября 2010

Это должно сработать:

./program `cat file`

Если вы хотите, чтобы все содержимое файла в одном аргументе, добавьте двойные кавычки (протестировано в bash. Я думаю, что это может варьироваться от оболочки к оболочке):

./program "`cat file`" 
26 голосов
/ 22 ноября 2010

Команда

./program "$(< file)"

Объяснение

  1. $(cmd) запускает команду и преобразует ее вывод в строку. $(cmd) также может быть записано с обратными галочками как `cmd`. Я предпочитаю более новый $(cmd), так как он гнездится лучше, чем задники старой школы.

  2. Нам нужна команда cat file. А затем со страницы руководства bash:

    Подстановка команды $(cat file) может быть заменена эквивалентной, но более быстрой $(< file).

  3. Кавычки вокруг него гарантируют, что пробел сохраняется, на тот случай, если внутри вашего файла есть пробелы или переводы строки. Правильно цитировать вещи в сценариях оболочки - это навык, которого крайне не хватает. Заключение в кавычки переменных и подстановок команд - хорошая привычка, поэтому вы не получите ничего позже, когда в именах файлов или значениях переменных будут пробелы, управляющие символы или другие странности.

5 голосов
/ 25 сентября 2011

Другой вариант - xargs:

cat file | xargs ./program

Лично я считаю, что эту версию легче читать, особенно если вы делаете больше, чем просто перехватываете файл.

Со страницы руководства:

xargs читает элементы из стандартного ввода, разделенные пробелами или символами новой строки, и выполняет команду один или несколько раз с любыми начальными аргументами, за которыми следуют элементы, считанные из стандартного ввода.

Говоря простым языком, xargs будет выполнять ./program в каждой строке / слове, которая передается к нему.

Дополнительные сведения см. В man xargs.

5 голосов
/ 22 ноября 2010

Вы можете использовать одно из:

./program $(cat file)
./program "$(cat file)"

Последнее полезно, если в файле может быть несколько слов, и вы хотите, чтобы они рассматривались как один аргумент.В любом случае, я предпочитаю использовать if $() для обратных кавычек просто из-за его способности вкладывать (что, вероятно, не требование в этом случае).этот ответ (и другие) больше связаны с используемой оболочкой, а не с самим Linux.Поскольку преобладающая и лучшая: -) оболочка кажутся bash, я специально для этого кодировал.

Этона самом деле является довольно распространенным способом уничтожения процессов под аналогами UNIX.Демон (например, cron) запишет свой идентификатор процесса в файл (например, /var/cron.pid), и вы можете сообщить ему что-то вроде:

kill -HUP $(cat /var/cron.pid)
1 голос
/ 25 июня 2017

Все приведенные выше ответы работают, но я считаю, что самый простой и простой в наборе вариант -

xargs < file ./program
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...