zsh: Оценить массив как команду - PullRequest
0 голосов
/ 18 февраля 2020

Очень полезно иметь возможность использовать конструкции массива для составления больших многострочных команд. Например:

declare -a command=(
   somecommand
       -flagA # comment
       -flagB # comment

   # No need for line continuation characters!
   foo/bar/baz.ext

   # Pipe into grep
   || grep fizz buzz # <=== This does not work!
)

И тогда его можно выполнить как ${command[@]}. Однако вы не можете вставлять символы потока управления, такие как && или ||, и правильно их выполнять.

Есть ли способ сделать это из массива ZSH?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

То, что у вас есть в вашем примере, не труба; это список команд. Однако вам также не нужны неявные продолжения строки для || или |.

someCommandArgs=(
    -flagA  # comment
    -flagB  # comment

    foo/bar/baz.ext
)

someCommand "${someCommandArgs[@]}" |
  grep fizz buzz

Команда не может заканчиваться на |, поэтому анализатор знает, что команда должна продолжаться на другой line.

Вышеуказанное можно упаковать в одну функцию:

myCommand () {
  local -a args=(
      -flagA  # comment
      -flagB  # comment

      foo/bar/baz.ext
  )
  someCommand "${args[@]}" | 
    grep fizz buzz
}
0 голосов
/ 18 февраля 2020

(РЕДАКТИРОВАТЬ: кажется, что после того, как я ответил на него, есть некоторые правки в исходном вопросе)

Нужно угадать, поскольку вы не предоставили пример кода, но на ум приходит команда eval:

declare -a command=(
  ls
     -l
   /dev/random
   '||'
   cat -n
     )

echo EXE: ${command[*]}
eval "${command[@]}"
  • Требуется заключать в кавычки метасимволы в определении.
  • Использование двойных кавычек в eval становится весьма важным для автоматического цитирования || и других метасимволов оболочки.
...