「Linuxコマンドラインブック」を読んで次の行の連続文字を見つけましたが、なぜこの文字をfindコマンドで使用するのか混乱しています。
find playground \
\( \
-type f \
-not -perm 0600 \
-exec chmod 0600 {} \; \
\) \
-or \
\(
other options...
\)
そしてif文と一緒に使用するとどうでしょうか?
if [ $x -eq 5 ]; then
echo "x equals 5."
else
echo "x does not equal 5."
fi
答え1
簡単な答えは前者が必要で、後者は必要ないからです。
コマンドfind
は一つ他のいくつかのパラメータが必要で、独自の構造を持つ単純なシェルコマンドです。これらの引数はシェルには意味がないため、(
間に論理接続があることはまったくわかりません)
。完全なコマンドは一行に書くことができますが、読みにくくなります。
行の連続がない場合、デフォルトの印刷find
ジョブはrunでplayground
あり、シェルは引数なしでコマンドを実行しようとします(またはエスケープを削除したい場合はサブシェルから(
)。-type
(
find playground
\(
-type f
...
一方、if
複合文はシェル構文の一部であり、シェルはどの部分が必要かを知っています。そして最後に、orの後にthen
コマンドが来なければなりません。構造全体を1行に書くこともできますが、前にセミコロンを追加する必要があります。 (セミコロンまたは改行文字も2つのコマンドで処理する必要があります。)else
fi
else
fi
echo foo; echo bar
答え2
これは特に複雑な例です。そのうちのいくつかは\
「行連続」と呼ばれますが、他の部分は保護文字用なので、シェルはこれを解釈せずに代わりに渡すので、シェルは、およびExistsを使用しますfind
。エスケープ文字を解釈せずにそのまま渡します。空白以外の文字の直前に来ない残りは、行連続信号です。\(
\)
\;
find
\
一般的に言えば、コマンドを破るには次のものが必要です。\
〜しない限りあなたはそのうちの1つを破った。「リスト終結者」数値。したがって、次のいずれかを切り捨てると、次は必要ありません\
。
; & && || | |& ;;
たとえば、次のようecho foo && echo bar
に書くことができます。
echo foo &&
echo bar
不要\
。または、次のように書くこともできます。
echo \
foo \
&&
echo \
bar
\
コマンドの終わりではなく、リストの終了者以外の場所で切り取るときにどのように使用するかをご覧ください。
他の場所に切り取りコマンドがある場合は必須です。その場所には切り取りコマンドがないため、例にそのコマンドを\
表示する必要はありません。各コマンドは独自の行にあるので大丈夫です。一つを壊したい場合は、次のものが必要です。\
if ... then ... else ...
\
一つ複数行のコマンドです。
@paul_pedantがコメントで正しく指摘したように、単一引用符を使用して次をエスケープすると、コマンドがより明確になる可能性がありますfind
。
find playground \
'(' \
-type f \
-not -perm 0600 \
-exec chmod 0600 {} ';' \
')' \
-or \
'('
other options...
')'