명령이 /bin/sh를 사용하여 실행될 것이라고 `at`에서 경고하는 이유는 무엇입니까? 다른 쉘을 원하면 어떻게 해야 합니까?

명령이 /bin/sh를 사용하여 실행될 것이라고 `at`에서 경고하는 이유는 무엇입니까? 다른 쉘을 원하면 어떻게 해야 합니까?

at내 스크립트에서 이것을 사용하여 인쇄하려고 합니다.

경고: 명령은 /bin/sh를 사용하여 실행됩니다.

원하는 경우 다른 쉘을 어떻게 사용합니까?

답변1

Linux에서는 즐겨 사용하는 셸이 아닌 at지정한 명령을 실행할 것이라는 경고가 항상 표시됩니다 . /bin/sh이 메시지는 숨길 수 없으며 소스 코드에 하드코딩되어 있습니다.

전달한 명령이 해석됩니다 /bin/sh. 원하는 경우 이 명령은 스크립트에 대한 경로가 될 수 있습니다. /bin/sh그러면 스크립트 프로그램이 실행되어 스크립트의 해석기가 스크립트를 시작하고 해석하게 됩니다. 스크립트의 언어는 이를 실행하는 프로그램과 완전히 독립적입니다. 따라서 예를 들어 bash 스크립트(예: 로 시작하는 스크립트)를 실행하려면 #!/bin/bash스크립트 경로를 at( echo /path/to/script | at 3:42)에 전달하고 관련 없는 메시지를 무시하세요.

답변2

스크립트를 변경하여 다른 쉘에서 실행할 수 있습니다셰르본. 몇 가지 일반적인 shebang 라인:

#!/bin/sh — Execute the file using sh, the Bourne shell, or a compatible shell
#!/bin/csh -f — Execute the file using csh, the C shell,
#!/usr/bin/perl -T — Execute using Perl with the option for taint checks
#!/usr/bin/php — Execute the file using the PHP command line interpreter
#!/usr/bin/python -O — Execute using Python with optimizations to code
#!/usr/bin/ruby — Execute using Ruby

주어진 시간에 스크립트를 실행하려면 다음을 추가하는 것이 좋습니다.예약 된 일들

예:

다음 줄은 자정, 오전 2시, 오전 4시, 오전 6시, 오전 8시 등 2시간마다 사용자 프로그램 test.pl(표면적으로는 Perl 스크립트)을 실행합니다.

0 */2 * * * /home/사용자 이름/test.pl

답변3

한 가지 옵션은 명령 자체를 bash에 전송되는 스크립트로 만드는 것입니다(다른 쉘의 예).

주문하다:

<<'EOD' at now
<<'BASH' /bin/bash -s -- test
echo "$BASH ::" "$@"
BASH
EOD

산출:

warning: commands will be executed using /bin/sh
job 148 at Sat Feb 13 00:24:00 2021

1에서)그런 다음 /bin/sh내부 명령을 사용하여 실행됩니다.

<<'BASH' /bin/bash -s -- test
echo "$BASH ::" "$@"
BASH

실행중인에코bash-shell 특정 $BASH변수 및 위치 인수 와 일치시험( /bin/bash다른 껍질의 예).

그게 다야.


하드 코딩된 오류 메시지를 표시하지 않으려면 복잡한 명령에 다음 접두사를 추가하세요.

2> >(sed '/warning: commands will be executed using \/bin\/sh/d' ) 

실행에 대한 경고만 제거 /bin/sh하고 다른 경고는 제거하지 않기 때문입니다.

주문하다:

2> >(sed '/warning: commands will be executed using \/bin\/sh/d' ) \
<<'EOD' at now
<<'BASH' /bin/bash -s -- test
echo "$BASH ::" "$@"
BASH
EOD

산출:

job 150 at Sat Feb 13 00:26:00 2021

답변4

이것존재하다명령은 다음을 사용합니다/bin/sh추가해도#!/bin/bash스크립트에. bash를 사용하려면 다음을 수행해야 합니다.

echo script.sh | at now+x minutes

이 경우 다음을 포함하면 bash가 사용됩니다.#!/bin/bash스크립트 상단에 있습니다.

또한 참고하시기 바랍니다/bin/sh심볼릭 링크가 다음과 같은 경우/bin/bash예를 들어, 이런 식으로 호출하면 bash와 정확히 동일하게 동작하지 않습니다. 따라서 스크립트가 bash 특정 기능을 사용하는 경우 다음과 같이 실행하면 오류가 발생합니다.

at -f script.sh now+x minutes

이러한 오류는 (로컬) 이메일을 확인할 때만 나타납니다. 대개/var/메일/사용자 이름센드메일 같은 게 있었다면. 이메일을 보낼 수 없는 경우존재하다출력과 오류는 삭제됩니다.

놓치기 쉽습니다. 스크립트를 수동으로 테스트하면 런타임을 사용하면 제대로 작동합니다.존재하다오류가 있을 수 있습니다. 왜냐하면 후자의 경우에는/bin/sh.

관련 정보