나는 다음과 같은 줄을 가지고 있습니다 .bashrc
:
#!/usr/bin/env bash
alias see='nano --view $1'
그러나 이제 shellcheck
우선순위가 높은 경고가 생성됩니다.
Alias는 위치 매개변수를 사용할 수 없으며 대신 기능을 사용합니다.
한 가지를 제외하고는 합리적입니다. 훌륭하게 작동합니다! 어떻게 되어가나요?
답변1
아니요, 아직 있어요일하다$1
일반적으로 비어 있고 [1] 참조되지 않기 때문입니다 . 결과 명령 see foo
은 see 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"
}
그러면 당신은 그럴 것이다버리다위의 매개변수 $1
와 execve
호출 시 항상 다음과 같습니다.
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
별명원하지 않는다인수를 허용하며 그대로 복사됩니다. 그들을~인 것 같다(가끔) 작동합니다 (다소). 그러나 그것은 진실이 아니다.
쉘 함수를 사용하십시오.