私はシェルスクリプトでこの行を理解しようとしています。私はこれがステートメントで見つかった場所$(..)
に出力を実行して挿入することを意味することを知っています。しかし、この括弧の間に何が起こりますか?これは何をしますか?以前の内容とはどのような関係がありますか?これは2行に分けられますか?一般と同じですか?..
$()
\ls
\
\\
\ls
ls
APPCLASSPATH=$CLASSPATH:$({ \
\ls -1 "$VOLTDB_VOLTDB"/voltdb-*.jar; \
\ls -1 "$VOLTDB_LIB"/*.jar; \
\ls -1 "$VOLTDB_LIB"/extension/*.jar; \
} 2> /dev/null | paste -sd ':' - )
答え1
3つのコマンドの出力は、それを値に結合するコマンドls
に渡されます。paste
$VOLTDB_VOLTDB"/voltdb-*.jar:$VOLTDB_LIB"/*.jar:$VOLTDB_LIB"/extension/*.jar
メモ:変数$VOLTDB_VOLTDB
sumが$VOLTDB_LIB
拡張され、各コマンドに1つのファイルよりも多くの値がある可能性がありますls
。*
そこに見えますか?これは、左(voltdb-)と右(.jar)の間のすべての項目に展開されるワイルドカードです。
これは次のように一致します。
voltdb-1.jar
voltdb-blah.jar
voltdb-12345.jar
その後、すべてが変数に含まれますAPPCLASSPATH
。
APPCLASSPATH=$CLASSPATH:$VOLTDB_VOLTDB"/voltdb....etc.
貼り付けコマンド
seq
以下は、コマンドを使用して数値シーケンス 1-10 を生成する方法の例です。
$ seq 10 | paste -sd ':' -
1:2:3:4:5:6:7:8:9:10
paste
コマンドが出力をマージして:
コロン()で区切るのがわかります。
次のようにコマンド例を模倣することもできます。
$ { echo "hi1"; echo "hi2"; echo "hi3"; } | paste -sd ':' -
hi1:hi2:hi3
メモ:to -
the Pastコマンドは、STDINから入力を受け取り、入力された各パラメータを印刷するように指示します:
。
他のスイッチを介してデータの背後にある数字に基づいてデータをグループに分割するpaste
こともできます。-
貼り付けの例
以下は2の例です-
。
$ seq 10 | paste - -
1 2
3 4
5 6
7 8
9 10
これは3です-
。
$ seq 10 | paste - - -
1 2 3
4 5 6
7 8 9
10
paste
したがって、1行にいくつの引数を印刷する必要があるかを知らせます。paste
しかし、混同しないでください。作業中の例では、単にSTDINから入力を受け取り、各引数をスペースで区切って印刷します:
。 'が複数与えられたら、一度に2つの引数を許可するという-
意味です。paste
時間、一度に3人、ちょっと待ってください。
一度に2つのパラメータを:
「:」で区切ります。
$ seq 10 | paste -d ':' - -
1:2
3:4
5:6
7:8
9:10
$ seq 10 | paste -d ':' - - -
1:2:3
4:5:6
7:8:9
10::
ただし、スイッチを含めると、パラメータを順番に(シリアル)インポートするように-s
指示します。paste
上記の例のいずれかでこれを使用すると、何が起こるのかを見てください。
一度に2つ:
$ seq 10 | paste -sd ':' - -
1:2:3:4:5:6:7:8:9:10
一度に3つ:
$ seq 10 | paste -sd ':' - - -
1:2:3:4:5:6:7:8:9:10
答え2
$(command)
コマンドを実行して出力を置き換えます。
{ list; }
現在のシェル環境で複数のコマンドを実行するグループコマンドです。と似ています(list)
が、サブシェルを作成しません。
\command
コマンドの予想される動作を大幅に変更できるコマンドを無視するために使用されるエイリアス。
行の終わりは\
単に行が続くことを示すので、シェルは次の行を現在の行の一部と見なします。コンテキスト(開いている角かっこまたは引用符)で明白な場合は、通常必要ありません。
答え3
APPCLASSPATH=$CLASSPATH:$({ \ \ls -1 "$VOLTDB_VOLTDB"/voltdb-*.jar; \ \ls -1 "$VOLTDB_LIB"/*.jar; \ \ls -1 "$VOLTDB_LIB"/extension/*.jar; \ } 2> /dev/null | paste -sd ':' - )
\ls
ifに似ていますls
。ただし、ifls
はエイリアスで、バックスラッシュはエイリアスの拡張を防ぎます。これにより、ls
分類子サフィックス()などの不要な出力を追加できるエイリアスを使用する代わりに、コマンドが使用されます-F
。
これらのls
コマンドは、既存のファイル名を引数として使用して呼び出され、その引数を1行に1つずつリストします。-1
出力はls
端末ではなくパイプに送信されるため、このオプションは効果がありません。受け取った引数が既存のファイルの名前ではない場合、標準出力はls
エラーのみを出力します。コマンドのエラーはls
どこにでもリダイレクトされます2> /dev/null
。ファイルではなく引数を受け取る理由は2つありますls
。これは、変数の1つが読み取り可能な既存のディレクトリを参照していないか、ワイルドカードパターンと一致するファイルがない場合です。どちらの場合も、スキーマは拡張されていませんls
。
行末のバックスラッシュのため、シェルは次の改行文字を無視します。シェルは使用されるすべての点でオプションの改行文字を期待するので、ここではどちらも役に立ちません。
中かっこ { … } グループコマンド。複合コマンド{ \ls …; \ls …; \ls … ; }
はにパイプされpaste
、対応するエラーはにリダイレクトされます/dev/null
。
このpaste
コマンドはすべての入力行をまとめて接続します:
。最後にaを追加しtr '\n' :
ないことを除いて同じです。:
コマンドの置換$(…)
による出力は変数値の後にpaste
挿入され、2つの部分をコロンで区切ります。APPCLASSPATH
CLASSPATH
これは単純化されたバージョンです。一致するワイルドカードパターンがない場合は、追加の末尾のコロンがないという点で元のバージョンとは若干異なりますAPPCLASSPATH
(CLASSPATH
望ましい場合があります)。
APPCLASSPATH=$CLASSPATH:$(
\ls "$VOLTDB_VOLTDB"/voltdb-*.jar "$VOLTDB_LIB"/*.jar "$VOLTDB_LIB"/extension/*.jar |
tr '\n' :) 2>/dev/null
APPCLASSPATH=${APPCLASSPATH%:}