実行許可が設定されていないbashスクリプトを実行する場合、次の操作を実行できます。
bash script.sh
bash
スクリプトが実行可能でなく、正しいインタープリターがわからない場合、代わりに何を使用する必要がありますか?シェバン行からインタープリターを検索し、それを使用してスクリプトを実行するコマンドはありますか?
bash whatever
動作する場合、なぜ別のものを使用するのですか?bashは事実上すべての* ixシステムで使用できるため、わざわざ
実行許可が設定されていないbashスクリプトを実行する場合、次の操作を実行できます。
bash script.sh
bash
スクリプトが実行可能でなく、正しいインタープリターがわからない場合、代わりに何を使用する必要がありますか?シェバン行からインタープリターを検索し、それを使用してスクリプトを実行するコマンドはありますか?
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)
これはPerlのドキュメントに記載されています:
#!
行に「perl」という単語も「indir」という単語も含まれていない場合、#!
Perlインタプリタの代わりに「the」という名前のプログラムが実行されます。これは少し奇妙ですが#!
、SHELLが/ usr / bin / perlであることをプログラムに伝えることができ、Perlがプログラムを適切なインタープリターにディスパッチするため、そうしないマシンのユーザーを助けます。
.js
も機能しますか?
#!
。私は数人から数人になりましたが、この問題は発生していません。
man perlrun
、それが「ちょっと奇妙」だと認めるのが好きです:)。これは、非UNIX環境および非常に古いバージョンのUNIX を対象とした好奇心として扱われるべきだと思います。
スクリプトがインタプリタから実行された場合、あなたはそれがシェバングを持っていることを確認することはできませんすべてで。インタプリタから実行するスクリプトは、シェバングを必要としない、場合、あなたがコードを実行するインタプリタを呼び出します。
したがって、答えは「いいえ」です。スクリプトを実行する言語(インタープリター)を確実に確認するコマンドはありません。ただし、いつでもスクリプトの内部を調べて、調べるためのシバンがあるかどうかを確認できます。
要するにルール:
ただし、スクリプトにシバンがない場合は、使用するインタープリターを示す(直接*)情報がスクリプト内にありません。
あなたはもちろん、常にするラッパースクリプトを書くことができ試みるスクリプトがシェバングを持っているかどうかを確認し、そのから通訳を読んで、その後FOUNDインタプリタからそれを実行します。
例
#!/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
in として保存し$PATH
(たとえば~/bin
、ディレクトリが存在しない場合は作成し、ログアウトしてからログインし直します)、実行可能にします。次に実行します:
tryrun /path/to/nonexecutablescript
非実行可能ファイルpython
およびbash
スクリプトで正しいインタープリターを呼び出し(テスト済み)。
#!
、それを削除し、残りを使用してインタープリターを呼び出します。PermissionError
またはaを発生させFileNotFoundError
ます。拡張子(.sh
、.py
など)は、Linux上で適切な通訳を決定する際に何の役割を全く果たしません。
(*「スマート」推測アルゴリズムを開発して、コードから構文を決定することはもちろん可能です。)
次のようなスクリプトでこれを実現できます。
#!/bin/bash
copy=/tmp/runner.$$
cp $1 ${copy}
chmod u+x ${copy}
${copy}
rm ${copy}
副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example:
$ echo "echo hello" > myscript
$ ./myscript
bash: ./myscript: Permission denied
$ ./runscript myscript
hello
これをしないことをお勧めします。許可には理由があります。これは、権限を破壊するためのプログラムです。
シバン処理はカーネル関数であることに注意してください(Linuxソースコードでは- fs/binfmt_script.c
)。基本的に、スクリプトを直接呼び出すプロセスはそのことを知りません。#!
カーネルはそれを使用して、インタープリターを起動する必要があることを判断します。