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\)

관련 정보