今日はシェルスクリプトを書いていました。
突然私に質問がありました。
cd /target_dir
どちらも機能するためですcd /target_dir/
。
シェルスクリプトのパス変数の末尾にスラッシュを追加する必要がありますか?
そうですLOG_PATH=/data/nginx/logs
。LOG_PATH=/data/nginx/logs/
Googleでおおよその検索をしましたが、これについての議論が見つかりませんでした。たぶん、あまりにも基本的なものですか?
今はどんなスタイルを選ぶべきか本当に悩みです。
しかし、私はLOG_PATH=/target_dir/
もう少しスタイルを好みます。
bashでオートコンプリートを実行すると、結果がスラッシュとして表示されるためです。
これについてどう思いますが、その理由は何ですか?
答え1
POSIXによると:
パス名の定義:
ファイルを識別するために使用される文字列です。オプションの開始があります<スラッシュ>文字の後にゼロ個以上のファイル名が続きます。<スラッシュ>数値。パス名には、オプションで 1 つ以上の末尾を含めることができます。<スラッシュ>数値。連続して何度も<スラッシュ>文字は同じと見なされます。<スラッシュ>、正確に2つの先行する場合を除いて<スラッシュ>数値。
答え2
安全のためにスラッシュを含めてください。これにより、パスを接続すると複数のスラッシュが発生する可能性がありますが、少なくとも問題は回避されます。
いくつかの例:rsync
末尾のスラッシュが含まれている場合は、パスを別の方法で処理します(同期化)。それ別のサブディレクトリを作成する代わりにディレクトリ)。ディレクトリへのシンボリックリンクは、後にスラッシュがない場合に予期しない方法で動作することがあります。少なくともシェル完成はめちゃくちゃになります。呼び出すコマンド/スクリプトにスラッシュチェックに依存する特別な動作があるかどうかはわかりません。上書きを防ぐこともできます。たとえば、というファイルがあるのにfoo
ディレクトリだと間違って考えてその中に何かを移動したい場合は、mv bar foo
ファイルを上書きしますが(データ損失、潜在的な災害)、mv bar foo/
不平を言って何もしません。
要約すると、ほとんどの場合は重要ではありませんが、スラッシュを使用して自分自身を保護し、スクリプトで実行したいことを人間の読者に明確に伝える必要があります。変数がスラッシュで終わる場合、一般の観察者はそれがディレクトリを参照し、変更が必要な場合はそれを正しく使用することをすぐに判断します。
答え3
いいえ、これはできません。不要なスラッシュ(/
)を追加します。
はい
bin
Javaディレクトリを変数としてエクスポートしたいとしますPATH
。
export PATH=$PATH:/opt/jre1.7.0_45/bin/
すぐに確認してください。
user@host:~$ which java
/opt/jre1.7.0_45/bin//java
javaの前に追加のスラッシュ()があることに注意してください/
。幸いなことに、この場合にのみ機能します。