ディレクトリ名の末尾にスラッシュを付けることは良い習慣ですか?


9

bashスクリプトのユーザーに、ディレクトリパスを引数として渡すように依頼します。次のうちどれが良いプログラミング習慣ですか?

  • ユーザーに末尾の/(スラッシュ)の入力を要求する
  • ユーザーが末尾の/(スラッシュ)を入力しないことを要求する

3
rsync末尾のの存在に応じて非常に重要な方法で異なる動作をすることに注意してください。/したがって、一貫性のために正規化したい場合もあれば、ユーザーが言ったことを実装するためにきれいに通過したい場合もあります(彼らが話していることを知っていたrsync)。
sh1 2013

最近私を驚かせたもう1つの問題は、ディレクトリへのシンボリックリンクの場合とls -l dir動作が異なることls -l dir/ですdir
Flimm 2013

回答:


27

ベストプラクティスはどちらも想定しないことです。

パスビルダーユーティリティ/クラスにアクセスできる場合は、それらを使用します。そうでない場合は、どちらかの形式を受け入れて適切に動作するようにコードを記述します。

末尾にスラッシュを追加するかどうかを覚えておかなければならないことほど、ユーザーにとって煩わしいことはありません。


6
当然の結果:常に、適切なコマンドラインツールでパスを解析- dirnamebasenamereadlink。非常に一般的な問題は${path##*/}、の代わりにを使用することですbasenameが、パスが最後のパス要素の代わりに空の文字列を返すスラッシュで終わっている場合。
l0b0 2011年

1
ユーティリティクラスを使用する場合は+1。ほとんどのフレームワークが今日簡単にそれを行うことができるときに、パスをアセンブルすることに関して、開発者がホイールを再発明するのを見た回数は言えません。
RationalGeek

1
また、特定の方法でこれを実行する必要があるアプリケーションがある場合、私は非常にイライラします。そして時々ユーザーはそのパスを書く方法を制御できない:彼らはそれを書くことがあるので、はい、彼らは末尾のスラッシュの有無にかかわらず書くことを選択します、しかしユーザーがTABを使用してオートコンプリートする場合、多くのシェルは末尾のスラッシュを置きます、それで、ユーザーにそれを削除することを要求するでしょうか?さらに、引数として渡されたディレクトリに末尾のスラッシュを置くと、アプリケーションの動作が異なる場合(さらに、rsync私はあなたを見ている)はさらに厄介です
CarlosCampderrósJun

私は最近、rsyncで使用するためにユーザー入力の末尾のスラッシュを検証する必要がありました(これはこれらのものに敏感であるため)。@ChrisFが述べたように、どちらも想定しないことをお勧めします。私はどちらも想定しない優雅な方法として次のことを思いつきました:${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))明確にするために要旨で文書化しました:bashの末尾のスラッシュを追加または削除します
John Mark Mitchell

10

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

ユーザーがパスの末尾に/を入力するかどうかを心配する必要はありません。


5
Nit:これはbash動作ではありません。カーネルが行います。
Blrfl 2011年

7

故ジョン・ポステルは、ここで適用されるRFC 760のセクション3.2でいくつかの素晴らしいアドバイスをしました:

一般に、実装は送信動作では保守的であり、受信動作では自由でなければなりません。つまり、整形式のデータグラムを送信するように注意する必要がありますが、解釈できるデータグラムはすべて受け入れる必要があります(たとえば、意味がまだ明確である技術的なエラーに反対しないでください)。


3

概念的には、スラッシュは名前の一部ではありません。スラッシュは名前の間の区切り文字にすぎません。私のホームディレクトリは/ home / stefan /ではなく、/ home / stefanです。

末尾のスラッシュが予想されない場合でも、ammoQで既に述べたように、スラッシュがあっても失敗しません。ただし、スラッシュを引用符で囲む必要がないため、名前と変数を簡単に結合できます。

a="/home"
b="stefan"

dir=$a/$b

0

ディレクトリに末尾のスラッシュを付けてはならないことを要求すると、コンソールでのインタラクティブな使用が非常に煩わしくなります。TABを使用した自動補完により、ディレクトリの末尾にスラッシュが自動的に追加されます。

したがって、ディレクトリが末尾のスラッシュで指定されることを許可する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.