별칭에서 여러 매개변수를 평가하는 방법은 무엇입니까? [복사]

별칭에서 여러 매개변수를 평가하는 방법은 무엇입니까? [복사]

전체 경로가 포함된 매개변수를 사용하는 간단한 별칭을 만들려고 합니다.

명령줄에 를 입력하면 command "$(pwd)/my_file"작동합니다. 그래서 다음을 통해 별칭을 만들어 보았습니다.

alias command='command "$(pwd)/$1"'

그러나 별칭은 작동하지 않습니다. CLI는 마치 별도의 매개변수인 것처럼 해석합니다 $(pwd). 이를 사용하여 명령을 단일 명령으로 변환해 my_file보았습니다.eval

alias command="eval 'command' '$(pwd)/$1'"

하지만 초기 매개변수를 받아들이는 대신 입력 매개변수를 계속 기다리고 있습니다...

내가 의미하는 바를 시험해보고 싶다면 command( evince인기 PDF 뷰어)를 my_filePDF 파일로 바꾸십시오. 그래서 내 별명은

alias evince="evince $(pwd)/$1"

내가 아는 한, $(pwd)그렇습니다 /home/tapyu/Downloads/. 그리고 my_file그렇습니다 recap.pdf. 나는 evince가 두 개의 창을 팝업하기 때문에 이를 별도의 매개변수로 취급한다는 것을 알고 있습니다. 첫 번째 창은 recap.pdf올바르게 열립니다. 두 번째는 경고가 표시된 빈 창입니다."Error opening file, /home/tapyu/Downloads/ is a directory."

미리 감사드립니다.

추신: 저는 이 "질문"이 말이 되지 않는다는 것을 알고 있습니다. 내 질문은 "명령에 전체 경로를 제공하는 방법"이 아니라 "이 상황을 해결하기 위해 별칭의 입력 매개 변수를 처리하는 방법"입니다. 따라서 전체 경로를 제공하기 위해 대안을 사용하고 싶지 않은데 왜 내 별칭이 작동하지 않는지 궁금합니다.

답변1

첫 번째 문제는 별칭이 매개 변수를 사용하지 않는다는 것입니다. 매개변수를 별칭에 전달해야 하는 경우 이는 다음을 의미합니다.함수를 사용해야 합니다.. 다음 명령을 실행하면 어떤 일이 발생하는지 확인할 수 있습니다 set -x.

$ alias evince="evince $(pwd)/$1"
$ set -x
$ evince a.pdf
+ evince /home/terdon/foo/ a.pdf

보시다시피 명령은 evince a.pdf다음과 같습니다 evince /home/terdon/foo/ a.pdf(디렉토리에서 실행합니다 /home/terdon/foo/). 그래서 무슨 일이야? 귀하의 별칭이 실제로 무엇인지 확인하십시오.

$ type evince
evince is aliased to `evince /home/terdon/foo/'

set -x별칭을 실행하고 정의하면 이런 일이 발생하는 것을 볼 수도 있습니다.

$ alias evince="evince $(pwd)/$1"
++ pwd
+ alias 'evince=evince /home/terdon/foo/'

별칭을 정의하면 $1값이 없고 pwd별칭을 설정하기 전에 실행되므로 실제로 별칭을 으로 지정합니다 evince /home/terdon/foo/. 그런 다음 실행하면 evince a.pdf실제로 실행되므로 evince /home/terdon/foo/ a.pdf두 개의 창이 나타납니다.

함수는 다음과 같습니다:

evince(){
    command evince "$(pwd)"/"$1"
}

참고: 의 사용은 함수가 내부적으로 호출되도록 하는 command것입니다.evince주문하다 evince함수 자체가 재귀적이기보다는. 또한 이것은 evince foo그 자체와 정확히 동일하기 때문에 무의미한 예라는 점에 유의하십시오 evince $(pwd)foo. 파일이 현재 디렉터리에 있는 경우 파일의 전체 경로가 필요하지 않습니다.

답변2

별칭은 매개변수를 사용하지 않으며 단순한 텍스트 대체일 뿐입니다. (셸의 다른 모든 것과는 다릅니다.) $1별칭이 정의되거나 사용되는 컨텍스트의 첫 번째 위치 인수가 있습니다. 그러나 대화형 셸은 비어 있을 수 있습니다.


정확히 무슨 일이 일어나는지는 별칭을 정의할 때 사용하는 인용문에 따라 달라집니다.

당신이 가지고 있다면

alias evince="evince $(pwd)/$1"

확장 $(pwd)되고 $1즉시 확장됩니다(큰따옴표 안에 있기 때문입니다). $(pwd)이때 작업 디렉터리로 확장되며 $1현재 셸의 첫 번째 위치 인수(명령줄 인수)가 무엇이든 아무것도 없을 수 있습니다. 그래서 당신은 다음과 같은 것을 얻게 될 것입니다 :

alias evince="evince /some/path/"

그 후 evince foo.pdf실행

evince /some/path/ foo.pdf

실제로 두 가지 매개변수가 있습니다 evince.


반면에, 만약 당신이

alias evince='evince $(pwd)/$1'

확장하다아니요바로 확장하세요. 단, 별칭을 사용할 때만 가능합니다. 실행은 evince foo.pdf다음으로 확장됩니다.

evince $(pwd)/$1 foo.pdf

$(pwd)작업 디렉토리는 어디에 있나요지금이며 $1여전히 비어 있을 수 있는 쉘에 대한 첫 번째 위치 인수입니다. 당신은 다시 얻을

evince /current/path foo.pdf

(참조되지 않은 확장으로 인해 발생할 수 있는 모든 문제 포함)

대신 함수를 사용하세요.

바라보다:

관련 정보