zsh でのパラメーター展開中に問題が発生しました。変数が引用符で囲まれています。
これが私のスクリプトです。(ノイズについてお詫びします。本当に重要なのは呼び出しの最後の行だけfind
ですが、コードの詳細を隠していないことを確認したかったのです)
#broken_links [-r|--recursive] [<path>]
# find links whose targets don't exist and print them. If <path> is given, look
# at that path for the links. Otherwise, the current directory is used is used.
# If --recursive is specified, look recursively through path.
broken_links () {
recurse=
search_path=$(pwd)
while test $# != 0
do
case "$1" in
-r|--recursive)
recurse=t
;;
*)
if test -d "$1"
then
search_path="$1"
else
echo "$1 not a valid path or option"
return 1
fi
;;
esac
shift
done
find $search_path ${recurse:--maxdepth 1} -type l ! -exec test -e {} \; -print
}
明確にするために、このfind
行では、次のようにしたいと思いrecurse
ます-maxdepth 1
。recurse
が に設定されている場合はt
、何も置換しません (つまり、通常の再帰動作である find を実行させます)。
これは単なる${name:-word}
形式ですが、word
実際にはハイフンで始まるため、一見すると奇妙に感じるかもしれません。(これについて詳しくは、http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansionを参照してください)
代わりに、recurse
が null の場合は置換され"-maxdepth 1"
(周囲の引用符に注意してください)、recurse
が設定されている場合は が置換され""
ます。
再帰しない場合の正確なエラーは です find: unknown predicate `-maxdepth 1'
。find "-maxdepth 1"
たとえば、次のように言うだけで、これを自分で試すことができます。再帰が必要な場合、何か奇妙なことが起こっています。うまく説明できませんが、エラーはfind `t': No such file or directory
.
zsh がこのパラメータ展開に引用符を置かないようにする方法を知っている人はいますか? ここが私の問題だと思います。
ありがとう。