次の具体的な機能は何ですか?
newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
if expr "x${newProg}" : 'x/' >/dev/null; then
prog="${newProg}"
else
progdir=`dirname "${prog}"`
prog="${progdir}/${newProg}"
fi
答え1
これ最初回線使用量expr
到着する:
$newProg
値を次に変換します。基本正規表現.* -> \(.*\)$
(両端は固定されています。)ここ->
に何かがあります。newProg
元の値の一部として設定キャプチャサブ式と一致します。括弧内に記載(次の部分->
)。
常にキャプチャして出力する貪欲なマッチングセマンティクス最後->
このような一致なので、出力にaが絶対にないはずです。
たとえば、ls -l
ターゲットを見つけるためにシンボリックリンクの出力を解析します(正常に動作するファイル名などを提供し、一般的な警告を提供します)。
これ第二行は、expr
新しい値がnewProg
aで始まることを確認するために再利用されます/
。つまり、絶対パスを表します。
この場合、prog
その値に設定するだけです。それ以外の場合は、on(このコードでは定義されていない変数)を使用して計算された相対prog
パスに設定します。その効果は、おそらく元の場所に基づいてルートを構築することです。dirname
$prog
目標が単に純粋なPOSIXよりも強力なシェルまたは環境である場合、解析時間を節約するための非常に一般的なコマンドがexpr
あるかもしれません。readlink
ls