Как запустить команду, разделенную несколькими переменными в Bash?

Я хотел бы запустить команду из нескольких «штук».

php="php" options="-l" for f in `git diff-index --cached --name-only HEAD | grep -e '\(php\|phtml\)$'`; do if [ -f $f ]; then # Here I want to run my command defined # in $php and $options and put the result in # $php_lint var # like this command would do: # php_lint=$(php -l $f) # but with something like that: # php_lint=eval $php $options $f fi done

Как это сделать?

Обновление:

После борьба за конкретный момент, я задал этот вопрос:

https://stackoverflow.com/questions/43760897/bash-error-command-not-found-running-a-command-stored-in- var /

Пожалуйста, посмотрите, он также может помочь вам.

4
задан 23 May 2017 в 15:39

4 ответа

Поместите параметры в массив и раскройте его как "${options[@]}"

Пример

$ cmd=ls
$ options=(-a -l -d)
$ f="foo"

, затем

$ result=$("$cmd" "${options[@]}" "$f")

, давая

$ echo "$result"
drwxrwxr-x 2 user user 4096 Apr 20 08:07 foo
6
ответ дан 22 May 2018 в 23:16
  • 1
    Спасибо! Не могли бы вы изменить свой ответ на добавление котировок на $ cmd? (это может быть команда с пробелами в ней). – darckcrystale 24 April 2017 в 16:56
  • 2
    @darckcrystale, вы можете обнаружить, что если $cmd содержит пробелы, это также должно быть передано как массив (иначе он будет отображаться как одна строка - я не могу представить никаких реальных команд , которые содержат пробелы - только команды + аргументы). – steeldriver 24 April 2017 в 16:59
  • 3
    Вы правы, это может быть команда с опциями. Нужно ли мне делать с $ options var? Или мне нужно установить команду в $ cmd, а все опции в $ options var? – darckcrystale 24 April 2017 в 17:02
  • 4
    Строго говоря, это действительно возможно: fname=new$'\n'line.sh; printf '#!/bin/sh\necho "Hello world"\n' > "$fname"; chmod 755 "$fname"; ./"$fname". Любой, кто делает это, конечно, заслуживает того, что получает. – terdon♦ 24 April 2017 в 17:03
  • 5
    @steeldriver Проблема, например, в том, что команда может быть чем-то вроде docker exec <container name> <command> <options>, в этом случае $ cmd может быть docker и опциями exec, <container name>, <command>, <options>. Это звучит немного странно для меня: / – darckcrystale 24 April 2017 в 17:07

Поместите параметры в массив и раскройте его как "${options[@]}"

Пример

$ cmd=ls $ options=(-a -l -d) $ f="foo"

, затем

$ result=$("$cmd" "${options[@]}" "$f")

, давая

$ echo "$result" drwxrwxr-x 2 user user 4096 Apr 20 08:07 foo
6
ответ дан 18 July 2018 в 14:22

Поместите параметры в массив и раскройте его как "${options[@]}"

Пример

$ cmd=ls $ options=(-a -l -d) $ f="foo"

, затем

$ result=$("$cmd" "${options[@]}" "$f")

, давая

$ echo "$result" drwxrwxr-x 2 user user 4096 Apr 20 08:07 foo
6
ответ дан 24 July 2018 в 20:22

Поместите параметры в массив и раскройте его как "${options[@]}"

Пример

$ cmd=ls $ options=(-a -l -d) $ f="foo"

, затем

$ result=$("$cmd" "${options[@]}" "$f")

, давая

$ echo "$result" drwxrwxr-x 2 user user 4096 Apr 20 08:07 foo
6
ответ дан 31 July 2018 в 12:49

Другие вопросы по тегам:

Похожие вопросы: