скажем, я хочу запустить ./program
со строковым аргументом
вместо ввода ./program string
каждый раз, как я могу сделать ./program <file>
, где <file>
- это файл, содержащий строку?
Благодарю
скажем, я хочу запустить ./program
со строковым аргументом
вместо ввода ./program string
каждый раз, как я могу сделать ./program <file>
, где <file>
- это файл, содержащий строку?
Благодарю
Это должно сделать трюк:
./program `cat file`
Если вы хотите, чтобы весь файл содержался в одном аргументе, добавьте двойную кавычку (проверено в bash. Я думаю, что она может меняться от оболочки к оболочке):
./program "`cat file`"
./program "$(< file)"
$(cmd)
запускает команду и преобразует ее вывод в строку. $(cmd)
также может быть записан с обратными окнами как `cmd`
. Я предпочитаю более новый $(cmd)
, поскольку он гнездится лучше, чем предыдущие образы старой школы.
Нам нужна команда cat file
. А затем из страницы bash man:
Подстановка команды
$(cat file)
может быть заменена эквивалентной, но быстрее$(< file)
.
Кавычки вокруг него гарантируют, что пробелы сохранены, на всякий случай, если в вашем файле есть пробелы или символы новой строки. Правильное цитирование вещей в сценариях оболочки - это навык, которого не хватает. Котировка переменных и подстановок команд является хорошей привычкой к добру, поэтому вы не получите бит позже, когда ваши имена файлов или значения переменных имеют пробелы или управляющие символы или другие странности.
Вы можете использовать один из:
./program $(cat file)
./program "$(cat file)"
Последнее полезно, если в файле может быть несколько слов, и вы хотите, чтобы их рассматривали как один аргумент. В любом случае, я предпочитаю использовать if $()
для обратных ссылок просто из-за его способности к гнезду (что, вероятно, не является требованием в этом случае).
Также имейте в виду, что этот ответ (и другие) больше связан с используемой оболочкой, а не с самим Linux. Поскольку преобладающая оболочка и лучшая: -) кажется bash
, я специально для этого кодировал.
На самом деле это довольно распространенный способ уничтожения процессов под изображениями UNIX. Демон (например, cron
) будет записывать свой идентификатор процесса в файл (например, /var/cron.pid
), и вы можете сообщить ему что-то вроде:
kill -HUP $(cat /var/cron.pid)
Другим вариантом является xargs:
cat file | xargs ./program
Я лично считаю, что эту версию легче читать, особенно если вы делаете больше, чем просто файл.
На странице man:
xargs считывает элементы из стандартного ввода, разделенные пробелами или символами новой строки, и выполняет команду один или несколько раз с любыми начальными аргументами, за которыми следуют элементы, считанные со стандартного ввода.
Говоря простым языком, xargs выполнит. /program для каждой строки/слова, которое отправляется на него.
См. man xargs для получения дополнительных параметров.
Все приведенные выше ответы работают, но я считаю, что самый простой и простой вариант -
xargs < file ./program