테스트 실행 및 실행 옵션이 포함된 Bash 기능

테스트 실행 및 실행 옵션이 포함된 Bash 기능

옵션 및 옵션 rsync과 함께 작동하는 실행용 bash 함수를 작성 중입니다 . 몇 가지 중요한 개선과 추가 검사가 필요합니다.--dry-run--exec

--dry-run사용자 사양의 경우 아마도 별 의미가 없을 것입니다 --exec. 어쨌든 --dry-run을 사용하겠습니다.

다음 설정이 시작되었습니다.

다음 전화

filetr-archive -n -s bkscan -d temp

명령 실행

rsync -av --progress --dry-run --log-file=temp/bkscan.log bkscan temp

이렇게 하면 temp/bkscan.log파일의 내용이

2021/07/19 23:55:15 [19947] building file list
2021/07/19 23:55:15 [19947] cd+++++++++ bkscan/
2021/07/19 23:55:15 [19947] sent 273 bytes  received 56 bytes  658.00 bytes/sec
2021/07/19 23:55:15 [19947] total size is 108,837,826  speedup is 330,814.06 (DRY RUN)

그러나 rsync다음도 생성되지만 저장되지는 ​​않습니다. rsync터미널에 표시된 출력이 유용합니까? 정보를 저장할 수도 있습니다. 하지만 어떻게 할 수 있는지 알고 싶습니다.

  bkscan temp
sending incremental file list
bkscan/
bkscan/BkScan.aux
bkscan/BkScan.cp
bkscan/BkScan.fn
bkscan/BkScan.ky
bkscan/BkScan.log
bkscan/BkScan.pdf
bkscan/BkScan.pg
bkscan/BkScan.texi
bkscan/BkScan.texi~
bkscan/BkScan.tp
bkscan/BkScan.vr
bkscan/BookScan.texi~

sent 273 bytes  received 56 bytes  658.00 bytes/sec
total size is 108,837,826  speedup is 330,814.06 (DRY RUN)

filetr-archive ()
{
  # Process command line options
  shortopts="nel:s:d:"
  longopts="dry-run,exec,log:,source:,destin:"
  opts=$(getopt -o "$shortopts" -l "$longopts"  \
        -n "$(basename $0)" -- "$@")
  if [ $? -eq 0 ]; then
    eval "set -- ${opts}"
    while [ $# -gt 0 ]; do
      case "$1" in
      -n|--dry-run)
        shift 1
        local -r dryrun=1
        ;;
      -e|--exec)
        shift 1
        local -r exec=1
        ;;
      -l|--log)
        local logfl=$2
        shift 2
        ;;
      -s|--source)
        local source=$2
        shift 2
        ;;
      -d|--destin)
        local destin=$2
        shift 2
        ;;
      --)
        shift;  break  ;;
      esac
    done
  else
    shorthelp=1 # getopt returned (and reported) an error.
  fi

  if (( filetr_dryrun == 1 )); then 

    echo "rsync -av --progress --log-file=$logfl --dry-run"
    echo "  $source $destin"
    rsync -av --progress --log-file=$logfl --dry-run $source $destin

  elif (( filetr_exec == 1 )); then
      
    # use rsync archive option -a (equivalent to -rlptgoD)
    echo "rsync -av --progress --log-file=$logfl $source $destin"
    # rsync -av --progress --log-file=$logfl $source $destin

  else

    echo "rsync -av --progress --log-file=$logfl $source $destin"
      
  fi

답변1

rsync -av --progress --log-file=$logfl --dry-run $source $destin

이것필요큰따옴표(예: --log-file="$logfl" --dry-run "$source" "$destin"참조)언제 큰따옴표가 필요합니까?그리고http://mywiki.wooledge.org/WordSplitting

local logfl=$2

이것은 아마도 큰따옴표를 사용해야 할 것입니다. 단순 할당( 또는 다른 것이 logfl=$2없음 local)은 필요하지 않은 경우 중 하나이지만 , 등의 경우에는 local그렇게 export명확 readonly하지 않습니다. 문제가 발생하지 않도록 거기에 따옴표를 넣으십시오.

  if (( filetr_dryrun == 1 )); then 
    ...
    rsync -av --progress --log-file=$logfl --dry-run $source $destin
  elif (( filetr_exec == 1 )); then
    ...
    rsync -av --progress --log-file=$logfl $source $destin

-av여기에 코드를 복사하면 , --progress, $source, 모두 $destin두 브랜치에서 동일합니다. 이를 피하는 것이 가장 좋으며 Bash를 실행하고 있으므로 인수를 배열로 수집할 수 있습니다. 다음을 참조하세요.조건부로 인수를 스크립트에 전달

filetr-archive ()

대시는 Bash 및 Zsh에서 함수 이름의 일부이지만 Ksh 또는 Dash에서는 그렇지 않습니다. 따라서 이식성을 위해 밑줄을 사용하는 것이 더 합리적일 수 있습니다. 물론, 어쨌든 POSIX가 아닌 항목을 사용하고 있으므로 (( .. ))적어도 의식적으로 Dash를 무시하고 싶을 것입니다.

관련 정보