回答:
SmallLoanOf1Mの説明に夢中ではありません。技術的には正しいですが、質問の使用例と一致しない方法で回答します。
したがって、例として、質問からの2つの重要な違いの1つを次に示します。
ファイルの名前がシェルによって解析される文字で指定されている場合はどうなりますか?特に、実行中のコマンドによって解釈される文字に関して。
具体的には、「ダッシュ」文字:「-」。しかし、他の文字はシェルにとって意味があります。
例。ファイルの名前は「-dingle」です
ファイルをリストしてみてください:
ls -dingle
# ls -dingle
ls: invalid option -- 'e'
さらに悪いことに、ファイルの名前が「-rf rmbomb *
」の場合はどうなりますか?今それを削除してみてください
rm "-rf rmbomb *"
私もその例を実行しようとはしていませんが、うまくいけばあなたはアイデアを得るでしょう。
それでは、どのようにしてダッシュで始まるファイルをリストしますか?./
前で使用します。
# ls ./-dingle
./-dingle
同上 rm
ls \-dingle
またはls \-rf\ rmbomb\ \*
。これは./
、名前の前に指定すると./
。の後の文字がエスケープされないため、指定されたコマンドセットの少なくとも一貫性を確保するための良い方法です。
rm "-rf rmbomb *"
する代わりに、実際に何か悪いことをするように聞こえrm
ます。ファイル名の引用を忘れた場合にのみ危険であるため、単語分割が発生します。(特に、rm $file
代わりに実行するシェルスクリプトrm "$file"
内。ただし、その場合、*
glob展開は変数展開の内容に対して行われないため、展開されません。それが必要な場合は、eval
。が必要です。)とにかく、スクリプトがrmに渡す前にファイル名を単語分割する場合は、というファイルを作成するspace -rf .
ので、rm ./$i
助けにはなりません。
rm: invalid option -- ' '
、-rf
同じ引数の一部であるため、その後のスペースを1文字のスイッチとして解釈しようとしたときからです。(そして、はい、私は何かを見落としていただけの場合には空のディレクトリ内にこれを実行し、それが実際に危険だった:P)
IFS=''
し、-f
夫々 。まれな例は、実行する割り当てとして、ただし読み取るファイルとしてawk
フォームfoo=bar
を持つオペランド(スクリプトである最初のオペランド以外)を処理./foo=bar
することです。
はい。
file
コマンドラインで発行することにより、BASHは$ PATH環境変数でその名前のファイルを検索します。ファイルが$ PATH変数内のディレクトリにない限り、見つかりません。
.
現在のディレクトリを意味します。相対的な用語で、現在のディレクトリ内を./
意味します。これは、ディレクトリで作業中/home/sheogorath/shivering/isles.img
に呼び出すときのようなこと./isles.img
を言うことに相当し/home/sheogorath/shivering/
ます。
そのため、通常、作業ディレクトリ内のファイルを「インプレース」で実行するために使用されます。
編集:
あなたの例でls
は、シェルによって呼び出され、パス変数を使用して検出されています。その引数は、作業ディレクトリで処理されますが、それがどのようなものであってもかまいません。これはのデフォルトなので、両方とも現在のディレクトリを指すため、ls
指定file
と明示的な指定の間に違いはありません./file
。
すべてのコマンドが作業ディレクトリ内のファイルパスを受け入れるわけではなく、一部のコマンドは、設定によって事前に定義されているディレクトリ内のファイルを指定することを期待します。引数としてファイルを受け入れるコマンドの中で、これらのコマンドはあまり一般的ではありません
ls
し、元の質問で言及されたようなコマンドに続くファイル名引数とは何の関係もありません。すなわち、refferencing間よりの差である相対パス(現在の作業ディレクトリに対して)すなわち../../dir/filename
し、絶対パス /path/to/dir/filename
ls
それらは常に同じパスになり、一方が他方より明示的に指定されます。引数を処理するときにすべてのコマンドがこのように動作するわけではありませんが、ほとんどのコマンドはこのように動作します。