これは私のスクリプトです。エクスポートコマンドを使用してもブロック外の変数は使用できません。以下は私が試したコードです。などの他のオプションを試しましたが、declare -x var
それも動作しません。誰でもこれについてコメントできますか?私は正しくしていますか?
#!/bin/bash
{
var="123"
export var # exporting the variable so that i can access from anywhere
echo "var is "$var # able to get the value of this variable
} | tee log.txt
echo "var is "$var # not able to get the value of this variable
ベストアンサー1
~によるとこれ許可されたSOF回答:
パイプでは、すべてのコマンドが異なるプロセス(stdout / stdinがパイプを介して接続されている)で同時に実行されます。
したがって、中括弧自体はサブシェルを生成しませんが、パイプは(bashで)実行します。
#!/bin/bash
var=256
ps -u | grep $0
{
ps -u | grep $0
{
var="123"
export var
echo "var is "$var
ps -u | grep $0
} | tee log.txt
echo "var is "$var
}
echo "var is "$var
したがって、私たちが望むのは、画面とログファイルに出力を引き続きインポートしながらパイプを使用しないようにすることです。幸いなことに、bashには<(...)
一時的なFIFOを生成する機能があります。次の例は、コードブロックを引き続き使用でき、出力全体をログにパイプして(別のログファイルに追加)、サブシェルを入力しなかったため、後で変更された変数にアクセスできる可能性を示していstdout
ますstderr
。
#!/bin/bash
VAR=123
echo "VAR first: $VAR"
{
VAR=256
echo "VAR in block: $VAR"
norealcommand
# show open files to see FIFOs
#lsof -p $$
date
otherbadcommand
}> >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
# dummy output to not mess up output order
echo | cat
#lsof -p $$
echo "VAR after block: $VAR"
cat -n stdout.log
cat -n stderr.log
結果は次のとおりです。
$ ./fifo /dev/shm |myself@mydesk|0|12:04:10
VAR first: 123
VAR in block: 256
./fifo: line 9: norealcommand: command not found
Mon Jul 3 12:04:37 CEST 2017
./fifo: line 13: otherbadcommand: command not found
VAR after block: 256
1 VAR in block: 256
2 Mon Jul 3 12:04:10 CEST 2017
3 VAR in block: 256
4 Mon Jul 3 12:04:37 CEST 2017
1 ./fifo: line 9: norealcommand: command not found
2 ./fifo: line 13: otherbadcommand: command not found
3 ./fifo: line 9: norealcommand: command not found
4 ./fifo: line 13: otherbadcommand: command not found
これがあなたを幸せにしてくれることを願っています:-)