별칭이 위치 매개변수를 사용할 수 있나요? [복사]

별칭이 위치 매개변수를 사용할 수 있나요? [복사]

나는 다음과 같은 줄을 가지고 있습니다 .bashrc:

#!/usr/bin/env bash
alias see='nano --view $1'

그러나 이제 shellcheck우선순위가 높은 경고가 생성됩니다.

Alias는 위치 매개변수를 사용할 수 없으며 대신 기능을 사용합니다.

한 가지를 제외하고는 합리적입니다. 훌륭하게 작동합니다! 어떻게 되어가나요?

답변1

아니요, 아직 있어요일하다$1일반적으로 비어 있고 [1] 참조되지 않기 때문입니다 . 결과 명령 see foosee foo.

그러나 다음과 같이 인용하면 다음과 같습니다.

alias see='nano --view "$1"'

그것은 될 것입니다 see <empty> foo, 당신은새 버퍼를 제외 foo하고 nano.


[1] $1 다음으로 확장쉘의 첫 번째 위치 인수의 값이 무엇이든 간에- 대화형 쉘에서대개아무것도 없습니다(대화형 쉘은 일반적으로 위치 인수와 함께 호출되지 않기 때문입니다). 그러나 임의의 값으로 설정되는 것을 방지하는 것은 없습니다(예: 다음을 사용하여).set내장 케이스/ help set) - set -- foo bar; see baz예를 foo들어 다음이 열립니다 baz. (댓글에서 자유롭게 복사했습니다.@스틸드라이버왜냐하면 이것은 중요한 메모이기 때문입니다. )

그러니하지 마세요믿다항상 비어 있습니다.


다음을 시도해 볼 수도 있습니다.

$ alias e='echo @$1@'
$ e foo  <-- would become: echo @$1@ foo
@@ foo
|  |
|  +--- foo is next string
+------ $1 is empty

후드당신이 볼 것이라고 말하면 충분합니다그것은 마치:

execve("/bin/nano", ["nano", "--view", "foo"], 0xabc...)

인용된 버전의 경우:

execve("/bin/nano", ["nano", "--view", "", "foo"], 0xabc...)

주요 기능에서nano

int main(int argc, char *argv[])

argc,(매개변수 개수)는 각각 3과 4가 되고, argv,(매개변수 벡터/배열)은 대괄호 안의 문자열이 됩니다.


당신은 그것을 사용할 수 있습니다 :

alias see='nano --view'

그런 다음 다음 방법으로 발행하십시오.

$ see foo

foo$1(실제로는 아니지만 상대적 $1으로 말하면) 명령은 다음으로 확장됩니다.

nano --view foo

나노를 다음으로 제한해야 하는 경우오픈만 가능$1, (첫 번째 매개변수), 다음과 같은 이유로 함수가 필요합니다.

see foo bar

으로 확장될 예정입니다.nano --view foo bar

그런 다음 다음과 같은 것을 사용할 수 있습니다.

see() {
    nano --view "$1"
}

그러면 당신은 그럴 것이다버리다위의 매개변수 $1execve호출 시 항상 다음과 같습니다.

execve("/bin/nano", ["nano", "--view", "filename"], 0xabc...)

filename어디에 위치해 있습니까? $1​나노는bash 볼 수 없고 $1값만 볼 수 있습니다. Bash가 이 문제를 처리합니다.


쉘 함수를 사용할 때 매개변수는 위치 매개변수, $1, $2, $3, … 및기능이러한 항목에 액세스할 수 있습니다. 별칭은 함수로 간주되지 않으므로 이러한 매개변수에 액세스할 수 없거나 매개변수가 존재하지 않습니다.

노력하다:

alias p1='echo "$# $1 END"'
p2() { echo "$# $1 END"; }

결과:

$ p1 a b c
0  END a b c

$ p2 a b c
3 a END


일반적으로 Bash 매뉴얼에는 다음과 같이 명시되어 있습니다.

거의 모든 목적에서 셸 함수는 별칭보다 우수합니다.

그리고

csh에서처럼 대체 텍스트에 매개변수를 사용하는 메커니즘이 없습니다. 매개변수가 필요한 경우 쉘 함수를 사용해야 합니다(셸 함수 보기).


shellcheck그것을 적어보기 위해서는 ,SC2142의 위키 보기.

답변2

별명원하지 않는다인수를 허용하며 그대로 복사됩니다. 그들을~인 것 같다(가끔) 작동합니다 (다소). 그러나 그것은 진실이 아니다.

쉘 함수를 사용하십시오.

관련 정보