Bash
當命令儲存在變數中時 io 重定向不起作用
以下命令可讓我檢查網頁是否具有特定內容。除非找到內容,否則它不會輸出任何內容。
curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'
問題是,當我將它添加到 shell 腳本時,輸出不再被抑制。
#!/bin/bash TEST1="curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'" $TEST1 if [[ $? != 0 ]]; then #do something if exit status of last command not equal to zero fi
如果我嘗試將腳本的輸出儲存在變數 (
VAL1
)中,我也會遇到同樣的問題#!/bin/bash TEST1="curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'" VAL1+=$($TEST1) echo "result should be blank or the found grep $VAL1"
為什麼
2>&1
直接執行命令時按預期工作,但是當添加到腳本時,輸出是在命令行中定向的?更新
傑夫斯在評論中的暗示讓我朝著正確的方向前進。接受的答案是正確的。我為腳本所做的工作是將我最初嘗試分配給變數的程式碼移動到函式中並使用
$( ... )
. 這樣一切都按預期執行:#!/bin/bash # note that -z checks if variable is empty test1() { VAL1=$(curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content') if [[ -z $VAL1 ]]; then VAL1=test1fail fi } test1 echo $VAL1
Jeff Schaller 的評論連結在鼻子上。來自 bash 手冊的關鍵資訊 ( https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion )
執行簡單命令時,shell 從左到右執行以下擴展、賦值和重定向。
- 解析器標記為變數賦值(命令名前面的那些)和重定向的詞被保存以供以後處理。
- 不是變數賦值或重定向的詞被擴展(參見Shell Expansions)。如果展開後還剩下任何單詞,則將第一個單詞作為命令的名稱,其餘單詞作為參數。
- 如上所述執行重定向(請參閱重定向)。
- 在分配給變數之前,每個變數賦值中“=”之後的文本都經過波浪號擴展、參數擴展、命令替換、算術擴展和引號刪除。
步驟 1 辨識重定向並保存它們。
第 2 步是變數擴展發生的地方。
shell 在步驟 1 中看不到重定向。