alias -g '${1+"$@"}'='"$@"'、何をしますか?

alias -g '${1+"$@"}'='"$@"'、何をしますか?

ほとんどのメイクファイルにはこのような奇妙なシンボルセットがあります'${1+"$@"}'。 $ @はmakefileターゲットファイル名です。しかし、なぜ人々はこのような複雑なシンボルを使用しようとしますか'${1+"$@"}'

答え1

目的は${1+"$@"}携帯性です。

POSIXで定義された$@位置パラメータがない場合はnullに展開されます。ただし、元のBourneシェル(/bin/shSolaris 10以前)はそれを空の文字列に展開します""。 ifが設定されている場合にのみ拡張されるため、を使用することが${1+"$@"}この問題の解決策です。"$@"$1

残念ながら、この構成は3.xおよび4.3より前のzshバージョンでは機能しません。噴射を実行する${1+"$@"}shエミュレーションモード(分ける設定されています):

$ set -- '1 2'
$ for i in ${1+"$@"}; do echo $i; done
1
2

"$@"正しく処理されました:

$ set -- '1 2'
$ for i in "$@"; do echo $i; done
1 2

そのため、alias -g '${1+"$@"}'='"$@"'使用時に単語の分離を行わないでください${1+"$@"}。以前の拡張${1+"$@"}に置き換えられるため、zshで設定を使用できます"$@"(前後の単語文字ではなく文字列全体を使用する必要があります${1+"$@"})。


"$@"あなたができるもう1つのことは、次のことを確認して、位置引数がない場合は使用を完全に無視することです$#

case $# in
  (0) func ;;
  (*) func "$@" ;;
esac

より多くの作業が必要ですが、完全に移植可能です。

関連情報