Команда bash source не работает с pipe - PullRequest
0 голосов
/ 12 марта 2020

Существует 3 файла (a, b и c), все с разрешениями 777:

$ ls
a  b  c

Указанные выше файлы имеют следующее содержимое:

$ cat a
#!/bin/bash
export A=aaa
$ cat b
#!/bin/bash
source ./a
echo $A
$ cat c
#!/bin/bash
source ./a | >> log
echo $A

Единственная разница между b и c заключается в | >> log:

$ diff b c
2c2
< source ./a
---
> source ./a | >> log

Когда выполняется b, выдается ожидаемое aaa:

$ ./b
aaa

При выполнении c для меня выводится неожиданная пустая строка вместо ожидаемого aaa, а файл log, созданный сценарием c, пуст:

$ ./c

$ cat log
$

Очевидно, что в source и | есть что-то, чему я еще не научился.

Может ли кто-нибудь объяснить мне, почему c не выводит aaa?

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Используйте подстановку процесса вместо конвейера:

source ./a > >(tee -a log)

Таким образом ваша команда source выполняется в исходной оболочке.

В качестве альтернативы, вообще прекратите создание конвейера:

source ./a >>log
1 голос
/ 12 марта 2020

В Bash первая команда в конвейере всегда будет выполняться в подоболочке, поэтому все импортируемые им переменные будут потеряны. Но трубопровод - это не то, что вам нужно. С foo | >> file он перенаправляет вывод foo в пустую команду, затем вывод нулевой команды (которая является нулевой) добавляется к файлу. Я не уверен, почему Bash позволяет второй команде в конвейере быть нулевой, когда есть перенаправление.

Вы хотите command >> file, то есть

$ cat c
#!/bin/bash
source ./a >> log
echo $A

Хотя source ./a не производит никакого вывода.

...