Bash
列印 shell 變數會產生空輸出
我有以下程序,我想在其中列印一個變數
$var
,用程序的執行時間填充該變數。但是,當將其輸出到控制台時,echo
或printf
值為空。程序:
#!/bin/bash for n in 1 2 3 4; do my_time="$(time var=$(echo "scale=100; 4*a(1)" | bc -l))"; echo $var echo $my_time printf "Value of PI is :%s\n" $var done
輸出:
real 0m0.003s user 0m0.000s sys 0m0.000s Value of PI is : real 0m0.004s user 0m0.000s sys 0m0.000s Value of PI is : real 0m0.004s user 0m0.000s sys 0m0.000s Value of PI is : real 0m0.004s user 0m0.000s sys 0m0.000s Value of PI is :
問題出在哪裡,如何解決?
命令替換
$(...)
在子 shell 中執行命令。在子 shell 中設置變數不會傳播到父 shell。在這種情況下,問題就更大了,因為
time
內置函式不會輸出到標準輸出或錯誤。為了能夠擷取它的輸出,您需要在子shell 中執行它並擷取該shell 的stderr - 但是那樣,您不能設置任何變數。我看到的唯一可能的方法是執行命令兩次,一次擷取輸出,一次擷取時間:
var=$(bc -l <<< 'scale=100; 4*a(1)') my_time=$( (time bc -l <<< 'scale=100; 4*a(1)') 2>&1 >/dev/null)
或者,同時擷取這兩個細節並稍後將它們分開:
out=$( (time bc -l <<< 'scale=100; 4*a(1)') 2>&1) var=${out%real*} my_time=real${out#*real}