kshの逆引用符内の引用符

kshの逆引用符内の引用符

HP-UX Unixでは、次のコマンドを使用してファイルの現在の日付を取得しようとします。

$ ls -lrt ABC.LOG* |grep "`date +"%b %d"`"

ただし、エラーが発生します。

ksh: : cannot execute
grep: can't open %d

どんな提案がありますか?

答え1

エラーは、パラメータへの参照grepとバックティックがうまくネストされていないという事実で発生します。

grep "`date +"%b %d"`"

これは次のように書く方が良いです。

grep "`date +'%b %d'`"

...またはより良い、

grep "$(date +'%b %d')"

実際、$(...)内部二重引用符は保持できますが、逆引用符は保持できません。

grep "$(date +"%b %d")"

grep出力の別のオプションはls次のとおりです。

find . -type f -name "ABC.LOG*" -ctime -1

-type f現在のディレクトリで、指定されたパターンとctime()と一致する名前を持つすべての一般的なファイルを見つけます。現在時刻から24時間以内。ファイルのctimeは、ファイルデータまたはメタデータが最後に変更された時刻です。

しかし、それはあなたが達成したいものとまったく同じではありません。これはサブディレクトリでも繰り返されます。

答え2

Bourneシェルと同様に、Kornシェルでも引用符とバックティック(古代コマンドの代替形式)が一致しない可能性があるため、トルクナイザがバックティックの終わりを特定するのに役立ちます。バックティックの内部には別のレベルのバックスラッシュ処理があります。

echo "`date"

有効で、次のとおりです。

echo "`date`"
echo "$(date)"

そして:

echo `echo "foo`

有効で、次のとおりです。

echo `echo "foo"`
echo $(echo "foo")

これにより:

grep "`date +"%b %d"`"

これはgrep単語として処理され、次に"`date +"二重引用符で囲まれていないバックティックと二重引用符で囲まれていない他のバックティックに関連付けられます。そのように%b%d"`"

grep "$(date +)"%b %d"$()"

(何らかの理由を除いて、シェルはエラーを引き起こしたりecho "``"起こしたりしない場合でも、(ユーザーが作成したように)空の名前でコマンドを実行しようとします。echo "$()"echo "`"echo "$("")"

したがって、ここではパーサーを支援するためにバックスラッシュを使用する必要があります。

grep "`date +\"%b %d\"`"

これらのバックスラッシュは実際に削除されます。date +"%b %d"コマンド置換のサブシェルによって評価されます。

ここではksh閉じられていない引用符が許可されているため、実際にこれを行うこともできます。

grep "`date +\"%b %d"

(私はこれをお勧めしません)。

これは、次のようにネストされたバックティックを取得する方法でもあります。

echo "`echo \"\`echo \\\"a  b\\\"\`\"`"

この構文を使用する人がほとんどなく、新しい形式($(...)80年代初頭に導入された)を使用する良い例:ksh

echo "$(echo "$(echo "a  b")")"

ABC.LOG*これで、特定の質問に対して今日最後に変更された現在のディレクトリのファイルを一覧表示したいようです。これを行うには、次の操作を行います。

touch -t "$(date +%Y%m%d0000)" .start-of-day &&
  find . ! -name . -prune -name 'ABC.LOG.*' \
    -newer .start-of-day -type f -exec ls -lrtd {} + &&
  rm -f .start-of-day

答え3

このコマンドは結果を実行して渡すのfindではなく、正しいツールを使用して機能します。lsgrepls結果を解析しない

find /path/to/ -type f -name "ABC.LOG*$(date +"%b %d")*"

上記は今日の日付を救うことですファイル名、今日作成/変更されたファイルを探している場合は、find次のように使用できます(GNUバージョンfind):

find /path/to -type f -name "ABC.LOG*" -newermt 00:00

または過去24時間以内:

find /path/to -type f -name "ABC.LOG*" -newermt yesterday

または次のようになります。

find /path/to -type f -name "ABC.LOG*" -newermt "$(date +"%b %d")"

関連情報