성공 후 두 폴더를 동기화하고 한 위치에서 다른 위치로 파일을 복사합니다.

성공 후 두 폴더를 동기화하고 한 위치에서 다른 위치로 파일을 복사합니다.

rsync 명령을 사용하여 두 폴더를 동기화하고 있으며 rysnc가 성공하면 파일을 성공적으로 복사하고 복사할 때 Success_FolderName과 같은 소스 폴더 이름 매개 변수를 추가하고 싶습니다. 저는 $(basename !:3)을 사용하여 폴더 이름인 세 번째 매개변수를 가져왔습니다.

bash /Sync.sh 10_03_2016

#! /bin/bash

set -o history
set -o histexpand
/usr/bin/rsync -avh -r /Source/$1 /Destination/
rsyncStatus=$?
folderParam=$(basename !:3)
if($rsyncStatus==0)
then
   cp /Status/Sucesss   /Result/Success_$folderParam
else
    cp /Status/Failure   /Result/Failure_$folderParam
if

산출

실수

/Sync.sh: line 7: :3: bad word specifier 

파일은 "Success_"로 복사됩니다.

답변1

왜 일을 그렇게 복잡하게 만드는지 이해가 안 돼요. !:N필요한 모든 것을 이미 매개변수로 전달하고 있는데 왜 (다소 까다로운) 기록 확장 기능을 사용합니까? 예를 들어:

#! /bin/bash

source="/Source/$1"
destination="Destination/"
folderParam="$(basename "$source")"
/usr/bin/rsync -avh -r "$source" "$destination"
rsyncStatus=$?
if($rsyncStatus==0)
then
   cp /Status/Sucesss   /Result/Success_"$folderParam"
else
    cp /Status/Failure   /Result/Failure_"$folderParam"
if

또는 더 간단하게:

#! /bin/bash

source="/Source/$1"
destination="Destination/"
folderParam="$(basename "$source")"
if /usr/bin/rsync -avh -r "$source" "$destination"; then
   cp /Status/Sucesss   /Result/Success_"$folderParam"
else
    cp /Status/Failure   /Result/Failure_"$folderParam"
if

심지어:

#! /bin/bash

source="/Source/$1"
destination="Destination/"
folderParam="$(basename "$source")"
touch "/Result/Failure_$folderParam"
/usr/bin/rsync -avh -r "$source" "$destination" && 
    mv /Result/Failure_"$folderParam" /Result/Success_"$folderParam"

답변2

특별한답변더 좋지만, 정말로 히스토리 연산자를 사용하고 싶다면 참조할 명령을 지정할 수 있습니다.

!rsync:3

rsync마지막 호출의 세 번째 매개변수 로 대체됩니다 . 그래서 당신에 관한 한,

folderParam=$(basename !rsync:3)

관련 정보