хранить и выполнять команду redirection / piped в скрипте

Как сохранить, а затем выполнить команду с перенаправлением и и трубку? (И это труба, или перенаправление, или и то, и другое), что вызывает мою проблему?)

Я попытался напечатать версию urxvt в скрипте, а также повторить действительную команду.

Команда, которую я использую для получения версии, – urxvt -help 2>&1 | head -n 2 urxvt -help 2>&1 | head -n 2 – по какой-то причине urxvt печатает помощь stderr ; как и для head , только две первые строки содержат данные о версии и конфигурации.

В оболочке он отлично работает, но в сценарии (изолированная проблема ниже) кажется, что третья строка теряет голову:

 #!/bin/bash VER_URXVT='urxvt -help 2>&1 | head -n 2' echo $VER_URXVT $VER_URXVT 

4 Solutions collect form web for “хранить и выполнять команду redirection / piped в скрипте”

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

 #!/bin/bash VER_URXVT='urxvt -help 2>&1 | head -n 2' echo $VER_URXVT eval $VER_URXVT 

На странице man eval

  The args are read and concatenated together into a single com- mand. This command is then read and executed by the shell, and its exit status is returned as the value of eval. If there are no args, or only null arguments, eval returns 0. 

Использование:

 VER_URXVT=`urxvt -help 2>&1 | head -n 2` 

это то же самое, что:

 VER_URXVT=$(urxvt -help 2>&1 | head -n 2) 

чтобы получить первые две строки urxvt help в VER_URXVT .

Если вы хотите оценить команду в переменной оболочки, вы должны использовать eval :

 VER_URXVT='urxvt -help 2>&1 | head -n 2' eval $VER_URXVT 

Я продолжаю думать о функциях лучше, чем переменные eval uing

 #!/bin/bash version() { uname -a;} wm() { head -n1 <(openbox --version);} for f in $(compgen -A function) do declare -f $f | sed '1,2d; $d' $f done 

никогда не используйте eval если вы действительно не знаете, что будет eval .

вместо этого используйте функцию.

 #!/bin/bash ver_urxvt() { urxvt -help 2>&1 | head -n 2;} declare -f ver_urxvt | sed '1,2d; $d' ver_urxvt 

но это глупо, так как это пустая трата времени для печати этих сведений.

если вы хотите отлаживать свой скрипт, используйте параметр -x для встроенного set

  • Команда запуска / остановки в терминале без вмешательства человека?
  • Как подсчитать вхождения каждого слова, принадлежащего файлу, во все количество файлов `n`, переданных в качестве аргументов?
  • Загрузка с оболочки на HTTP-сервер
  • Как проверить папку внутри конкретной папки в сценарии оболочки?
  • Как сопоставить 2 больших файла и распечатать разницу в сценарии оболочки
  • Что делает exec 3 <& 1?
  • Проверьте входящий поток на пустые пространства и переместите его
  • Предотвращение активного удаления файлов в файловой системе NFS
  • awk с утверждениями if
  • Нажмите кнопку html через скрипт оболочки?
  • Как написать сценарий оболочки HUSH, который проверяет результат каждой команды?
  • Linux и Unix - лучшая ОС в мире.