![스크립트에서 위치 매개변수를 인쇄할 수 없습니다.](https://linux55.com/image/206119/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EC%9C%84%EC%B9%98%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EB%A5%BC%20%EC%9D%B8%EC%87%84%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
나는 그것을 사용하고 있다이 방법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
$0
remember:
/bin/sh
gnome-terminal
해결책
내부 코드의 위치 매개변수를 스크립트의 위치 매개변수로 채우려면 다음을 "$@"
대신 사용하세요 first second …
.
gnome-terminal -- /bin/sh -c 'echo "remember: $1"; exec bash' sh "$@"
원하는 것은 무엇이든 통과할 수 있습니다. 여기서는 모든 인수를 전달하지만( "$@"
모든 위치 인수로 확장) 일반적으로 다음을 사용할 수 있습니다 "$1"
(내부 코드가 첫 번째 인수를 알기를 원하는 경우)오직) 또는 "$2"
(내부 코드를 보려면두번째기본 스크립트의 위치 매개변수는 다음과 같습니다.그것은 $1
).
노트
sh
0번째 매개변수는 다음과 같이 설명됩니다.의 두 번째 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
여기.