`$1`과 대체 기본값을 사용하는 별칭은 인수와 대체 값을 인쇄합니다.

`$1`과 대체 기본값을 사용하는 별칭은 인수와 대체 값을 인쇄합니다.

$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.

  1. 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
    
    물론 변수도 인용해야 합니다.
  2. echo인수에 백슬래시가 포함되어 있으면 이상한 효과가 나타납니다.
    printf백슬래시도 처리할 수 있지만...
  3. ... 동작은 printf표준화되어 있지만 약 42가지 버전이 있습니다  echo.
  4. 이 연습에서 가장 중요한 점은 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

관련 정보