Bash

/bin/dash 等效的 SHELLOPTS

  • February 11, 2022

我必須執行一些由第三方定義的 shell 腳本。所以我不能(或不想)改變他們的內容或他們正在使用的外殼(bash vs. dash)。他們可能會或可能不會通過 shebang 指定。

但是,我想將所有執行的命令列印到標準輸出。對於 bash,我可以使用env SHELLOPTS=xtrace ./script.sh. 但是,這僅在使用 shebang 時才有效#!/bin/bash。如果#!/bin/dash使用或不使用shebang,則沒有效果。

我可以使用 dash 的等效環境變數嗎?我知道我可以添加set -x到腳本的頂部,這對兩個 shell 都有效,但如果可能的話,我想避免這種情況。

沒有通用的替代品。

對於xtrace僅頂級腳本的特殊情況,您可以使用

dash -x ./script.sh

如果您不想編輯腳本。您可以做的另一件事是創建一個包裝腳本,例如

#!/bin/dash
set -x
. ./script.sh

在評論中你說你不想把事情綁起來。你可以寫一個程序,例如這個叫做 xtrace

#!/bin/bash
where=$(command -v "$1")
read line1 < "$where"
case "$line1" in
   (*"dash")
         # Assume if it mention dash on first line then it is a dash script
         exec /bin/dash -x "$@" ;;
   (*)
         SHELLOPTS=xtrace exec "$@" ;;
esac

然後xtrace ./script.sh用來執行它。

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