Вы никогда не пишете ничего, что связано с данными, которые вы читаете. Хотите добавить структуру данных в каналы к новой, которую вы создаете?
Или, возможно, вы хотите для открытия файла в режиме добавления open(filename, 'a')
, а затем добавьте свою строку, написав строку, созданную json.dumps
, вместо использования json.dump
, но nneonneo указывает, что это будет недействительным json.
Это потому, что переменная расширяется после того, как трубы и перенаправление уже выполнены. Таким образом, в этом случае |
является еще одним аргументом 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}"
echo
?echo
не является частью трубы? – zhenguoli 17 June 2017 в 14:20echo
является первым словом и является командой, никакое перенаправление не обрабатывается, поэтому все остальное, включая pipe, является аргументомecho
– Eric Renouf 17 June 2017 в 14:23echo
, а не трубку. Другими словами, труба не выполнена. – zhenguoli 17 June 2017 в 14:27echo
, так и командаawk
, причем stdout одного в качестве stdin другого. В этом случае, однако, труба не воспринимается оболочкой как имеющей этот особый смысл - она не появляется, пока оболочке не будет слишком поздно делать это.|
- это еще одна часть строки, которая передается командеecho
, и из-за строки & quot; awk & quot; также является аргументом, переданнымecho
и т. д. Нет конвейера, и выполняется только одна команда вместо 2 – Eric Renouf 17 June 2017 в 14:29