特定のディレクトリに複数のフォルダを圧縮して、各フォルダのzipファイルを作成したいと思います。これを行うには、次のコマンドを使用します。
$ find -maxdepth 1 -mindepth 1 -type d | xargs -I@ zip -r @.zip @
これは期待どおりに機能します。
#
しかし、偶然、次の代わりに代替文字列として使用したときに予期しない動作が見つかりました@
。
$ find -maxdepth 1 -mindepth 1 -type d | xargs -I# zip -r #.zip #
zip error: Invalid command arguments (cannot write zip file to terminal)
zip error: Invalid command arguments (cannot write zip file to terminal)
... and so on (the same message repeated for every folder)
#
コメントは一般的にオンになっているので、ここに問題があることは明らかです。しかし、コマンドラインが実際になると思いましたfind -maxdepth 1 -mindepth 1 -type d | xargs -I
。なぜなら、最初の行から含めて、すべてがコメントで#
削除されたからです。
しかし、明らかにzip
命令を履行した。なぜ?
答え1
コメント(bash
シェル内)は役割によって紹介されます#
。ただし、これは#
文字が引用されず、単語の最初の文字(トークン)の場合にのみ発生します。
#
単語の最初の文字以外の文字として引用または発生した場合、コメントは導入されません。
比較する:
$ echo this is a #comment
this is a
$ echo this is not a#comment
this is not a#comment
$ echo not a '#comment'
not a #comment
対話型シェルでは、コメントは次のようになります。いいえinteractive_comments
シェルオプションがオフの場合(デフォルトではオン)、導入されます。
$ shopt -u interactive_comments
$ echo not a #comment
not a #comment