Echo tailコマンドは予期しない出力を生成しますか?

Echo tailコマンドは予期しない出力を生成しますか?

このコマンドは、単独で実行されたときに予想される結果を生成します(crontabの最後の行)。

tail -n 1 /etc/crontab

ただし、結果をファイルに送信するためにechoコマンドの一部として実行すると、期待される結果とともに、作業ディレクトリ内のすべてのファイルの要約が追加されます。

sudo bash -c 'echo $(tail -n 1 /etc/crontab) > /path/to/file'

このコマンドが追加データを生成するのはなぜですか?

ベストアンサー1

crontab行*に「いつでも」を意味する1つ以上のアスタリスクがあります。コマンド置換で行を置き換えると、結果は次のようになります。

echo * * * * * cmd > /path/to/file

しかし、最大コマンド代替出力には追加の拡張は適用されません。パス名拡張はい(フィールド分割と同じ):

追加のチルダ拡張、パラメータ拡張、コマンド置換、または算術拡張のためにコマンド置換結果を処理しないでください。二重引用符内でコマンド置換が発生した場合、フィールドの分割とパス名拡張交換結果に対して実行しないでください。

パス名拡張は、すべてのエントリに一致*.txtする一致するファイル名(ワイルドカード)のリストに変わります*。最終的な結果は、*crontab行にリストされている作業ディレクトリのすべての(隠されていない)ファイル名を取得することです。


公開したコードがより複雑なコマンドを表す場合は、拡張を引用してこの問題を解決できます。

sudo bash -c 'echo "$(tail -n 1 /etc/crontab)" > /path/to/file'

しかし、はるかに即時のものは総損失ですecho

sudo bash -c 'tail -n 1 /etc/crontab > /path/to/file'

これは必要な操作を実行する必要があり、より簡単です(他の唯一の実質的な違いは、このバージョンで発生するフィールド分割を省略するため、スペースが縮小されないことです)。

おすすめ記事