전체 경로가 포함된 매개변수를 사용하는 간단한 별칭을 만들려고 합니다.
명령줄에 를 입력하면 command "$(pwd)/my_file"
작동합니다. 그래서 다음을 통해 별칭을 만들어 보았습니다.
alias command='command "$(pwd)/$1"'
그러나 별칭은 작동하지 않습니다. CLI는 마치 별도의 매개변수인 것처럼 해석합니다 $(pwd)
. 이를 사용하여 명령을 단일 명령으로 변환해 my_file
보았습니다.eval
alias command="eval 'command' '$(pwd)/$1'"
하지만 초기 매개변수를 받아들이는 대신 입력 매개변수를 계속 기다리고 있습니다...
내가 의미하는 바를 시험해보고 싶다면 command
( evince
인기 PDF 뷰어)를 my_file
PDF 파일로 바꾸십시오. 그래서 내 별명은
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
(참조되지 않은 확장으로 인해 발생할 수 있는 모든 문제 포함)
대신 함수를 사용하세요.
바라보다: