No.5ベストアンサー
- 回答日時:
#!の次の文字列をプログラムと見なして、残りの文字列をそのプログラムへの第一引数として、ファイル名を第二引数としてプログラムを実行するというのはbash等のシェルの機能じゃなくてOSカーネルの機能です。
カーネルの機能のため、シェルのような複雑なコマンドライン解析機能は組み込まれていません。一行目が#!で始まらない実行可能ファイルをシェルから起動した場合、シェルスクリプトとして実行されるのでbashからbashスクリプトを実行するなら1行目からいきなりスクリプトを書けばOKです。ただしシェル以外から起動される場合はエラーになりますが。直接シェルから起動しなくても例えばC言語のsystem()関数はシェル経由でプログラムを起動するのでこういった場合もOKです。
>・env がスペース付き引数に対応する
env は元々、env VAR=value cmd arg1 arg2 のようにcmd arg1 arg2 を実行する際に環境変数VARにvalueという値を設定してから実行するというコマンドなのでこういう変更はありえないです。envの改造じゃなくてコマンドラインを解析するミニシェルを作ってそれを
#!/bin/minish awk -f のように指定すればOKです。
>・"gawk -f" に対応するコマンド gawkf (?)を用意する(gawk -f を一つの引数にするため)
そのgawkfをどこのディレクトリに置くかという問題が新たに発生します。
ちょっとトリッキーで一部制約もありますが、shはまず間違いなく/binにあるので、gawkの場合、
#!/bin/sh
ZZ==1{ exec sh -c "cat $@ | gawk -f $0" ;}
awkスクリプト
。。。
で、大抵のケースは出来ると思います。上に書いたようにシェルからしか起動しないなら1行目は不要です。
ruby言語だとこういうことを想定してあって、#! ruby という行まで読み飛ばす -x というオプションがあります。この際、rubyに乗り換えては?
#!/bin/sh
exec ruby -S -x $0 $@
#! ruby
rubyスクリプト
。。。
> ・・・というのはbash等のシェルの機能じゃなくてOSカーネルの機能です。
そうだったのですね!今まで、呪文のように意味も分からず #! と書いていました。賢くなりました。
> >・env がスペース付き引数に対応する
>env は元々、・・・こういう変更はありえないです。
なるほど。すごく納得しました。
この件について質問があるので、新しい質問をたてます。
ありがとうございました!!
No.4
- 回答日時:
バグレポートに返事が返ってきました。
#!構文にはひとつのインタプリタ言語しか置けずenv commandがスペースで区切られた構文(gawk -f)を一個のファイルとして認識してしまうのは、バグではなくPOSIXの仕様によるものだとのことです。私のパッチはこれを分離し、コマンド(gawk)と引数(-f)に分離するものでしたが、却下されてしまいました。
仕様ならしかたないですが、便利なものは仕様がどうあれ浸透するものです。あとでほとんどbashの機能をパクッた#! line用スパーインタプリターを作りたいなどとひそかに思っています。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
Traditional systems that parse #! lines can only give a single
argument to the interpreter being invoked. This is not a
feature of env, but of the operating system. That explains why
env is getting "awk -f" as a single argument. Unfortunately,
POSIX prohibits env from performing whitespace word
splitting on its arguments, so while the effort of your patch
is appreciated, it probably will not be applied. See the
POSIX requirements on env here:
http://www.opengroup.org/onlinepubs/009695399/ut …
When using /usr/bin/env as the interpreter in a #! line, you must
be sure that there is only one more word on the line, which means
that you cannot use env to invoke another program while still
providing arguments to that program.
この回答への補足
ありがとうございます!
パッチが書けるのですね。。すごい・・・
方法としては、
・env がスペース付き引数に対応する
もしくは
・"gawk -f" に対応するコマンド gawkf (?)を用意する(gawk -f を一つの引数にするため)
といった感じでしょうか・・
No.3
- 回答日時:
>#!/usr/bin/env gawk -f
>とやってみたのですが、
>/usr/bin/env: gawk -f: No such file or directory
>と怒られます。なぜでしょうか・・
envのバグのようです。
ソースを取ってきてパッチしたら、動くようになりました。さーてと、バグレポートを書こうかな。
No.2
- 回答日時:
#!/usr/bin/env bash
で、どうでしょうか?
(すべての環境でOKとは言い切れませんが、
たいていの場合、これで良いとおもいます。)
すみません。調子に乗って gawk のスクリプトについても
#!/usr/bin/env gawk -f
とやってみたのですが、
/usr/bin/env: gawk -f: No such file or directory
と怒られます。なぜでしょうか・・
No.1
- 回答日時:
UNIXやLinuxはそういう仕組みになっているので仕方ありません。
Tcl/Tkの場合も、
#!/bin/sh
# The next line restarts using wish \
exec wish "$0" "$@"
と書かなくちゃならないのですが、Windowsで動作させる場合はこの三行は不要なんですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Web初心者です。 簡易的なWebペ...
-
pythonでAmazonのほしいものリ...
-
Google ColaboでGUI作成
-
AIの登場でプログラマーたちが...
-
プログラマーと学歴の関係性に...
-
プログラマーは誘惑にさらされ...
-
python エラー
-
プログラミング言語について
-
Processingについて
-
プログラマーに向いている人の...
-
16x16のスプライトフォント
-
vba クリップボードクリアにつ...
-
python の 連鎖代入の文法
-
Pythonでの文字列からfloatへの...
-
・オブジェクト指向のメリット...
-
プログラミングの雑談がしたい...
-
最新のプログラム言語を学ぶに...
-
フォルダを自動作成・移動を複...
-
このURLで広告を出しているのは...
-
Google Colabでimport soxが出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
Pythonでの文字列からfloatへの...
-
プログラミング言語について
-
matplotlibでのLaTex表示
-
Google ColaboでGUI作成
-
HLMT、CSSについて相談です。 ...
-
近年誕生したプログラミング言語
-
長門有希のようにコンピュータ...
-
hostファイル
-
プログラマーに向いている人の...
-
Win11で作業を自動化したいです...
-
Pythonを使ってせん断応力図、...
-
・オブジェクト指向のメリット...
-
ホログラムを作ってくれる会社...
-
このURLで広告を出しているのは...
-
エディターで以下のような色に...
-
google Colabでmatplotlibの描...
-
プログラマーは誘惑にさらされ...
-
VBAでパワーシェルを実行したい...
-
特定の項目セルにスキャン(入...
おすすめ情報