Bash

與輸出重定向一起使用時,shell 腳本不會解釋萬用字元

  • June 23, 2020

假設我有兩個腳本:

  • 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

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