실행 권한이 설정되지 않은 bash 스크립트를 실행하려면 다음을 수행하십시오.
bash script.sh
bash
스크립트가 실행 가능하지 않고 올바른 인터프리터를 모른다면 대신 무엇을 사용해야 합니까? shebang 줄에서 인터프리터를 찾아서 스크립트를 실행하는 명령이 있습니까?
bash whatever
작동 한다면 왜 다른 것을 사용합니까? bash는 거의 모든 * ix 시스템에서 사용 가능하므로 왜 귀찮게
실행 권한이 설정되지 않은 bash 스크립트를 실행하려면 다음을 수행하십시오.
bash script.sh
bash
스크립트가 실행 가능하지 않고 올바른 인터프리터를 모른다면 대신 무엇을 사용해야 합니까? shebang 줄에서 인터프리터를 찾아서 스크립트를 실행하는 명령이 있습니까?
bash whatever
작동 한다면 왜 다른 것을 사용합니까? bash는 거의 모든 * ix 시스템에서 사용 가능하므로 왜 귀찮게
답변:
네. 이라고합니다 perl
:
perl foo.bash # works
perl foo.lua # works
perl foo.clisp # works
perl foo.csh # works
perl foo.php # works
perl foo.gnuplot # works (no arguments)
perl foo.pl # works (obviously)
perl foo.py # works
perl foo.sh # works
perl foo.tcl # works
perl foo.rb # works
perl foo.nodejs # works
perl foo.r # works
perl foo.oct # works
perl foo.csharp # works (no arguments)
는 IF
#!
라인은 단어 "펄"나 단어 "든지 indir"는이 이름을 딴 프로그램을 포함하지 않는#!
대신에 펄 인터프리터의 실행을. 이것은 약간 기괴하지만#!
, 프로그램이 SHELL이 / usr / bin / perl임을 알릴 수 있기 때문에 펄 이 아닌 기계를 사용하는 사람들에게 도움이되고 , Perl은 프로그램을 올바른 해석기에 전달합니다.
.js
도 작동합니까?
#!
. 나는 지금까지 몇 가지 더 보였고이 문제가 발생하지 않았습니다.
man perlrun
그것이 "약간 기괴하다"라는 것을 양적으로 인정하는 것을 좋아 한다 :). 나는 이것이 유닉스가 아닌 환경과 매우 오래된 버전의 유닉스를 목표로 한 호기심으로 취급되어야한다고 생각합니다 .
스크립트가 인터프리터에서 실행 된 경우 shebang 이 전혀 있는지 확신 할 수 없습니다 . 인터프리터에서 실행되는 스크립트는 오두막이 필요하지 않습니다 , 경우 코드를 실행하는 인터프리터를 호출합니다.
따라서 대답은 '아니오'입니다. 스크립트를 실행할 언어 (통역사)가 무엇인지 확실히 알 수있는 명령이 없습니다. 그러나 항상 스크립트 내부를 살펴보고 찾을 수있는 shebang이 있는지 확인할 수 있습니다.
한마디로 규칙 :
그러나 스크립트에 shebang이 없으면 스크립트 내부에 어떤 인터프리터를 사용할지 알려주는 (직접 *) 정보가 없습니다.
당신은 물론 항상하는 래퍼 스크립트를 작성할 수 시도 스크립트가 오두막을 가지고 있는지 확인하고 그에서 통역을 읽고, 그 후 발견 인터프리터에서 실행합니다.
예
#!/usr/bin/env python3
import subprocess
import sys
args = sys.argv[1:]; script = args[0]
try:
lang = open(script).readlines()[0].replace("#!", "").strip().split()[-1]
cmd = [lang, script]+args[1:]
subprocess.call(cmd)
except (PermissionError, FileNotFoundError, IndexError):
print("No valid shebang found")
그것은 다른 이름으로 저장 tryrun
에서 $PATH
(예를 들어 ~/bin
그것을 확인 존재, 로그 아웃 한 후 다시하지 않는 경우, 디렉토리를 만들) 실행 . 그런 다음 실행하십시오.
tryrun /path/to/nonexecutablescript
실행 불가능한 스크립트 python
와 bash
스크립트 에서 올바른 인터프리터를 호출 (테스트)했습니다 .
#!
하고 나머지를 사용하여 인터프리터를 호출합니다.PermissionError
또는 a가 발생 FileNotFoundError
합니다.확장 ( .sh
, .py
등) 리눅스에서 적절한 통역을 결정하는데 어떤 역할 무엇이든지를 연주되지 않습니다.
(* 물론 코드에서 구문을 결정하기 위해 "스마트"추측 알고리즘을 개발할 수 있습니다.)
다음과 같은 스크립트로이를 달성 할 수 있습니다.
#!/bin/bash
copy=/tmp/runner.$$
cp $1 ${copy}
chmod u+x ${copy}
${copy}
rm ${copy}
그러므로:
$ echo "echo hello" > myscript
$ ./myscript
bash: ./myscript: Permission denied
$ ./runscript myscript
hello
나는 이것을하지 않는 것이 좋습니다. 권한이 이유가 있습니다. 권한을 전복하는 프로그램입니다.
shebang 처리는 커널 함수 (Linux 소스 코드- fs/binfmt_script.c
)입니다. 기본적으로 스크립트를 직접 호출하는 프로세스는 다음에 대해 알지 못합니다 #!
. 커널은이를 사용하여 인터프리터를 시작해야합니다.