bashスクリプトを介したscpは省略されたコマンドを許可しません。

bashスクリプトを介したscpは省略されたコマンドを許可しません。

scpシェルスクリプトを除く現在のディレクトリ内のすべてのファイルとディレクトリを送信するには、このコマンドを使用することを検討してください。

scp -r ./!(*.sh) [email protected]:~/

端末でこのコマンドを実行すると正常に動作します。 Bashスクリプトで同じコマンドを実行しようとしていますが、これを変更する必要があります。

scp -r ./!\(*.sh\) [email protected]:~/

ただし、このエラーが返されます。

./!(*.sh): No such file or directory

編集1 以下の完全な引用符を使用してください。

scp -r './!(*.sh)' [email protected]:~/

同じエラーを返します

編集2 完全なスクリプトは次のとおりです。

#!/bin/bash

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do
  DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
cd "${DIR}" || exit

echo -e "Sending all scripts to $1."
shopt -s extglob
scp -r -P $1 ./!\(*.sh\) [email protected]:$2
  • scp を別の関数にすると、次のように正規表現の問題が解決されます。
#!/bin/bash

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do
  DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
cd "${DIR}" || exit

run_scp() {
    scp -r -P $PORT $1 [email protected]:$TARGET_DIR
}

PORT=$1
TARGET_DIR=$2

echo -e "Sending all scripts to $PORT."
shopt -s extglob
run_scp ./!\(*.sh\)

ベストアンサー1

scpコマンドを実行する関数に正規表現を引数として渡すと、この問題は解決されます。一方、extglobパラメータを渡す前にオプションを設定する必要があります。

run_scp() {
    scp -r -P $PORT $1 [email protected]:$TARGET_DIR
}

PORT=$1
TARGET_DIR=$2

shopt -s extglob
run_scp ./!\(*.sh\)

おすすめ記事