Abgeschnitten
Nach diesem, das ich vor langer Zeit geschrieben habe.
Oh, ich werde das Verhalten unter Windows nicht ansprechen.
A
$ cat hoge.pl
#!/bin/bash
find . -type f | perl -x $0
exit 0
#!/usr/bin/env perl -ln
print ;
$ perl hoge.pl
./bar
./foo
./hoge
.
.
.
Wenn die Zeile #! Nicht die Wörter "perl" oder "indir" enthält, wird das nach #! Angegebene Programm anstelle des Perl-Interpreters ausgeführt. Das ist ein bisschen seltsam, aber es funktioniert für diejenigen, die eine Maschine verwenden, die # nicht kann!; Wenn Sie sagen, dass die SHELL, die Sie für Ihr Programm verwenden, / usr / bin / perl ist, dann ist Perl korrekt. Weil es den Dolmetscher startet. (Zitiert aus perlrun)
Mit anderen Worten
python
$ cat hoge.rb
#!/usr/bin/env ruby
puts("ruby")
$ perl hoge.rb
ruby
$ cat hoge.sh
#!/bin/bash
echo bash
$ perl hoge.sh
bash
Wenn das in der Befehlszeile angegebene Skript eine Datei ist, die mit "#!" Beginnt und die Zeile nicht die Zeichenfolge "ruby" enthält, wird die Zeile übersprungen. Wenn Sie in der folgenden Zeichenfolge eine Zeile finden, die die Zeichenfolge "ruby" enthält, führen Sie die Zeile unter dieser Zeile als Ruby-Skript aus. (Zitiert aus rdoc)
B
$ cat hoge2.sh
#!/bin/bash
echo bash
ruby -x $0
exit 0
#!/usr/bin/env ruby
puts("ruby")
Im Falle von,
python
$ ruby hoge2.sh
ruby
Wenn Sie den Schalter> -x angeben, sucht er zuerst nach einer Zeile, die die Zeichenfolgen #! Und "perl" enthält, und beginnt von dort aus mit dem Parsen. Dies ist nützlich, wenn Sie ein Programm in großen Text einbetten und ausführen möchten. (In diesem Fall sollte das Ende des Programms durch das Token END angezeigt werden.)
(Zitiert aus perlrun)
Für Ruby ist dasselbe in rdoc klar angegeben.
Daher gilt der Code von A.
sogar in Rubin B.
Führen Sie B mit Bash aus.
$ bash hoge2.sh
bash
ruby
Das kann man also auch sagen.
python
$ cat hoge3.sh
#!/bin/bash
echo bash
perl -x $0
ruby -x $0
exit 0
#!/usr/bin/env perl
print("perl\n") ;
__END__
#!/usr/bin/env ruby
puts("ruby")
__END__
Laufen Sie mit Bash
$ bash hoge3.sh
bash
perl
ruby
Laufen Sie mit Perl
$ perl hoge3.sh
bash
perl
ruby
Lauf mit Rubin
$ ruby hoge3.sh
ruby
Das habe ich geschrieben
Wenn Sie es noch einmal lesen, gibt es im Fall von Rubin keine Bedeutung für die Existenz von -x? Wofür ist es ... vielleicht für Windows ...
tsuiki.sh
#!/bin/bash
ruby -x $0
exit 0
#!/usr/bin/env ruby
puts("ruby")
^D #Steuerung+V, Contorol+Eingebettet in D.(Mac-Terminal)
puts("test")
$ bash tsuiki.sh
ruby
$ ruby tsuiki.sh
ruby
Im Fall von Python wird, obwohl es -x gibt, klar angegeben, dass "nur eine Zeile übersprungen wird", mit erheblichen Einschränkungen.
-x (Original) Überspringen Sie die erste Quellzeile, um #! Cmd im Nicht-Unix-Format zu verwenden. Dies gilt nur für DOS-Hacks. (Zitiert aus Dokument)
Wenn Sie es jedoch übertreiben,
$ cat hoge4.sh
find . -type f | python -x $0 ; exit 0
#!/usr/bin/env python
import sys
for line in sys.stdin:
print(line.strip())
Gleiches wie A.
$ bash hoge4.sh
./bar
./foo
./hoge
.
.
.
Es ist nicht unmöglich, so etwas zu tun.