Bash: конвейерный аргумент для открытия команды завершается неудачно.Открытые команды оправдывают слишком рано? - PullRequest
1 голос
/ 01 сентября 2010

Я новичок в создании сценариев оболочки. Я пытаюсь отправить вывод некоторых переданных команд в команду open в bash в OSX.

Моя конечная цель - скомпилировать приложение Flex / Actionscript из TextWrangler, вызвав bash-скрипт с небольшим количеством Applescript и воспроизвести результат непосредственно во Flash Player. Applescript в значительной степени выполняет свою работу. Но скрипт bash работает не так, как я ожидаю. Те же результаты, когда я опускаю Applescript и просто помещаю его прямо в терминал.

Это то, что Applescript отправляет на терминал:

mxmlc -warnings=false DocumentClass.as | tail -n 1 | sed 's/[[:space:]].*$//' | open -a 'Flash Player'

Итак, в основном я прочитал последнюю строку вывода mxmlc, которая обычно выглядит примерно так:

/Users/fireeyedboy/Desktop/DocumentClass.swf (994 bytes)

и я убираю все после первого пробела, с которым он сталкивается. Я знаю, что это вряд ли пуленепробиваемый, но это все еще только доказательство концепции. Когда я получу это грубо, я уточню. Пока возвращает желаемый результат:

/Users/fireeyedboy/Desktop/DocumentClass.swf

Но, как вы можете видеть, я тогда пытаюсь передать этот sed результат во Flash Player, и там он терпит неудачу. Flash Player открывается слишком рано. Я ожидаю, что Flash Player откроется только после того, как скрипт завершит команду sed. Но это открывается намного раньше.

Итак, мой вопрос состоит из двух частей:

  1. Возможно ли даже Аргумент к открытой команде это путь?
  2. Нужно ли использовать какой-то тип задержки команды, чтобы получить это работает, так как команда open, кажется, не ожидает ввода?

Ответы [ 3 ]

3 голосов
/ 01 сентября 2010

Вы пытаетесь указать имя файла swf в качестве ввода для стандартного ввода команды open, которая не поддерживается.

Ожидает имя файла в качестве аргумента (аналогично -a).

Вы можете сделать что-то вроде этого:

FILENAME=`xmlc -warnings=false DocumentClass.as | tail -n 1 | sed 's/[[:space:]].*$//'`
open -a 'Flash Player' $FILENAME

или в одной строке:

open -a 'Flash Player' `xmlc -warnings=false DocumentClass.as | tail -n 1 | sed 's/[[:space:]].*$//'`

Если вы используете bash (или другую современную оболочку POSIX), вы можете заменить довольно нечитаемый символ обратного удара на $( и ):

open -a 'Flash Player' $(xmlc -warnings=false DocumentClass.as | tail -n 1 | sed 's/[[:space:]].*$//')
2 голосов
/ 01 сентября 2010

Все команды в конвейере запускаются одновременно.На этом шаге их входы / выходы соединены вместе.

Я предполагаю, что open -a 'Flash Player' не ждет ввода, а просто запускает флеш-плеер.Я предлагаю вместо этого запустить плеер с аргументом:

name=$(mxmlc -warnings=false DocumentClass.as | tail -n 1 | sed 's/[[:space:]].*$//')
open -a 'Flash Player' "$name"
1 голос
/ 01 сентября 2010

Я не знаком с командой "open", так как это похоже на Mac, но я думаю , что вы хотите сделать:

open -a 'Flash Player' $(mxmlc -warnings=false DocumentClass.as | tail -n 1 | sed 's/[[:space:]].*$//')

Как правило, вы не можете передать аргументы команде, вы должны указать, что вы хотите, чтобы выходные данные предыдущей команды рассматривались как аргументы, как в моем примере, или с помощью команды xargs. Обратите внимание, что существует максимальный размер командной строки.

...