вывод ffmpeg и скрипт [дубликат]

Вы никогда не пишете ничего, что связано с данными, которые вы читаете. Хотите добавить структуру данных в каналы к новой, которую вы создаете?

Или, возможно, вы хотите для открытия файла в режиме добавления open(filename, 'a'), а затем добавьте свою строку, написав строку, созданную json.dumps, вместо использования json.dump, но nneonneo указывает, что это будет недействительным json.

0
задан zhenguoli 17 June 2017 в 14:08
поделиться

1 ответ

Это потому, что переменная расширяется после того, как трубы и перенаправление уже выполнены. Таким образом, в этом случае | является еще одним аргументом echo, а не трубой, интерпретируемой оболочкой.

Рекомендуемое чтение: http://mywiki.wooledge.org/BashFAQ/ 050

При выполнении команды

echo hello man | awk '{print $1}'

оболочка увидит | и настроит конвейер, с одной стороны он выполнит команду echo hello man а с другой awk '{print $1}'. Затем команды подвергаются разбиению слов, поэтому вы запускаете команду echo с двумя аргументами: hello и man. С другой стороны вы запускаете команду awk с одним аргументом (из-за цитирования) "{print \$1}"

Когда эта команда сохраняется как строка, хотя оболочка сначала смотрит на команду $y и не видит перенаправления. Затем он расширяет $y, а затем разбивает на нем слово. Он расширяется до той же строки, но теперь слишком поздно для перенаправления. Поэтому он делится на слова echo, hello, man, |, awk, "{print, \$1}" (обратите внимание, что теперь аргумент awk разделяется, потому что кавычки внутри строка является частью строки, а не синтаксической)

Первое слово в этом списке - echo, так что это команда, и все остальные слова передаются в качестве аргументов, поэтому вы видите выход

hello man | awk "{print \$1}"

Когда вы делаете строку eval, она принимает ту же строку и сообщает bash для ее синтаксического анализа, как если бы она была напечатана так, что труба снова станет синтаксической и вызывает [. g7]

Поскольку echo помещает свои аргументы в одну строку, иногда бывает немного сложнее увидеть, что происходит, если мы заменим его на printf '%s\n', каждый аргумент станет его собственной строкой:

$ y='printf %s\n hello man | awk "{print \$1}"'
$ $y
hello
man
|
awk
"{print
\$1}"
3
ответ дан Eric Renouf 16 August 2018 в 01:19
поделиться
  • 1
    Переменная расширяется после труб и перенаправления. Но когда выполняется echo? echo не является частью трубы? – zhenguoli 17 June 2017 в 14:20
  • 2
    @zhenguoli no, переменная расшифровывается до строки, которую вы ей назначили, тогда она подвергается расщеплению слов. Первое слово рассматривается как команда, а все остальные являются аргументами этой команды. Таким образом, echo является первым словом и является командой, никакое перенаправление не обрабатывается, поэтому все остальное, включая pipe, является аргументом echo – Eric Renouf 17 June 2017 в 14:23
  • 3
    Вы имеете в виду, что Bash рассматривает его как команду echo, а не трубку. Другими словами, труба не выполнена. – zhenguoli 17 June 2017 в 14:27
  • 4
    Сортировка, если бы это была труба, у вас были бы как команда echo, так и команда awk, причем stdout одного в качестве stdin другого. В этом случае, однако, труба не воспринимается оболочкой как имеющей этот особый смысл - она ​​не появляется, пока оболочке не будет слишком поздно делать это. | - это еще одна часть строки, которая передается команде echo, и из-за строки & quot; awk & quot; также является аргументом, переданным echo и т. д. Нет конвейера, и выполняется только одна команда вместо 2 – Eric Renouf 17 June 2017 в 14:29
  • 5
    Большое спасибо, я, наверное, понял. – zhenguoli 17 June 2017 в 14:31
Другие вопросы по тегам:

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