Exec команда Mac OS Shell с трубкой в ​​нем - PullRequest
0 голосов
/ 30 марта 2011

Это может быть действительно глупый вопрос, но я бьюсь головой об стену здесь ...

Почему этот код:

#!/bin/bash -x    
cmd="launchctl list | grep -i \"twshows\""
echo $($cmd)

Произведите этот вывод:

% ./test.sh
+ cmd='launchctl list | grep -i "twshows"'
++ launchctl list '|' grep -i '"twshows"'
usage: launchctl list [-x] [label]
+ echo

Вместо простого выполнения команды.Что не так с этой трубой?Не хорошо ли сбежал?Я действительно в отчаянии, никогда не сталкивался с такими вещами в Linux: /

Я много искал, но не смог найти удовлетворительного ответа.

Большое спасибо за любые советы!

Ответы [ 3 ]

2 голосов
/ 30 марта 2011

То, что вы хотите сделать, это использовать eval для оценки переменной $cmd:

#!/bin/bash -x    
cmd="launchctl list | grep -i \"twshows\""
eval $cmd

Большое страшное предупреждение

eval может быть весьма злым , потому что он будет оценивать все, что находится в этой переменной. Если эта переменная инициализируется из предоставленного пользователем ввода, скажем, rm -rf \; echo 'gotcha!', она выполнит ее с теми же привилегиями, что и оболочка, под которой вы ее запускаете.

1 голос
/ 30 марта 2011

Не помещайте команду в переменную! Просто выполните это! Что не так с:

#!/bin/bash
launchctl list | grep -i \"twshows\"
0 голосов
/ 02 апреля 2011

Окей, так что я отвечаю себе ... Я узнал, что при выполнении этого:

echo $(launchctl list | grep -i "aqua")

Работает.

Основным отличием является техника спасения. Если вы избежите всей команды, вот так:

echo $(" launchctl list | grep -i "aqua" ")

Команда не будет найдена. Если вы поместите команду в переменную, произойдет то же самое. И, наконец, если вы избежите двойных кавычек для grep, он тоже не будет работать.

Таким образом, единственное решение - НЕ избегать команды, мне кажется странным, но по крайней мере ... это работает!

...