sudo 소스: 명령을 찾을 수 없습니다

sudo 소스: 명령을 찾을 수 없습니다

이 프로그램을 루트로 실행하고 싶습니다. 가상 환경을 활성화하고 해당 가상 환경에서 Python 프로그램을 실행합니다.

프로그램은 다음과 같습니다

$cat myfile.sh
source /pathto/venv/bin/activate
python /pathto/rsseater.py

그냥 루트로 실행하면

$ sudo ./myfile.sh 
./myfile.sh: 2: ./myfile.sh: source: not found

내가 찾은이것sudo -s하지만 파일 맨 위에 추가하려고 하면 프롬프트가 # -으로 변경되는 것 같지만 Python이 예상대로 실행되지 않습니다. 파일 상단에 sudo -s가 있으면 프로그램이 무엇을 하고 있는지 잘 모르겠습니다.

이 프로그램을 루트로 실행하려면 어떻게 해야 합니까?

답변1

일반적으로 다음과 같이 스크립트 상단에 인터프리터에 대한 호출을 추가하려고 합니다.

$cat myfile.sh
#!/bin/bash

source /pathto/venv/bin/activate
python /pathto/rsseater.py

이것은 당신이 가지고 있는 것과 매우 비슷해 보일 수도 있지만 실제로는 매우 다릅니다. 귀하의 시나리오에서는 런타임에 호출되는 셸에서 명령을 실행하려고 합니다 sudo. 위의 예를 사용하면 #!/bin/bash호출 라인 뒤에 다양한 명령이 오는 별도의 Bash 쉘이 생성됩니다 . #!/bin/bash새로운 Bash 셸이 분기되도록 합니다.

통역사와 Shebang

명명법을 #!shebang이라고합니다. 당신은 할 수이 사이트의 다양한 Q&A를 통해 자세한 내용을 알아보세요.또한 약위키피디아. 그러나 이는 말하자면 주어진 파일이 "실행"(일명 실행)될 때 먼저 프로그램(인터프리터)이 디스크에서 로드된 다음 프로그램의 작업이 파일의 내용을 구문 분석하는 것이라고 시스템에 알려줍니다. 방금 처형되었습니다.

노트:기본적으로 shebang 라인 이후의 모든 것.

통역사

인터프리터는 한 번에 하나의 명령씩 파일을 처리할 수 있는 프로그램입니다. 이 예에서는 Bash 쉘을 인터프리터로 사용합니다. 그러나 여기서는 C 쉘이나 Korne 쉘 등과 같은 다른 쉘을 사용할 수도 있습니다.

Perl, Ruby 또는 Python과 같은 상위 수준 인터프리터를 동일한 방식으로 사용할 수도 있습니다.

"sudo -s"를 사용할 때 오류가 발생하는 이유는 무엇입니까?

매뉴얼 페이지를 보면 sudo다음과 같이 나와 있습니다 -s.

 -s [command]
            The -s (shell) option runs the shell specified by the SHELL 
            environment variable if it is set or the shell as specified in 
            the password database.  If a command is specified, it is passed
            to the shell for execution via the shell's -c option.  If no 
            command is specified, an interactive shell is executed.

따라서 이 명령을 실행하면 다음과 같습니다.

$ sudo -s ./myfile.sh

다음과 같은 일이 발생합니다.

$ /bin/sh
sh-4.2$ source somesource.bash 
sh: source: somesource.bash: file not found

쉘은 /bin/sh이 명령을 지원하지 않습니다 source.

관련 정보