$1
매개변수( )를 처리하고 매개변수가 제공되지 않으면 기본값으로 폴백할 수 있는 별칭을 만들고 싶습니다 . 예를 들어,
$ alias foo='NUM=${1:-42}; echo $NUM'
인수 없이 호출하면 내가 원하는 방식으로 작동합니다.
$ foo
42
그러나 매개변수를 사용하여 호출하면 내 값과 기본값이 인쇄됩니다.
$ foo 69
42 69
왜 이런 일이 일어나는지 이해할 수 없습니다. 올바르게 수행하는 방법은 무엇입니까? 이런 유형의 문제를 직접 디버깅하려면 어떻게 해야 합니까?
답변1
별칭은 또 다른 쉘 구문 해석 이전의 텍스트 대체일 뿐이므로 인수를 허용하지 않습니다. 따라서 다음과 같습니다.
foo 69
텍스트 foo
는 로 바뀌고 NUM=${1:-42}; echo $NUM
쉘은 결과 텍스트를 해석합니다.
NUM=${1:-42}; echo $NUM 69
$1
아직 설정이 안 됐으니까 그렇죠.NUM=42; echo 42 69
현재 셸에서 해석되고 인수를 사용하는 인라인 스크립트의 경우 다음을 사용하세요.기능대신에:
foo() {
NUM=${1-42}
printf '%s\n' "$NUM"
}
${1-42}
대신 여기서는 ${1:-42}
사용자가 호출할 때 빈 문자열이 할당될 것으로 foo ''
예상한다고 가정합니다 .$NUM
답변2
이런 유형의 문제를 직접 디버깅하려면 어떻게 해야 합니까?
표준 조사 단계는 정확히 무슨 일이 일어났는지 파악하기 위해 드릴다운하는 것입니다.
$ alias foo='NUM=${1:-42}; echo $NUM'
$ foo 69
42 69
$ echo "$NUM"
42
별칭을 echo 로 정의했더라도 $NUM
이 작업은 직접 수동으로 수행해야 합니다. 위에 표시된 설정 NUM
은 42입니다. 이는 별칭의 "69" 매개변수가 foo
할당과 상호 작용하지 않는다는 단서를 제공할 수 있습니다 NUM=
. (명백한?) 결론은 이것이 에만 영향을 미친다는 것입니다 echo
.
echo
몇 가지 일반적인 조언은 지원을 피하라는 것입니다 printf
.
echo
첫 번째 인수가 하이픈('-
'), 변수에서 나온 경우에도 마찬가지입니다.
물론 변수도 인용해야 합니다.$ NUM="In a perfect world..." $ echo $NUM; echo ABC In a perfect world... ABC $ NUM="-n a perfect world..." $ echo $NUM; echo ABC a perfect world...ABC
echo
인수에 백슬래시가 포함되어 있으면 이상한 효과가 나타납니다.
printf
백슬래시도 처리할 수 있지만...- ... 동작은
printf
표준화되어 있지만 약 42가지 버전이 있습니다echo
. - 이 연습에서 가장 중요한 점은
echo
인수 간의 경계가 명시되어 있지 않다는 것입니다. 동일한 출력을 생성합니다echo Super User
.echo "Super User"
그러니 이것을 시도해 보세요:
$ alias foop='NUM=${1:-42}; printf "[%s]\n" $NUM'
$ foop
[42]
$ foop 69
[42]
[69]
$ foop The quick brown fox
[42]
[The]
[quick]
[brown]
[fox]
이렇게 하면 매개변수가 별칭 끝에 적용되고 할당과 얽히지 않는다는 것이 매우 명확해집니다. 또한 별칭에 대한 코드는 첫 번째 인수만 보는 것이 아닙니다.
이제 별칭을 제어할 수 없다는 점을 이해했으므로 값이 어디서 오는지 $1
궁금할 것입니다 . NUM
문제를 완전히 진단하기 전에 이에 대해 생각해 보기를 기대하는 것이 합리적인지는 모르겠지만,
$ set Once upon a midnight dreary
$ foo
Once
$ echo "$NUM"
Once
$1
별칭 정의는 별칭 호출에 전달된 인수가 아니라 셸의 기존 인수 목록을 보고 있다는 점을 명확히 해야 합니다 .
답변3
별칭에 함수 사용:
$ alias foo='function foo { NUM=${1:-42}; echo $NUM; }; foo'
$ foo
42
$ foo 69
69