스크립트에서 위치 매개변수를 인쇄할 수 없습니다.

스크립트에서 위치 매개변수를 인쇄할 수 없습니다.

나는 그것을 사용하고 있다이 방법Gnome 터미널 창을 열고 다음 명령을 실행합니다. 이 경우 간단한 알림 메시지를 보냅니다(예약됨 at).

#!/bin/sh
gnome-terminal -- /bin/sh -c 'echo "remember: $1"; exec bash'

쉘은 remember:문자열만 인쇄하고, remind.sh "pick up the package"또는 를 실행할 때와 같이 내가 지정한 값은 인쇄하지 않습니다 remind.sh "buy groceries X and Y".

스크립트를 핵심까지 제거하면 모든 것이 예상대로 작동합니다(물론 전경에 아무것도 표시되지 않으므로 cron 또는 systemd를 통한 자동화에는 쓸모가 없습니다).

#!/bin/sh
echo "remember: $1"

답변1

분석하다

gnome-terminal귀하(또는 귀하의 경우)가 제공하는 코드는 /bin/sh -c코드 뒤에 제공된 위치 매개변수를 볼 수 있습니다. 예를 들어 이

gnome-terminal -- /bin/sh -c 'echo "remember: $1"; exec bash' zeroth first second …

인쇄됩니다 remember: first.

코드 뒤에 아무것도 제공하지 않으면 $1코드 가 최종적으로 해석될 때 빈 문자열로 확장됩니다( 뭔가 다르지만 여기서는 중요하지 않습니다). 그것이 당신이 그것을 얻는 이유입니다 . run by는 명시적으로 전달하지 않는 한 기본 스크립트의 위치 인수에 대해 아무것도 모릅니다.$2$3$0remember:/bin/shgnome-terminal


해결책

내부 코드의 위치 매개변수를 스크립트의 위치 매개변수로 채우려면 다음을 "$@"대신 사용하세요 first second ….

gnome-terminal -- /bin/sh -c 'echo "remember: $1"; exec bash' sh "$@"

원하는 것은 무엇이든 통과할 수 있습니다. 여기서는 모든 인수를 전달하지만( "$@"모든 위치 인수로 확장) 일반적으로 다음을 사용할 수 있습니다 "$1"(내부 코드가 첫 번째 인수를 알기를 원하는 경우)오직) 또는 "$2"(내부 코드를 보려면두번째기본 스크립트의 위치 매개변수는 다음과 같습니다.그것은 $1).


노트

  • sh0번째 매개변수는 다음과 같이 설명됩니다.의 두 번째 sh는 무엇입니까 sh -c 'some shell code' sh?

  • 원래 스크립트(즉 수정 사항 없음)에서 제공하려는 셸 코드가 sh -c큰따옴표로 묶인 경우 셸에서 해석된 스크립트가 확장되어 $1결과를 내부 코드에 포함합니다. 하지만 이러지 마세요.

    # 버기  
     그놈 터미널 -- /bin/sh -c "echo 'remember: $1'; exec bash"

    대부분의 경우 이는 예상대로 작동하지만 일반적으로는 그렇지 않습니다. 일반적으로 단점은 다음과 같습니다.포함시키다{}. 작은따옴표 코드 뒤에 매개변수가 오는 것이 올바른 접근 방식입니다.

  • 코드를 작은따옴표로 묶으면 있는 그대로 작동합니다 /bin/sh -c(내부 큰따옴표는 중요하지 않습니다.). 그러면 sh코드가 다음과 같이 표시됩니다.

    echo "remember: $1"; exec bash
    

    그리고큰 따옴표가 좋습니다$1여기.

관련 정보