私たち全員が知っているように、文字(!)は予約されています。奇妙なことは、通常のユーザーには機能しますが、rootでは機能しないことです。問題を解決するためにいくつかの方法を試しましたが、成功しませんでした。これらをエスケープできるかどうかを知りたいです。文字。
私が実行したいコマンドは単純で、いくつかの特定のファイルを無視します。
mkdir --parents www/; mv !(init.sh|environment.sh|docs|www) $_
答え1
役割を避けることではありません!
。
シェルはksh
いくつかの拡張されたワイルドカードパターンを実装し、これが!(...|...|...)
その1つです。このパターンは、括弧内のパターンと一致しないすべての項目と一致します。
一部のシェルはワイルドカードパターンを使用できますksh
。たとえば、シェル()extglob
でシェルオプションを設定すると、シェル()でシェルオプションを設定するのとbash
同じように、これらの機能が有効になります。shopt -s extglob
KSH_GLOB
zsh
setopt KSH_GLOB
rootユーザーが使用しているシェルは明らかにksh
globbingパターンの使用をサポートしておらず、可能であるかどうかはわかりません(dash
つまり、シェルにはこの機能がありません)。一方、通常のユーザーは、実際のksh
シェルを実行したり、シェル初期化ファイルで正しいシェルオプションを明示的に有効にしたり、一部のサードパーティの拡張機能を使用して自動的にこれらのモードをデフォルトで有効にしたりするようです。シェルオプションはデフォルトで有効になっています。