Bash
與輸出重定向一起使用時,shell 腳本不會解釋萬用字元
假設我有兩個腳本:
- script1.sh:
#!/bin/bash version=2.6 log_file="$HOME/log-file-version-$version.log" touch $log_file &>/dev/null echo "log to my log file from script 1" >> $HOME/log-file-version-?.?.log gnome-terminal --tab --active --title="script2" -- sh script2.sh
- script2.sh:
#!/bin/bash echo "log to my log file from script 2" >> $HOME/log-file-version-?.?.log
我跑
script1.sh
。我在家裡留下了兩個日誌文件:
log-file-version-2.6.log log-file-version-?.?.log
log-file-version-2.6.log
包含:從腳本 1 登錄到我的日誌文件
log-file-version-?.?.log
包含:從腳本 2 登錄到我的日誌文件
這意味著在腳本 1 中,第 7 行 (
>> $HOME/log-file-version-?.?.log
) 中的萬用字元被正確解釋,但是當使用sh
這些萬用字元執行腳本時不起作用。為什麼會這樣,我該如何解決?
我需要使用萬用字元,因為我不想將參數從 shell 腳本傳遞到 shell 腳本,我希望它們能夠自給自足。
我正在使用 Ubuntu 並從預設終端 gnome-terminal 執行這些腳本。
bash 手冊在3.6 重定向部分中有這樣的說法:
在以下描述中,重定向運算符後面的單詞,除非另有說明,否則將進行大括號擴展、波浪號擴展、參數擴展、命令替換、算術擴展、引號刪除、文件名擴展和分詞。如果它擴展到多個單詞,Bash 會報告錯誤。
sh
不這樣做:來自POSIX shell 規範如果重定向運算符是“
<<
”或“<<-
”,$$ … $$. **對於其他重定向操作符,**重定向操作符後面的單詞應進行波浪號擴展、參數擴展、命令替換、算術擴展和引號刪除。**非互動式外殼不應對單詞執行路徑名擴展;**互動式外殼可以執行它,但只有在擴展會導致一個單詞時才會這樣做。
$ dash $ echo foo > * $ ls '*' README.md ...
$ bash $ echo bar >> * bash: *: ambiguous redirect