cd /u01/saddy | printf '%s\n' "XYZ.ABC.V.$(date -d '2020-06-14 +1 day' +%Y%m%d)"*.batch ;
putty
パスを介して上記のコマンドを実行すると、/u01/saddy
コマンドが正しく実行され、予想される出力が得られます。
XYZ.ABC.V.20200615180200.batch
ただし、自宅の場所でコマンドを実行しようとすると、コマンドは次のように出力を返します。
XYZ.ABC.V.20200615*.batch
場所にあるファイルは/u01/saddy
次のとおりです。
XYZ.ABC.V.20200615180200.batch,
XYZ.ABC.V.20200616190100.batch,
XYZ.ABC.V.20200617140200.batch.
答え1
cmd1 | cmd2
2つの異なるプロセスで同時に実行され、cmd1
出力cmd2
はcmd1
入力にパイプされます。cmd2
だから:
cd /some/dir | printf '%s\n' some-glob
あまり意味がありません。これは、他のプロセスからいくつかのグロブの拡張を印刷している間、いくつかの(一時的な)プロセスの現在の作業ディレクトリを変更します。
cd
の出力をに送信しますprintf
が、cd
最初は何も印刷せず、printf
入力はとにかく読み取られません。
おそらくあなたは次のことを意味します:
cd /some/dir && printf '%s\n' some-glob
つまり、シェルの作業ディレクトリを変更し、成功するとcd
globの拡張を印刷します。
または(cd
別のプロセスで実行され、printf
現在のディレクトリを変更した後に同じプロセスで呼び出される場合):
(cd /some/dir && printf '%s\n' some-glob)
((...)
サブシェル環境は通常サブシェルプロセスをフォークすることから始まり、環境への変更はcd
内部変更範囲に制限されます(...)
。)
またはソケットペア殻が少しあります。
²標準出力から何かを印刷できる唯一のケースは、設定時(または/一部のシェルを使用して)またはスラッシュなしで引数として渡す-
ときです。-<n>
+<n>
$CDPATH
答え2
「ホームポジション」にファイルの内容を表示していないが、パターンと一致するファイルが含まれていないようです。
XYZ.ABC.V.日時。一括
しかし、この場合、*
シェルはグローブを拡張せず、代わりに文字通りあなたの命令に従ってくださいprintf
。これがすぐに説明する出力文字列を取得する理由です。
これを避けたい場合は、設定を試してください。
shopt -s nullglob
その後、aを含む式が一致するものがない場合は、リテラルを含めるのではなく空の*
文字列に展開されます。*
cd
しかし、動作はコマンドが何の効果もない方法で使用されることを確認しました。もっと詳しく説明したいかもしれません。何コマンドを使用して実行しようとすると、貢献者がより良い解決策を見つけるのに役立ちます(たとえば、|
使用する理由に関する質問はすでにコメント)。