명령에 절대 경로 옵션 추가

명령에 절대 경로 옵션 추가

쉘 명령("oldcommand"라고 부르겠습니다)이 주어지면 새로운 "-location" 옵션이 있다는 점을 제외하고 oldcommand와 동일하게 동작하는 간단한 쉘 스크립트 newcommand.sh가 있습니까?

  newcommand -location path -nonfileoption1 x1 -fileoption2 x2 -fileoption3 x3  -nonfileoption4 x4

실행됩니다

 oldcommand  -nonfileoption1 x1 -fileoption2 path/x2 -fileoption3 path/x3  -nonfileoption4 x4

답변1

처음에 하나의 옵션에만 관심이 있다면 이것은 단지 몇 줄의 스크립트에 불과합니다. 어디서나 옵션을 구문 분석하고 전달하려면 oldcommand몇 줄의 코드가 필요하며 어떤 옵션에 값이 있고 어떤 옵션에 값이 없는지 알아야 합니다.

~을 위한단순한사례,

#!/bin/sh
[ "$#" -gt 2 && "x$1" = "x-location" ] && cd $2 && shift 2 && exec oldcommand "$@"
newcommand "$@"

복잡한 경우에는 이 작업을 수행할 수 있는 것처럼 들립니다 getopt(이식 가능하지는 않음). 추가 자료:

OP와의 논의를 바탕으로 문제를 단순화하는 데 사용할 수 있는 패턴은 다음과 같습니다. "`-fileopt"로 시작하는 옵션에는 위치 옵션 값이 앞에 추가되어야 합니다. 따라서 (대신 실제 오류 검사는 없습니다.진짜경로 이름에 포함된 특수 문자 처리:

#!/bin/sh
PREP=
if [ "$#" -gt 2 ]
then
    PREP="$2/"
    shift 2
    ARGS=
    while [ "$#" != 0 ]
    do
        case "x$1" in
        (x-fileopt*)
            ARGS="$ARGS $1 ${PREP}$2"
            shift 2
            ;;
        (*)
            ARGS="$ARGS $1"
            shift 1
        esac
    done
    oldcommand $ARGS
else
    oldcommand "$@"
fi

답변2

이거 냄새 비슷한데XY 문제. oldcommand모든 상대 파일 이름을 다른 디렉토리에 상대적인 것으로 취급 하려면 현재 디렉토리를 변경하십시오!

(cd path && oldcommand  -nonfileoption1 x1 -fileoption2 x2 -fileoption3 x3  -nonfileoption4 x4)

대괄호는 디렉터리 변경이 로컬에서 이루어지도록 보장합니다. 다음 명령은 원래 디렉터리에서 실행됩니다.

스크립트로 패키징하려면 다음을 수행하세요.

#!/bin/sh
cd "$1" && shift && "$@"

용법:

run-in path oldcommand  -nonfileoption1 x1 -fileoption2 x2 -fileoption3 x3  -nonfileoption4 x4

그러나 명령줄 사용의 경우 임시 디렉터리 변경이 더 편리할 수 있습니다. 더 많은 입력이 필요하지만 즉시 파일 이름 완성이 가능합니다. (래퍼 스크립트 메소드가 작업을 수행하도록 할 수 있지만 run-in스크립트에 대한 완료 함수를 정의 해야 합니다 .)

cd path
oldcommand  -nonfileoption1 x1 -fileoption2 x2 -fileoption3 x3  -nonfileoption4 x4
cd -

또는

pushd path
oldcommand  -nonfileoption1 x1 -fileoption2 x2 -fileoption3 x3  -nonfileoption4 x4
popd

요청한 것과는 달리 path명령줄에 전달된 파일 이름뿐만 아니라 oldcommand내부적으로 사용되는 모든 상대 파일 이름도 에 상대적인 모든 파일 이름으로 만듭니다. 이는 또한 oldcommand다른 디렉토리 자체로 변경되지 않는다고 가정합니다. 많은 명령이 두 가지 가정을 모두 만족합니다.

답변3

opt()
    case ${1##*:*}:${#2} in
    (--:*) ! x=$((x-2))  ;;
    (-nonfileoption:[!0]*) p=;;
    (-fileoption:[!0]*)    p=\$2/;;
    (*:0)  eval $"{$x"':?Bad option::arg: "$1::$2"}';;
    (*)    eval $"{$((x-1))"':?Bad option: "$1"}'
    esac

[ " -location" = " $1" ] && x=2 parm= &&
while  [ "$#" -ge "$((x+=2))" ]
do     eval 'opt  "${'"$((x-1))"'}" "${'"$x}\"" ||
          until [ "$x" -eq "$#" ] && break 2
          do    parm=$parm' "${'$((x+=1))}\"
          done
       parm=$parm' "${'$((x-1))'}"  "'$p\${$x}\"
done&& eval "set -- $parm"

관련 정보