bashスクリプトのユーザーに、ディレクトリパスを引数として渡すように依頼します。次のうちどれが良いプログラミング習慣ですか?
- ユーザーに末尾の/(スラッシュ)の入力を要求する
- ユーザーが末尾の/(スラッシュ)を入力しないことを要求する
ls -l dir
動作が異なることls -l dir/
ですdir
。
bashスクリプトのユーザーに、ディレクトリパスを引数として渡すように依頼します。次のうちどれが良いプログラミング習慣ですか?
ls -l dir
動作が異なることls -l dir/
ですdir
。
回答:
ベストプラクティスはどちらも想定しないことです。
パスビルダーユーティリティ/クラスにアクセスできる場合は、それらを使用します。そうでない場合は、どちらかの形式を受け入れて適切に動作するようにコードを記述します。
末尾にスラッシュを追加するかどうかを覚えておかなければならないことほど、ユーザーにとって煩わしいことはありません。
dirname
、basename
とreadlink
。非常に一般的な問題は${path##*/}
、の代わりにを使用することですbasename
が、パスが最後のパス要素の代わりに空の文字列を返すスラッシュで終わっている場合。
rsync
私はあなたを見ている)はさらに厄介です
${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))
明確にするために要旨で文書化しました:bashの末尾のスラッシュを追加または削除します
bashは複数のスラッシュを無視するので、ユーザーがパスの末尾にスラッシュを入力しなかったと想定して、スラッシュを自分で追加することができます。
cat /etc/hosts
同じです
cat /////etc//////////hosts
したがって、スクリプトは次のようになります。
echo -n "enter path: "
read path
if [ -f $path/myfile ]
then
echo "found myfile!"
else
echo "nope"
fi
ユーザーがパスの末尾に/を入力するかどうかを心配する必要はありません。
bash
動作ではありません。カーネルが行います。
rsync
末尾のの存在に応じて非常に重要な方法で異なる動作をすることに注意してください。/
したがって、一貫性のために正規化したい場合もあれば、ユーザーが言ったことを実装するためにきれいに通過したい場合もあります(彼らが話していることを知っていたrsync
)。