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'
これはあなたが望むことをするはずであり、それも同様に単純です(他の唯一の重要な違いは、このバージョンでは本来なら発生するはずだったフィールド分割が省略されるため、スペースのランが折りたたまれないことです)。