コマンドは端末では機能しますが、bashスクリプトでは機能しません。

コマンドは端末では機能しますが、bashスクリプトでは機能しません。

「myfile」以外の現在のディレクトリのすべてのエントリを削除するには、次のようにします。

rm -r !("myfile")

cleanupしかし、スクリプト(と呼ばれる)に入れると、次のようになります。

#!/bin/bash
rm -r !("myfile")

私は得る:

pi@raspberrypi:~/tmp $ ./cleanup
./cleanup: line 2: syntax error near unexpected token `('
./cleanup: line 2: `rm -r !("file2")'

走れば

ps -p $$

私の端末がbashを使用しているのがわかります。

 PID TTY          TIME CMD
1345 pts/3    00:00:02 bash

だから問題が何であるかよくわかりません。


メモ:

  1. 私は気づいたもしスクリプトは実際に動作し、それ自体が削除されます。したがって、私のスクリプトは実際には次のように見えますが、rm -r !("cleanup"|"myfile")エラーメッセージは同じです。
  2. ブロック引用符が示すように、これはDebianベースのRaspbianオペレーティングシステム(9-stretch)です。
  3. この質問は重複しているようですが、見つかりませんでした。似た名前があります。質問しかし、変数の継承に関するものなので、問題は解決されません。

ベストアンサー1

パターンは!(pattern-list)グローバル拡張。多くのディストリビューションでは、対話型シェルではこれを有効にしますが、非対話型シェルでは有効にしません。確認できます

$ shopt extglob
extglob         on
$ bash -c 'shopt extglob'
extglob         off

スクリプトを変更するには、スクリプトを有効にする必要があります。

shopt -s extglob

その始めに。

おすすめ記事