В gnome-терминал / bash можно ли выводить std напрямую (интерпретировать?) Как команду? - PullRequest
1 голос
/ 30 сентября 2010

Я только что вышел из фургона Winows, и терминал gnome и bash выглядят великолепно, но я не совсем понимаю, как заставить его делать то, что я хочу, (я подозреваю, что это возможно).
Можно ли заставить вывод std (например, из sed) работать как команда?
(т.е. интерпретировать и запустить вывод как часть логики скрипта.)
Я опрашиваю процесс для вывода его статуса через определенные промежутки времени, и я хотел бы сделать это как один лайнер.

# dd is already running in another terminal. Its PID is 1234
pgrep -l '^dd$' | sed -n 's/^\([0-9]\+.*\)/sudo watch -n 30 kill -USR1 \1/p'  
# this outputs: sudo watch 30 kill -USR1 1234  

Есть ли какая-нибудь кратчайшая магия терминала / bash для запуска sudo watch 30 kill -USR1 1234? Спасибо.

Ответы [ 4 ]

1 голос
/ 30 сентября 2010

Оберните это внутри $ (). $ () назначает стандартный вывод как переменную окружения. На отдельной строке запускается напечатанная команда.

$(pgrep -l '^dd$' | sed -n 's/^\([0-9]\+.*\)/sudo watch -n 30 kill -USR1 \1/p')
1 голос
/ 30 сентября 2010

Просто перенаправьте команды на sh:

pgrep -l '^dd$' | sed -n 's/^\([0-9]\+.*\)/sudo watch -n 30 kill -USR1 \1/p' | sh
1 голос
/ 30 сентября 2010

Вы должны быть в состоянии обернуть его в $():

$(pgrep ... | sed ...)

Но почему бы не сделать:

while :; do sleep 30; clear; kill -USR1 $(pgrep '^dd$'); done
0 голосов
/ 06 июня 2013

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

Если вы поместите `` вокруг команды, то вывод будет перенаправлен в строку, которая, если сама по себе, будет выполнена как команда.

Например, это будет запускать 'echo 3':

`echo "echo 3"`

Также это может работать с несколькими слоями, например:

``echo "echo echo 3"``

Выводит эхо «3», потому что первое эхо дает «эхо эхо 3», которое запускает другое эхо, которое дает «эхо 3», которое выполняется.

Я всегда использую `` вместо $ () или | sh / | bash, потому что лично я считаю, что внутри скриптов это выглядит чище. Но он работает почти так же, как $ () (я не верю, что есть какие-то различия, но они могут быть незначительными).

Одна из вещей, которую вы можете делать с $ () и ``, которую вы не можете делать с | Bash присваивает переменные. Вы можете сохранить вывод и затем выполнить его позже:

azdefvar="`COMMAND_THAT_OUTPUTS_COMMAND`"

Вот пример:

daboross@DaboUbuntu:~$ date +%T
13:09:20
daboross@DaboUbuntu:~$ azdef="`echo "date +%T"`"
daboross@DaboUbuntu:~$ echo $azdef
date +%T
daboross@DaboUbuntu:~$ $azdef
13:09:45
daboross@DaboUbuntu:~$ echo $azdef | bash
13:09:53

Вы можете использовать $ () вместо `` в любом из этих случаев.

Клавиша `находится прямо под клавишей esc на большинстве клавиатур.

...