類似的問題,但沒有答案:我們如何運行儲存在變數中的命令?
如何在 bash 腳本中執行以下操作?
error=">&2"
echo 'something went wrong' $error
代替
echo 'something went wrong' >&2
為什麼?
因為如果您輸入錯誤>2&
,它會正常工作,但會將錯誤訊息寫入名為2
.
答案1
就像他們在評論中所說的那樣,你真的不知道。
好吧,你可以用 來做到這一點eval
,但你會遇到引用/轉義所有內容的麻煩別的在該命令列上。
不過,您可以使用函數做一些事情:在重定向下執行給定的簡單命令;或只是向 stderr 寫入一條訊息:
#!/bin/bash
tostderr() {
"$@" >&2
}
warn() {
local IFS=" "
printf "%s\n" "$*" >&2
}
tostderr printf "warning: %s\n" "something happened"
warn another thing to warn about
強調簡單的命令在第一個上,它不是,eval
而且你不能在命令中使用 shell 語法。例如,tostderr foo | bar
它僅重定向輸出foo
(通過管道到 stderr),並且tostderr (foo | bar)
不起作用。
如果您使用 zsh,並且確實想要這樣做,您可以使用全域別名來新增重定向(但有些人可能認為這接近混淆編碼):
#/usr/bin/zsh
alias -g TOSTDERR='>&2'
echo something bad happened TOSTDERR