Bash

將 STDOUT 分配給變數時的 Shell 腳本錯誤處理

  • September 13, 2014

我正在嘗試在我的 shell 腳本中實現錯誤處理,如使用 $? 的最佳實踐中的第二個答案中所述。在重擊中?

我的腳本如下所示:

#!/bin/bash

try() {
   "$@"
   code=$?
   if [ $code -ne 0 ]
   then
       echo "oops $1 didn't work"
       exit 1
   fi
}

try myvar=$(mktemp -p ./)

腳本以

./test.sh: line 4: myvar=./tmp.scNLzO1DDi: No such file or directory
oops myvar=./tmp.scNLzO1DDi didn't work

只是,

myvar=$(mktemp -p ./)

當然工作正常, $myvar 返回臨時文件的完整路徑和名稱。

如何獲得將 tmp 文件的名稱分配給變數 myvar 的語句,同時仍將整個語句及其結果傳遞給 try(),以便 try() 可以做它需要做的事情?謝謝。

我認為您想使用錯誤陷阱而不是評估包裝器。

err_handler () {
   code=$?
   if [ $code -ne 0 ]
   then
       echo "oops $1 didn't work"
       exit 1
   fi
}

trap 'err_handler' ERR
myvar=$(mktemp -p ./)
trap ERR

使用,在為 建構參數列表期間呼叫之前執行try myvar=$(mktemp -p ./)的子shell 。mktmp``try``try

以後要擴展子shell,需要引用 的參數try

try 'myvar=$(mktemp -p ./)'

稍後要進行擴展,您需要使用eval "$@"而不是"$@"第一行中的try.

引用自:https://unix.stackexchange.com/questions/154548