glob이 있는 변수를 기반으로 하는 스크립트에서 rm 또는 wget이 실패합니다.

glob이 있는 변수를 기반으로 하는 스크립트에서 rm 또는 wget이 실패합니다.

rm파일 이름 glob 또는 wget.

Ubuntu 16.04에서는 다음을 수행했습니다.

set -a
export drt="/var/www/html"
export pma="[pP][hH][pP][mM][yY][aA][dD][mM][iI][nN]"
set +a
echo $drt # Got the above.
echo $pma # Got the above.

그런 다음 실행 가능한 스크립트( ~/myScripts/tp_pma.sh)를 실행했습니다.

#!/bin/bash
rm -rf ${drt}/${pma}*
wget -P ${drt} https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip
unzip ${drt}/${pma}*.zip
mv ${drt}/${pma}*/ ${drt}/phpmyadmin/
rm ${drt}/${pma}*.zip

스크립트가 부분적으로 성공했습니다.

  1. 첫 번째 작업이 rm성공했을 수도 있고 아래 문제가 모두 발생했을 수도 있습니다.
  2. 부분적으로 성공했습니다 wget. 새 PMA 사본이 포함된 zip 파일이 drt.
  3. 작동했고 unzipzip의 압축이 풀렸고 최신 phpmyadmin 디렉토리를 얻었습니다.
  4. 실패했습니다 mv(아래 오류 참조). 디렉토리가 phpMyAdmin-4.7.7-all-languages내 홈 디렉토리에 남아 있기 때문에 예상한 대로 디렉토리가 로 이동되지도 않고 이름도 변경 drt되지 않습니다 .phpmyadmin
  5. 마지막 rm성공 - 내 홈 디렉토리에서 zip이 삭제되었습니다.

fr 오류가 발생하지 않습니다 wget.

그리고 pma왠지 값이 phpMyAdmin-4.7.7-all-languages. 나는 그것을 그 값으로 바꾸지 않았습니다.

여기서 무엇이 실패할 수 있으며 그 이유는 무엇입니까?

답변1

사용한 명령은 아카이브가 있는 위치가 아닌 실행 중인 디렉터리 unzip에 아카이브를 추출합니다 . unzip먼저 아카이브가 포함된 디렉터리로 변경하거나 다음을 사용할 수 있습니다.-d옵션:

[-d exdir]
파일을 추출할 선택적 디렉터리입니다. 기본적으로 모든 파일과 하위 디렉터리는 현재 디렉터리에 다시 생성됩니다.

아마도 chdir 옵션을 선택할 것입니다.

#!/bin/bash
cd "$drt"
rm -r ${pma}*
wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip
unzip phpMyAdmin-latest-all-languages.zip
mv ${pma}*/ phpmyadmin/
rm phpMyAdmin-latest-all-languages.zip

pma또한, "값이 어떻게든 변경되었습니다 " 라고 했을 때 phpMyAdmin-4.7.7-all-languages, 따옴표 없이 변수를 사용하면 파일명 패턴으로 사용되기 때문에, echo $pma*패턴과 일치하는 파일이 있으면 기존 파일의 이름이 표시되므로 주의하시기 바랍니다.

(대소문자 구분 모드가 필요한지 잘 모르겠습니다. 이름 형식이 에서 변경될 것으로 예상하는 현실적인 이유가 있습니까 phpMyAdmin? phpmyadmin)

답변2

대체 스크립트에 대한 제안:

#!/bin/sh -ex

destdir="/var/www/html/phpmyadmin"

tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT    # remove temporary directory on termination

wget -O "$tmpdir/archive.zip" \
    "https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip"

cd "$tmpdir" && {
    unzip archive.zip
    rm -f archive.zip

    # The only thing in the current (temporary) directory now is the
    # directory with the unpacked zip file.

    mkdir -p "$destdir"
    mv ./* "$destdir"/
}

아카이브가 이름이 지정된 하위 디렉토리로 추출되면 phpMyAdmin-4.7.7-all-languages스크립트는 /var/www/html/phpmyadmin아카이브의 내용을 에서 사용할 수 있도록 해당 아카이브를 이동합니다 /var/www/html/phpmyadmin/phpMyAdmin-4.7.7-all-languages.

-ex스크립트 만들기

  1. 유틸리티가 실패하면 종료( -e)
  2. 유용할 수 있는 추적 정보를 출력합니다( -x).

mv이 스크립트를 두 번 실행하면 동일한 이름의 디렉터리가 대상 위치에 이미 존재하기 때문에 마지막 실행이 실패하게 됩니다 . $destdir이 스크립트는 아래의 기존 디렉터리를 수정하지 않습니다.

스크립트가 완료되거나 오류와 함께 종료되거나 종료되면 스크립트는 다운로드한 아카이브를 저장하고 압축을 푸는 데 사용되는 임시 디렉터리를 삭제합니다.


이 스크립트의 루트 및 보안과 관련하여:

쓰기 위해 루트 권한이 필요한 경우 $tmpdir다음을 수행하십시오.아니요루트로 스크립트를 실행하세요! 대신 sudo마지막 항목 앞에 삽입됩니다 mv.

내가 아는 한 유일한 인수는 이고 어떤 -type 명령 $destdir에서도 사용되지 않으므로 실수로 삭제될 위험은 없습니다 . rm $var1/$var2*실제로 설정을 해제 $destdir하면 스크립트가 mkdir.

관련 정보