web-dev-qa-db-ja.com

出力リダイレクトで使用した場合、シェルスクリプトによって解釈されないワイルドカード

2つのスクリプトがあるとします。

  • 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

自宅に2つのログファイルが残っています。

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で実行すると、これらのワイルドカードは機能しません。

それはなぜですか、どうすればこれを修正できますか?

シェルスクリプトからシェルスクリプトに引数を渡したくないので、ワイルドカードを使用する必要があります。ワイルドカードは自給自足である必要があります。

私はUbuntuを使用しており、これらのスクリプトをデフォルトのターミナルであるgnome-terminalから実行しています。

2
tatsu

?ワイルドカードがシェル(sh)ではなくbash機能であるためだと思います。

実行してみてください

gnome-terminal --tab --active --title="script2" -- bash script2.sh

./script1.shを実行すると、デフォルトで1行目の指示に従ってbashが使用されます。ただし、sh script2.shを実行すると、シェルを使用してコマンドを解釈し、1行目の推奨を無視します。

2
AlexLoss

Bashマニュアルには、 .6リダイレクト セクションで次のように書かれています。

以下の説明でリダイレクト演算子に続く単語は、特に明記されていない限り、中括弧の展開、チルダの展開、パラメーターの展開、コマンド置換、算術展開、引用符の削除、ファイル名の展開、および単語分割。複数のWordに展開すると、Bashはエラーを報告します。

shはそれを行いません: POSIXシェル仕様 から

リダイレクト演算子が「<< "または" <<- "、[...]。他のリダイレクト演算子の場合、リダイレクト演算子に続く単語は、チルダ展開、パラメーター展開の対象になります。 、コマンド置換、算術展開、および引用符の削除。パス名の展開は、非対話型シェルによってWordで実行されないものとします;対話型シェルは実行できますただし、拡張によって1つの単語が生成される場合にのみ実行する必要があります。

$ dash
$ echo foo > *
$ ls
'*'  README.md  ...
$ bash
$ echo bar >> *
bash: *: ambiguous redirect
7
glenn jackman