私はそれが\
エスケープ文字であることを知っていますが、\
bashに書くと、次のようなものが表示されます。
System-Product-Name:~$ \
>
それでは、bashはいくつかの指示を待っていますか?私が使うとき
System-Product-Name:~$ \
> ls
これは仕事です。しかし、私が使うとき
System-Product-Name:~$ cd Wideo \
> ls
bash: cd: too many arguments
それでは、バックスラッシュはパイプのように動作しますか|
?私はそうは思わない。
このコマンドを使用するとき:
find . -name "FILENAME" -exec rm {} \;
なぜ終了するのですか?このコマンドは、find
正しいファイルを見つけて、そのファイルが見つかったパスexec
から削除するようです。これがなければ、私が受け取った情報は-exec
根拠がなく理解できません。なぜ使用できないのですか?
find . -name "FILENAME" -exec rm {}
?
私はman findのexecに関する情報だけを持っています。
execは、-exec、-execdir、-ok、および-okdirに関連する診断情報を表示します。
それでは、execを使用するときになぜ終了するのですか?たとえば、私が使うとき
find . -name "FILENAME"
終了する必要はありません。
答え1
\
「この行は行の終わりではありません。この行は次の行に続きます」(コマンドにはcd
2つの引数が多すぎます)を意味する行の終わりと、次の行を\
防ぐ行の内側とを区別する必要があります。特別な意味を持つキャラクター。
次に、\;
あなたの例では、find
リテラルを;
引数として提供することを意味します。それ以外の場合、これは\
シェルに特別な意味を持ち、1つのコマンドと次のコマンドの間の区切り文字として使用されます。;
find
このパラメーターはオプションと一緒に使用するときに必要なので、付属の;
コマンドが終わる場所を知ることができます。別のオプションは2つのパラメータの合計です。詳しくはマニュアルをお読みください。find
-exec
find
-exec
{}
+
find(1)
答え2
このように使用される\文字はしばしば次の文字を「エスケープする」と呼ばれるため、bashは次の文字の特別な意味を取り除き、それをbashコマンドライン処理の一部ではなくリテラル文字として扱います。バラよりhttps://stackoverflow.com/a/3871336/1663987bashのマニュアルやその他の情報を参照してください。
だから
find . -name "FILENAME" -exec rm {} \;
bashコマンド間の区切り文字として扱うのではなく、findコマンド引数にリテラルセミコロンを挿入するようにbashに指示します(ala echo hello; echo world
)。
~のため
ls some\ file
ls 引数を区切る文字ではなく、ファイル名の一部としてスペースを処理するように bash に指示します。したがって、使用されているように、「some」と「file」という2つの異なるファイルの代わりls
に、「some file」という単一のファイルの出力が表示されます。ls some file
~のため
cd Wideo \
> ls
改行文字をコマンドの終わりとして扱うのではなく、引数を探すように bash に指示するので、コマンドは次のように表示されますcd Wideo ls
。この効果をしばしば行連続と呼びます。
答え3
「Bash では」改行文字をエスケープします。 findではエスケープされます;
。
通常、と入力すると、Enter
シェルはそれをコマンドの最後に読み込みます。\Enter
文字通り新しい行に解釈すると。
ここでパズルの2番目の部分は、コマンドと引数に改行文字を含めることができることを認識することです。できないというルールはありません。ほとんどの人は不快なので使用を避けます。
ただし、以下は有効なファイル名とls
有効なcd
引数です。
foo
bar
ただ入力することはできません。
cd foo
bar
シェルで試してcd foo
から実行しますbar
。しかし、できることが必要です。
cd 'foo
bar'
これにより、find
次の構文が得られますfind -exec some_command
。some_command
スペースが含まれる可能性があるため、コマンドが終了する場所を見つけるためにfind
検索が実行されます。;
と入力すると、find -exec bar ;
bashは呼び出しが;
終わったと思うので、find
単にfindに渡されます-exec bar
。
リテラル文字を意味するとシェルに知らせる必要があります;
。\;
、またはを使用してこれを行うことができますfind -exec bar ';'
。man find
説明する:
find の次の引数は、すべて ';' で構成される引数が表示されるまでコマンドの引数として扱われます。
これは、パラメータが;
コマンドの後に来なければならないことを意味します-exec
。