シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ: シェルスクリプト総合 その27(https://mevius.5ch.net/test/read.cgi/unix/1525337663/)
シェルスクリプト総合 その28
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2018/07/24(火) 11:01:16.36ID:r0TJj2hB774デフォルトの名無しさん
2018/09/09(日) 11:55:57.22ID:ZnXA8VyU >>772
こういう事してるってこと?
alias wgeti='wget -ci <(cat <<_'
wgeti
http://example.com/a
http://example.com/b
http://example.com/c
_
)
それやるぐらいならこうするな。bash依存しなくてすむし
wgeti() { wget -ci -; }
wgeti<<URLs
http://example.com/a
http://example.com/b
http://example.com/c
URLs
こういう事してるってこと?
alias wgeti='wget -ci <(cat <<_'
wgeti
http://example.com/a
http://example.com/b
http://example.com/c
_
)
それやるぐらいならこうするな。bash依存しなくてすむし
wgeti() { wget -ci -; }
wgeti<<URLs
http://example.com/a
http://example.com/b
http://example.com/c
URLs
775デフォルトの名無しさん
2018/09/09(日) 12:01:20.84ID:ZnXA8VyU もしくは引数で渡す場合はこう
wgeti() {
for i in "$@"; do
echo "$i"
done | wget -ci -
}
wgeti \
'http://example.com/a' \
'http://example.com/b' \
'http://example.com/c'
短く書くなら
wgeti() {
printf '%s\n' "$@" | wget -ci -
}
wgeti() {
for i in "$@"; do
echo "$i"
done | wget -ci -
}
wgeti \
'http://example.com/a' \
'http://example.com/b' \
'http://example.com/c'
短く書くなら
wgeti() {
printf '%s\n' "$@" | wget -ci -
}
776デフォルトの名無しさん
2018/09/10(月) 00:47:57.63ID:hUyLWeb6 それってこれでいいのでは?
wgeti () {
wget -c $@
}
wgeti () {
wget -c $@
}
777デフォルトの名無しさん
2018/09/10(月) 00:48:53.10ID:hUyLWeb6 ああ、でも、引数にするなら何もしなくていいのかw
そのまんま wget の後に URL 入れるだけだ。
そのまんま wget の後に URL 入れるだけだ。
778デフォルトの名無しさん
2018/09/10(月) 02:03:17.65ID:P2aNZV+z 標準入力からURLのリストを渡したいから
<(cat <<_って書いてあるんだと思った。
wget、普通に引数から複数のURL渡せるね
<(cat <<_って書いてあるんだと思った。
wget、普通に引数から複数のURL渡せるね
779デフォルトの名無しさん
2018/09/10(月) 02:36:11.00ID:MLFQqRH+ コマンド引数の文字数制限に引っかかる可能性を
考慮すると wget -ci <(cat <<_ の方が無難なのだろう
(xargs でもいいけど)
考慮すると wget -ci <(cat <<_ の方が無難なのだろう
(xargs でもいいけど)
780デフォルトの名無しさん
2018/09/10(月) 21:09:13.29ID:P2aNZV+z local or typeset を使用しても本物のローカル変数ではないというのは面白い性質だよな
(本物のっていうのは一般的な言語相当のローカル変数という意味)
i=A
foo() {
local i=B
echo "foo1 $i" # => foo1 B
bar
echo "foo2 $i" # => foo2 C
}
bar() {
echo "bar $i" # => bar B
i=C
}
foo
echo "$i" # => A
「この関数の中だけで使う変数です。」ではなくて
「localの場所で変数を保存します。関数が抜けたら保存した値を戻します。」
という意味なんだよね。
POSIXにはないlocalやtypesetを使っても本物のローカル変数にはなれないが、
引数だけは本物のローカル変数になっているというのも面白い
(何も書かなくても関数に入った時点で、自動的にlocalが実行されると考えることもできる)
引数への代入は $1=123 とか 1=123 みたいにはできないけど、
set -- "123" "456" "789" みたいにすると再設定できる。
$1だけ設定したくても、すべての引数を設定する必要があるけど。
グローバル変数は時に分かりづらいバグを生むことがあるけど
これをうまく使えば、使用する変数をなくせたり減らせたりするかもしれないな
(本物のっていうのは一般的な言語相当のローカル変数という意味)
i=A
foo() {
local i=B
echo "foo1 $i" # => foo1 B
bar
echo "foo2 $i" # => foo2 C
}
bar() {
echo "bar $i" # => bar B
i=C
}
foo
echo "$i" # => A
「この関数の中だけで使う変数です。」ではなくて
「localの場所で変数を保存します。関数が抜けたら保存した値を戻します。」
という意味なんだよね。
POSIXにはないlocalやtypesetを使っても本物のローカル変数にはなれないが、
引数だけは本物のローカル変数になっているというのも面白い
(何も書かなくても関数に入った時点で、自動的にlocalが実行されると考えることもできる)
引数への代入は $1=123 とか 1=123 みたいにはできないけど、
set -- "123" "456" "789" みたいにすると再設定できる。
$1だけ設定したくても、すべての引数を設定する必要があるけど。
グローバル変数は時に分かりづらいバグを生むことがあるけど
これをうまく使えば、使用する変数をなくせたり減らせたりするかもしれないな
781デフォルトの名無しさん
2018/09/10(月) 23:57:57.78ID:3w8KnLJN ダイナミックスコープはperlとかpowershellとかmathematicaとかにもあるけど、これもグ口ーバル変数並にバグの温床な気がする
782デフォルトの名無しさん
2018/09/11(火) 01:49:50.99ID:oHtbKRPF あぁ、これがダイナミックスコープのことなのか
Perl?って思ったけど、(Perlの)localを使った場合の話なのね。
通常はmyを使ってたから。
Perl?って思ったけど、(Perlの)localを使った場合の話なのね。
通常はmyを使ってたから。
783デフォルトの名無しさん
2018/09/13(木) 14:07:12.80ID:q7iUBK5M ふと思ったんだけどシバンってあるじゃんシバン
あれってさ、#がコメントじゃない言語だったらどうするの?
Cインタプリタだったら
//!/usr/local/bin/c
とか書くの?
あれってさ、#がコメントじゃない言語だったらどうするの?
Cインタプリタだったら
//!/usr/local/bin/c
とか書くの?
784デフォルトの名無しさん
2018/09/13(木) 15:47:52.06ID:CY4XgXEU >>783
あれはカーネルが解釈してるからだめ。
あれはカーネルが解釈してるからだめ。
785デフォルトの名無しさん
2018/09/13(木) 16:45:07.13ID:1sKEH3Wo786デフォルトの名無しさん
2018/09/13(木) 17:23:01.88ID:CY4XgXEU >>785
別問題じゃね?どんな挙動?
別問題じゃね?どんな挙動?
787デフォルトの名無しさん
2018/09/13(木) 21:25:29.73ID:fcPV9kIu >>783
面白いネタを振ってくれてありがとう。いろいろ調べて勉強になったよ。
ちなみに質問の答えは「できないとは限らない」ということになるかなあ。
ネタを振ってくれたことには感謝するけど、自分で調べるほうが楽しいよ。
面白いネタを振ってくれてありがとう。いろいろ調べて勉強になったよ。
ちなみに質問の答えは「できないとは限らない」ということになるかなあ。
ネタを振ってくれたことには感謝するけど、自分で調べるほうが楽しいよ。
788デフォルトの名無しさん
2018/09/13(木) 21:47:40.27ID:mocTFwRb 今日の荒らしは ID:fcPV9kIu か。NG推奨
789デフォルトの名無しさん
2018/09/13(木) 22:02:34.22ID:QPFUtiyL 落ち着け
790デフォルトの名無しさん
2018/09/14(金) 04:16:04.32ID:q3l06dS7791デフォルトの名無しさん
2018/09/14(金) 05:06:28.57ID:hVbFTBye 素朴な疑問
・ shebangは シェバン? シバン?
・ "#!"の後にスペース入れずに "#!/bin/sh" ? スペース入れて "#! /bin/sh" ?
自分はともに前者、特にスペースについては入れるべきではないというの最初に覚えたんだけど、
結構後者も目にすることがあるので、実際のところ、どうなの?
・ shebangは シェバン? シバン?
・ "#!"の後にスペース入れずに "#!/bin/sh" ? スペース入れて "#! /bin/sh" ?
自分はともに前者、特にスペースについては入れるべきではないというの最初に覚えたんだけど、
結構後者も目にすることがあるので、実際のところ、どうなの?
792デフォルトの名無しさん
2018/09/14(金) 09:25:36.66ID:lqNqtREE >>790
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/execve.2.html
うぉ、Linuxまじ最低だな
インタープリタースクリプトの optional-arg 引き数の解釈方法は実装により異なる。
Linux では、インタープリター名 interpreter に続く文字列全体がインタープリターに
1個の引き数として渡される。 しかし、動作が異なるシステムもある。 あるシステム
では、 optional-arg のうち最初のホワイトスペースまでが 引き数として渡される。
また、別のシステムでは インタープリタースクリプトは複数の引き数を持つことができ、
optional-arg 内のホワイトスペースが引き数の区切りとなる。
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/execve.2.html
うぉ、Linuxまじ最低だな
インタープリタースクリプトの optional-arg 引き数の解釈方法は実装により異なる。
Linux では、インタープリター名 interpreter に続く文字列全体がインタープリターに
1個の引き数として渡される。 しかし、動作が異なるシステムもある。 あるシステム
では、 optional-arg のうち最初のホワイトスペースまでが 引き数として渡される。
また、別のシステムでは インタープリタースクリプトは複数の引き数を持つことができ、
optional-arg 内のホワイトスペースが引き数の区切りとなる。
793デフォルトの名無しさん
2018/09/14(金) 09:40:37.87ID:CXa+ZLzo794デフォルトの名無しさん
2018/09/14(金) 09:48:01.90ID:CXa+ZLzo >>791
#! の後のスペースは、どのOSでも有無に関わらず動いたと思う。
ただしshebang行に32バイト制限のあるOS があったので、
それに引っかかるギリギリならスペース無しにする必要アリ。
読みは知らない。
#! の後のスペースは、どのOSでも有無に関わらず動いたと思う。
ただしshebang行に32バイト制限のあるOS があったので、
それに引っかかるギリギリならスペース無しにする必要アリ。
読みは知らない。
795デフォルトの名無しさん
2018/09/14(金) 10:54:54.26ID:6xTUz+7n >>793
自分でビルドしたawkを使う場合は?
自分でビルドしたawkを使う場合は?
796デフォルトの名無しさん
2018/09/14(金) 12:12:08.80ID:CXa+ZLzo >>795
システム付属じゃ駄目で、自分でビルドした特有の事情があるなら、絶対パス指定で呼べばいいのでは?
システム付属じゃ駄目で、自分でビルドした特有の事情があるなら、絶対パス指定で呼べばいいのでは?
797デフォルトの名無しさん
2018/09/14(金) 16:14:10.39ID:6xTUz+7n >>796
それだと実行権限の意味がなくなるじゃん
実行権限をつけるのは、いちいち実行プログラムのパスを指定しなくていいからでしょ?
拡張子もなくせばなんの言語で作られているかも意識しないですむし。
手でコマンドを打ったときと同じように、環境変数の$PATHからどれを使うかが決まる。
そもそもなんで最初からそういう仕組みにして置かなかったんだろう?
そうすりゃシバンなんて #!awk だけですんだのにね
それだと実行権限の意味がなくなるじゃん
実行権限をつけるのは、いちいち実行プログラムのパスを指定しなくていいからでしょ?
拡張子もなくせばなんの言語で作られているかも意識しないですむし。
手でコマンドを打ったときと同じように、環境変数の$PATHからどれを使うかが決まる。
そもそもなんで最初からそういう仕組みにして置かなかったんだろう?
そうすりゃシバンなんて #!awk だけですんだのにね
798デフォルトの名無しさん
2018/09/14(金) 16:33:58.92ID:gmWhNmZA 実行権限は絶対パスでも相対パスでも必要なので関係ない
799デフォルトの名無しさん
2018/09/14(金) 16:35:21.26ID:KKMncdOE スクリプトのパスとインタプリタのパスを混同している
800デフォルトの名無しさん
2018/09/14(金) 16:36:11.79ID:6xTUz+7n801デフォルトの名無しさん
2018/09/14(金) 16:46:56.10ID:gmWhNmZA シバンの話は分かってるけど?
実行するスクリプトが使用するインタプリタに実行権限付いてなかったら
当たり前だけど絶対パスで指定したって実行できないよ?
実行するスクリプトが使用するインタプリタに実行権限付いてなかったら
当たり前だけど絶対パスで指定したって実行できないよ?
802デフォルトの名無しさん
2018/09/14(金) 16:49:01.41ID:CXa+ZLzo803デフォルトの名無しさん
2018/09/14(金) 16:53:40.07ID:UfVRD/gP >>794
> shebang行に32バイト制限のあるOSがあった
なるほど、そんな理由もあったんだね。
逆にスペースorタブを入れなければならない、なんていう例(4.1BSD)もあったみたいだ。
これについては修正されたようだけど、今でもこれを守っている人もいるらしい。
同じ#で始まっていても、コメントとは違うと思うから、
やはりスペースを入れることにはなんとなく躊躇しちゃうわ。
> shebang行に32バイト制限のあるOSがあった
なるほど、そんな理由もあったんだね。
逆にスペースorタブを入れなければならない、なんていう例(4.1BSD)もあったみたいだ。
これについては修正されたようだけど、今でもこれを守っている人もいるらしい。
同じ#で始まっていても、コメントとは違うと思うから、
やはりスペースを入れることにはなんとなく躊躇しちゃうわ。
804デフォルトの名無しさん
2018/09/14(金) 18:40:33.82ID:q3l06dS7 俺は半分脳死状態で
#! /bin/sh -
↑半角スペース ↑ハイフンマイナス
にしてるわ。
上でも書いてくれた人がいるけど,#!の後に空白が必要な環境があったり
先頭行から継続してパースしてしまい
(ほとんどありえないことだけど)
#! /bin/sh
-c
みたいなファイルに対し
/bin/sh -cというオプション付きshインタプリンタを起動してしまうOSもあるみたい
(オライリーのシェルスクリプト本に記述あり)
#! /bin/sh -
↑半角スペース ↑ハイフンマイナス
にしてるわ。
上でも書いてくれた人がいるけど,#!の後に空白が必要な環境があったり
先頭行から継続してパースしてしまい
(ほとんどありえないことだけど)
#! /bin/sh
-c
みたいなファイルに対し
/bin/sh -cというオプション付きshインタプリンタを起動してしまうOSもあるみたい
(オライリーのシェルスクリプト本に記述あり)
805デフォルトの名無しさん
2018/09/14(金) 18:50:01.26ID:hBiQ1eS5 - で閉じるのはオレもやってるけど、
シバンの後のスペースは入れない
#!/bin/sh -
シバンの後のスペースは入れない
#!/bin/sh -
806デフォルトの名無しさん
2018/09/14(金) 19:07:11.14ID:6xTUz+7n >>802
わかってる
#!/home/me/bin/awk -f
って書いたら、必ず /home/me/bin/awk が使われてしまう
例えばdebian 9のawkは4.1.4だがdebian 7は4.0.4だった
debianのawkのパスは /usr/bin/awk だが。debian 9で自分でawkの
最新版をビルドして /usr/local/bin/awk に入れたとしよう
awkスクリプトのシバンが #!/usr/bin/env awk と書いてあれば
$PATHを見て適切な /usr/local/bin/awk を選んでくれるが、
envを使ってないと、/usr/bin/awk 決め打ちになってしまう
大量にある(かもしれない)awkスクリプトのシバンを全部書き換えるなんてナンセンスだし
せっかく実行権限が付いてるのに、awk スクリプトファイル名 と書くのもナンセンスだろ
実行プログラムが何の言語で書かれているかなんて、利用者には知ったことじゃないんだから
fooコマンドはfooコマンドとして実行してほしいし、 使用するインタプリタは $PATH を見て欲しい
わかってる
#!/home/me/bin/awk -f
って書いたら、必ず /home/me/bin/awk が使われてしまう
例えばdebian 9のawkは4.1.4だがdebian 7は4.0.4だった
debianのawkのパスは /usr/bin/awk だが。debian 9で自分でawkの
最新版をビルドして /usr/local/bin/awk に入れたとしよう
awkスクリプトのシバンが #!/usr/bin/env awk と書いてあれば
$PATHを見て適切な /usr/local/bin/awk を選んでくれるが、
envを使ってないと、/usr/bin/awk 決め打ちになってしまう
大量にある(かもしれない)awkスクリプトのシバンを全部書き換えるなんてナンセンスだし
せっかく実行権限が付いてるのに、awk スクリプトファイル名 と書くのもナンセンスだろ
実行プログラムが何の言語で書かれているかなんて、利用者には知ったことじゃないんだから
fooコマンドはfooコマンドとして実行してほしいし、 使用するインタプリタは $PATH を見て欲しい
807デフォルトの名無しさん
2018/09/14(金) 19:21:44.66ID:za5qG/O1 なんかいろいろ誤解しとるw
808デフォルトの名無しさん
2018/09/14(金) 19:27:29.88ID:EsLYvq4M >>806
何をしたいとかは別として、実装としてできないんだよ。
カーネルのシステムコールexecveはPATHを見ない。
PATHを見てるのはユーザランドのライブラリ関数のexecvpとか。
大改造が必要になる。
何をしたいとかは別として、実装としてできないんだよ。
カーネルのシステムコールexecveはPATHを見ない。
PATHを見てるのはユーザランドのライブラリ関数のexecvpとか。
大改造が必要になる。
809デフォルトの名無しさん
2018/09/14(金) 19:38:49.59ID:6xTUz+7n810デフォルトの名無しさん
2018/09/14(金) 20:18:23.13ID:EsLYvq4M カーネルが特定の決め打ちしたバイナリを呼ぶようなことはないよ。
せいぜいinitだけ。
せいぜいinitだけ。
811デフォルトの名無しさん
2018/09/14(金) 20:29:56.82ID:6xTUz+7n812デフォルトの名無しさん
2018/09/14(金) 20:33:39.49ID:EsLYvq4M それほど言うなら試しにlinuxのパッチ書いて投げてみたら?
813デフォルトの名無しさん
2018/09/14(金) 20:33:54.17ID:6xTUz+7n 補足すると>>809読めばわかると思うけど、読み取ったシバンの文字列を置き換えるだけ。
だからカーネルが特定の決め打ちしたバイナリを呼ばないというのが事実であっても
読み取ったシバンの文字列を置き換える話と無関係の話ということ
だからカーネルが特定の決め打ちしたバイナリを呼ばないというのが事実であっても
読み取ったシバンの文字列を置き換える話と無関係の話ということ
814デフォルトの名無しさん
2018/09/14(金) 20:35:05.30ID:6xTUz+7n815デフォルトの名無しさん
2018/09/14(金) 20:36:01.42ID:EsLYvq4M 可能か不可能かで言えば、もちろん可能だよ。なんだって可能。
でも、カーネルとユーザランドは明確に分けろって怒られるだろうね。
でも、カーネルとユーザランドは明確に分けろって怒られるだろうね。
816デフォルトの名無しさん
2018/09/14(金) 20:39:33.43ID:6xTUz+7n817デフォルトの名無しさん
2018/09/14(金) 20:39:41.70ID:1jWDqP4V >>809
カーネルいじればそれは可能だな。
カーネル書ける人なら目茶目茶難しいってほどじゃないから、
カーネル書ける人雇えばいいぞ!
ただしそれを標準カーネルの機能として入れてもらえるように
議論するのは、カーネルに機能追加するよりだいぶ大変かも。
#! じゃない別のmagic文字列にした方が提案通りやすいかもな。
頑張れw
カーネルいじればそれは可能だな。
カーネル書ける人なら目茶目茶難しいってほどじゃないから、
カーネル書ける人雇えばいいぞ!
ただしそれを標準カーネルの機能として入れてもらえるように
議論するのは、カーネルに機能追加するよりだいぶ大変かも。
#! じゃない別のmagic文字列にした方が提案通りやすいかもな。
頑張れw
818デフォルトの名無しさん
2018/09/14(金) 20:42:06.79ID:6xTUz+7n819デフォルトの名無しさん
2018/09/14(金) 20:43:14.61ID:6xTUz+7n つーか、いい加減にしないといつもの荒らしモードに入るぞ?w
議論に負けそうになると、話をすり替えて、
俺を呼ばわりするのはいつもの手だよなw
もうそろそろ荒らし認定することだと思ってるんだが?w
議論に負けそうになると、話をすり替えて、
俺を呼ばわりするのはいつもの手だよなw
もうそろそろ荒らし認定することだと思ってるんだが?w
820デフォルトの名無しさん
2018/09/14(金) 20:43:32.04ID:6xTUz+7n 訂正
俺を荒らし呼ばわりするのはいつもの手だよなw
俺を荒らし呼ばわりするのはいつもの手だよなw
821デフォルトの名無しさん
2018/09/14(金) 20:46:17.92ID:6xTUz+7n 反論しないならさっさとNGIDに入れて
俺に反論できない状態を作ってくれよ?
見れなくなったら俺に反論できないんだから
それこそ俺の望んだ結果だw
はい、結論。>>809の方法で技術的には実現可能です。
反論がある人は、関係者を説得して調整をするのが難しいって
別の話にすり替えないで技術的な話でお願いしますねー
俺に反論できない状態を作ってくれよ?
見れなくなったら俺に反論できないんだから
それこそ俺の望んだ結果だw
はい、結論。>>809の方法で技術的には実現可能です。
反論がある人は、関係者を説得して調整をするのが難しいって
別の話にすり替えないで技術的な話でお願いしますねー
822デフォルトの名無しさん
2018/09/14(金) 20:46:23.72ID:1jWDqP4V823デフォルトの名無しさん
2018/09/14(金) 20:48:41.19ID:6xTUz+7n824デフォルトの名無しさん
2018/09/14(金) 20:48:54.07ID:1jWDqP4V だって勝手に勘違いして勝手な仮定して勝手に腹立ててるんだもん。
せっかく賛成してた俺まで敵視しだす有り様だし。
自業自得ってことよ。
せっかく賛成してた俺まで敵視しだす有り様だし。
自業自得ってことよ。
825デフォルトの名無しさん
2018/09/14(金) 20:51:13.71ID:jAge75Zy 長文ってだけでとりあえずスクロールする
826デフォルトの名無しさん
2018/09/14(金) 20:54:16.23ID:6xTUz+7n >>824
5ちゃんねるなんだからこの程度のもんよ
こっちが真面目に話をしていても、とりあえず何か言い返せば
それが反論したことになるみたいな、みたいなクソみたいなレスしてくる
いい案だと思うなら一言「それはいい考えだ」ぐらい書けと
自分が間違っていたら、素直に間違いを認めるやつばかりなら、
それもこんなにどうでもいいことを、毎回書かなくてすむんだよ
5ちゃんねるなんだからこの程度のもんよ
こっちが真面目に話をしていても、とりあえず何か言い返せば
それが反論したことになるみたいな、みたいなクソみたいなレスしてくる
いい案だと思うなら一言「それはいい考えだ」ぐらい書けと
自分が間違っていたら、素直に間違いを認めるやつばかりなら、
それもこんなにどうでもいいことを、毎回書かなくてすむんだよ
827デフォルトの名無しさん
2018/09/14(金) 20:58:13.19ID:EsLYvq4M >>816
ファイルシステムの構成に何らかの仮定を置いた時点でユーザランドと分離できていない。
ファイルシステムの構成に何らかの仮定を置いた時点でユーザランドと分離できていない。
828デフォルトの名無しさん
2018/09/14(金) 20:59:16.05ID:EsLYvq4M ちなみに俺はIDずっと変えてないよ。
829デフォルトの名無しさん
2018/09/14(金) 20:59:57.05ID:6xTUz+7n830デフォルトの名無しさん
2018/09/14(金) 21:08:41.85ID:EsLYvq4M >>829
仮定せずにどうやって/usr/bin/env付ければいいってわかるの?
仮定せずにどうやって/usr/bin/env付ければいいってわかるの?
831デフォルトの名無しさん
2018/09/14(金) 21:12:09.04ID:6xTUz+7n >>830
単なる文字列の置換に過ぎない
カーネルはシバンがファイルパスなんて思ってない。
カーネルがシバンを読み取るというのなら、少なくとも
読み取ったものがシバンであるということはわかってる
あとはそこににある文字列が、ファイルパスだろうが
ランダム文字列だろうが関係ない
単に#!の後に固定の文字列を埋めるだけ
あとは後続のプログラムに渡せば、
そいつが勝手になにかしてくれるんだろ?
それはカーネルの知ったことじゃない
単なる文字列の置換に過ぎない
カーネルはシバンがファイルパスなんて思ってない。
カーネルがシバンを読み取るというのなら、少なくとも
読み取ったものがシバンであるということはわかってる
あとはそこににある文字列が、ファイルパスだろうが
ランダム文字列だろうが関係ない
単に#!の後に固定の文字列を埋めるだけ
あとは後続のプログラムに渡せば、
そいつが勝手になにかしてくれるんだろ?
それはカーネルの知ったことじゃない
832デフォルトの名無しさん
2018/09/14(金) 21:30:49.25ID:gmWhNmZA この話と実行権限が関係ないのは理解できたのか?
833デフォルトの名無しさん
2018/09/14(金) 21:44:08.73ID:6xTUz+7n >>832
お前1人で意味不明の話をしてるんだってw
(awkスクリプトで書いた)fooコマンドが実行できるのは
fooコマンドに実行権限がついているからだし、そのfooコマンドの
シバンで指定されたプログラムも実行権限がついていなければいけない
当たり前の話だが、上記の理由により awkであっても /usr/bin/envを
使っておいたほうが良いって結論を言ったんだが、
それに対して前は何の話をしてるのだ?
お前1人で意味不明の話をしてるんだってw
(awkスクリプトで書いた)fooコマンドが実行できるのは
fooコマンドに実行権限がついているからだし、そのfooコマンドの
シバンで指定されたプログラムも実行権限がついていなければいけない
当たり前の話だが、上記の理由により awkであっても /usr/bin/envを
使っておいたほうが良いって結論を言ったんだが、
それに対して前は何の話をしてるのだ?
834デフォルトの名無しさん
2018/09/14(金) 21:46:58.87ID:6xTUz+7n どうもこの話を理解できないのが、おかしいと思うんだが、
もしかしてawkスクリプトに実行権限をつけるという発想がないのか?
いつもawk -f スクリプトファイル名 で実行してるとか?
いや、まさかな。
シバンはスクリプトファイル名だけで実行するためにあるんだし
そのために実行権限つけるだろう。
でもなぁ、ここまで以上に理解能力がないのは、
まかさが的中しているとしか思えない。
シバンをつける意味もわかってなかったりしてw
もしかしてawkスクリプトに実行権限をつけるという発想がないのか?
いつもawk -f スクリプトファイル名 で実行してるとか?
いや、まさかな。
シバンはスクリプトファイル名だけで実行するためにあるんだし
そのために実行権限つけるだろう。
でもなぁ、ここまで以上に理解能力がないのは、
まかさが的中しているとしか思えない。
シバンをつける意味もわかってなかったりしてw
835デフォルトの名無しさん
2018/09/14(金) 21:49:19.68ID:jAge75Zy ここまでの話全く読んでないけどawk実行させる時は-f使うわ
836デフォルトの名無しさん
2018/09/14(金) 22:00:24.41ID:6xTUz+7n >>835
ということは、シェルスクリプトを実行させるときはsh使って
perlスクリプトを実行させる時はperlを使ってるのかな?
かつてsystemdが普及するまではみんなが使っていた
serviceコマンドやbyobuはシェルスクリプトだし
apt-fileやshasumはPerlスクリプトだし
ufwはPythonスクリプトだよ
実装がなんのスクリプト言語で作られているかなんて気にしなくていいじゃないかw
ということは、シェルスクリプトを実行させるときはsh使って
perlスクリプトを実行させる時はperlを使ってるのかな?
かつてsystemdが普及するまではみんなが使っていた
serviceコマンドやbyobuはシェルスクリプトだし
apt-fileやshasumはPerlスクリプトだし
ufwはPythonスクリプトだよ
実装がなんのスクリプト言語で作られているかなんて気にしなくていいじゃないかw
837デフォルトの名無しさん
2018/09/14(金) 22:02:01.56ID:jAge75Zy shは実行権限つける
perlは場合による
意味はない
perlは場合による
意味はない
838デフォルトの名無しさん
2018/09/14(金) 23:01:40.99ID:gmWhNmZA839デフォルトの名無しさん
2018/09/14(金) 23:05:15.75ID:fXySkelb $ls aho.sh
rw-r--r-- aho
$. ./aho.sh
aho
$
rw-r--r-- aho
$. ./aho.sh
aho
$
840デフォルトの名無しさん
2018/09/14(金) 23:06:41.90ID:fXySkelb $cat ./aho.sh
echo aho
$
echo aho
$
841デフォルトの名無しさん
2018/09/14(金) 23:15:17.42ID:1jWDqP4V >>838
確かにあの書き込みは全体的に意味不明だったね。
確かにあの書き込みは全体的に意味不明だったね。
842デフォルトの名無しさん
2018/09/15(土) 01:10:17.43ID:pm09nqHo >>838
> と、書いてたからパス指定と実行権限の意味は無関係だと指摘してるだけなんだが
> 機能的文盲とかいうやつなのか?
実行権限がついているとパスの指定を省略できるんだよ
ご存知じゃないかもしれないが(皮肉)パスの指定を省略した時に
$PATHに設定された複数のパスから、パスを補完してくれる機能がある
つまり$PATHからパスを補完してほしいなら実行権限をつけないとだめ
(awk)スクリプトを$PATHの中から補完してほしいなら実行権限をつける。
そうするとパスを省略して実行できる。
スクリプト自体は$PATHから補完してくれる、だけどそのスクリプトに
シバンが/usr/bin/awkとなっていると、スクリプトを実行するインタプリタは
/usr/bin/awk固定となってしまう。
/usr/bin/env awk -f と書くことで、インタプリタ自体も$PATHから検索してくれる
パス指定を"省略すること" と 実行権限の意味、いい加減理解しましたかね?
> と、書いてたからパス指定と実行権限の意味は無関係だと指摘してるだけなんだが
> 機能的文盲とかいうやつなのか?
実行権限がついているとパスの指定を省略できるんだよ
ご存知じゃないかもしれないが(皮肉)パスの指定を省略した時に
$PATHに設定された複数のパスから、パスを補完してくれる機能がある
つまり$PATHからパスを補完してほしいなら実行権限をつけないとだめ
(awk)スクリプトを$PATHの中から補完してほしいなら実行権限をつける。
そうするとパスを省略して実行できる。
スクリプト自体は$PATHから補完してくれる、だけどそのスクリプトに
シバンが/usr/bin/awkとなっていると、スクリプトを実行するインタプリタは
/usr/bin/awk固定となってしまう。
/usr/bin/env awk -f と書くことで、インタプリタ自体も$PATHから検索してくれる
パス指定を"省略すること" と 実行権限の意味、いい加減理解しましたかね?
843デフォルトの名無しさん
2018/09/15(土) 01:13:44.97ID:pm09nqHo ほんと、理解能力がないのか、
それとも、単に技術レベルが数ランク下なのか知らんが
馬鹿を相手にしてると疲れる。煽りたくもなるわw
それとも、単に技術レベルが数ランク下なのか知らんが
馬鹿を相手にしてると疲れる。煽りたくもなるわw
844デフォルトの名無しさん
2018/09/15(土) 01:20:22.61ID:pm09nqHo845デフォルトの名無しさん
2018/09/15(土) 01:22:03.62ID:pm09nqHo 実行権限は単に実行可能にするだけじゃない
パスを省略して$PATHの中からパスを補完してくれる機能があるのだ
パスを省略して$PATHの中からパスを補完してくれる機能があるのだ
846デフォルトの名無しさん
2018/09/15(土) 01:32:29.75ID:pm09nqHo まあ、細かいことを説明するなら、"スクリプトファイル" の実行パスを
検索してくれるのはシェルで、シェルが$PATHの中から
実行ファイルを見つけることができるようにするために実行権限をつける
でも今は "スクリプトファイル" の実行パスの検索の話ではなく
シバンから起動する "インタプリタ" の話
シバン自体には$PATHの中から検索してくれる機能はなくて
単にシバンに書かれたパスのプログラムを実行するだけ
そこで出てくるマジックが /usr/bin/env awk -f
シバンは$PATHを検索しないが、/usr/bin/envが$PATHを検索して
適切なプログラム(ここではawk)に引き継いでくれる
などと丁寧に説明してやったら、今度は長文だーとか言って
荒らし呼ばわりするんだろう?
検索してくれるのはシェルで、シェルが$PATHの中から
実行ファイルを見つけることができるようにするために実行権限をつける
でも今は "スクリプトファイル" の実行パスの検索の話ではなく
シバンから起動する "インタプリタ" の話
シバン自体には$PATHの中から検索してくれる機能はなくて
単にシバンに書かれたパスのプログラムを実行するだけ
そこで出てくるマジックが /usr/bin/env awk -f
シバンは$PATHを検索しないが、/usr/bin/envが$PATHを検索して
適切なプログラム(ここではawk)に引き継いでくれる
などと丁寧に説明してやったら、今度は長文だーとか言って
荒らし呼ばわりするんだろう?
847デフォルトの名無しさん
2018/09/15(土) 02:03:07.61ID:pm09nqHo 話は変わるけどさ、
シェルスクリプト(シバンは #!/bin/sh 実体はdash)に
A=
A=123 echo "$A-1"
echo "$A-2"
って書いて実行したら以下のように表示されるんだよ。
-1
-2
この動きはA=123が評価される前にechoの変数展開が行われて-1になって
実行したらAの内容が元に戻るから-2と表示されるということで理解できる
でも以下のように書いたら
A=
A=123 eval 'echo "$A-1"'
echo "$A-2"
次のように表示されるんだよ
123-1
123-2
これはどういうわけだろう?
さらにbashとzshで実行した場合は以下のように表示されたw
123-1
-2
この動作ならまだ理解できる。
でもkshやposhやyashなんかはdashと同じ
どっちが正しい動きなんだろう?
シェルスクリプト(シバンは #!/bin/sh 実体はdash)に
A=
A=123 echo "$A-1"
echo "$A-2"
って書いて実行したら以下のように表示されるんだよ。
-1
-2
この動きはA=123が評価される前にechoの変数展開が行われて-1になって
実行したらAの内容が元に戻るから-2と表示されるということで理解できる
でも以下のように書いたら
A=
A=123 eval 'echo "$A-1"'
echo "$A-2"
次のように表示されるんだよ
123-1
123-2
これはどういうわけだろう?
さらにbashとzshで実行した場合は以下のように表示されたw
123-1
-2
この動作ならまだ理解できる。
でもkshやposhやyashなんかはdashと同じ
どっちが正しい動きなんだろう?
848デフォルトの名無しさん
2018/09/15(土) 04:27:15.99ID:2etSWec6 またかww
849デフォルトの名無しさん
2018/09/15(土) 05:43:59.56ID:krdUo6un >>847
単にシェルごとに仕様が違ってるだけで全て正常動作だろうし正しいと言えば正しいのでは?
てか、あらゆるシェルはこのような時はこのような動きにならなければいけないみたいな決まりがあるわけでもないんだから正しいか間違いかで考えること自体がおかしい。
単にシェルごとに仕様が違ってるだけで全て正常動作だろうし正しいと言えば正しいのでは?
てか、あらゆるシェルはこのような時はこのような動きにならなければいけないみたいな決まりがあるわけでもないんだから正しいか間違いかで考えること自体がおかしい。
850デフォルトの名無しさん
2018/09/15(土) 06:12:06.93ID:pm09nqHo >>849
> 単にシェルごとに仕様が違ってるだけで全て正常動作だろうし正しいと言えば正しいのでは?
POSIXの仕様と照らし合わせてって意味だよ
POSIXの仕様と照らし合わせて正しいのか間違ってるのか
そもそもPOSIXにこういったときの仕様は定義されていないのか
> あらゆるシェルはこのような時はこのような動きにならなければいけないみたいな決まりがあるわけでもないんだから
決まりはあって、それがPOSIXの仕様のことだよ
> 単にシェルごとに仕様が違ってるだけで全て正常動作だろうし正しいと言えば正しいのでは?
POSIXの仕様と照らし合わせてって意味だよ
POSIXの仕様と照らし合わせて正しいのか間違ってるのか
そもそもPOSIXにこういったときの仕様は定義されていないのか
> あらゆるシェルはこのような時はこのような動きにならなければいけないみたいな決まりがあるわけでもないんだから
決まりはあって、それがPOSIXの仕様のことだよ
851デフォルトの名無しさん
2018/09/15(土) 06:13:27.92ID:pm09nqHo852デフォルトの名無しさん
2018/09/15(土) 09:25:08.76ID:bwURAev4 よほどリアルでぼっちなんだな。そらそうだなという人格と見えるし
853デフォルトの名無しさん
2018/09/15(土) 11:18:23.22ID:OUVvcRON >>843
> それとも、単に技術レベルが数ランク下なのか知らんが
https://cdn-ak.f.st-hatena.com/images/fotolife/k/kemurikikakuku/20170201/20170201184641.jpg
> それとも、単に技術レベルが数ランク下なのか知らんが
https://cdn-ak.f.st-hatena.com/images/fotolife/k/kemurikikakuku/20170201/20170201184641.jpg
854デフォルトの名無しさん
2018/09/15(土) 15:58:58.37ID:8KftQgLD 俺自身にもそういう傾向があるが
訊かれてもないことをずらずら書いて自己満足に浸るのはよくないと思う。
現実の人間関係でもそういう人はハブられがちだし。
訊かれてもないことをずらずら書いて自己満足に浸るのはよくないと思う。
現実の人間関係でもそういう人はハブられがちだし。
855デフォルトの名無しさん
2018/09/15(土) 16:00:37.10ID:KIanXBkQ 聞いたことを答えないで
聞かれてないことを答えるのは
それはそいつが何も知らないときだ
オマエはなにもわかってない
聞かれてないことを答えるのは
それはそいつが何も知らないときだ
オマエはなにもわかってない
856デフォルトの名無しさん
2018/09/15(土) 16:04:38.00ID:pm09nqHo857デフォルトの名無しさん
2018/09/15(土) 16:05:17.15ID:pm09nqHo >>847の質問よろしくおねがいします。
858デフォルトの名無しさん
2018/09/15(土) 16:16:01.63ID:iaCHT03n 文書なげぇんだよなぁ
859デフォルトの名無しさん
2018/09/15(土) 16:16:38.70ID:pm09nqHo 前に情報小出しにするなって言われたからねw
860デフォルトの名無しさん
2018/09/15(土) 16:32:31.20ID:Svn0IWNp 質問のときだけはへり下るのな
身を正してのつもりかもだが、質問のときだけですぐに豹変するからお前の場合はもうただただ気持ち悪いだけ
身を正してのつもりかもだが、質問のときだけですぐに豹変するからお前の場合はもうただただ気持ち悪いだけ
861デフォルトの名無しさん
2018/09/15(土) 16:35:43.79ID:pm09nqHo 何だ?質問も高圧的にすれば満足するんか?
ただ文句言いたいだけだろ。
そんな無駄な会話してないで
本題にもどれや
ただ文句言いたいだけだろ。
そんな無駄な会話してないで
本題にもどれや
862デフォルトの名無しさん
2018/09/15(土) 16:38:13.80ID:Svn0IWNp どうしてそっちになるのだか。やっぱりそっちが素で付け焼き刃のへりくだりか
社会的にはは豹変しない方になんだけどなあ
社会的にはは豹変しない方になんだけどなあ
863デフォルトの名無しさん
2018/09/15(土) 16:45:50.83ID:pm09nqHo やっぱり意地でもスレと無関係の話をしたいようだ。
お前がいなくなればスレは平和になるのになぁw
お前がいなくなればスレは平和になるのになぁw
864デフォルトの名無しさん
2018/09/15(土) 16:50:58.66ID:Svn0IWNp なにその俺は違う的なレスは
さすがいままでのレスで自己中ぶりを発揮しまくっただけあるやつだなあ。ただただ気持ち悪いのもそれは自己中ぶりからなんだかが、わからないだろうな、わかってたらそんな自己中にはならんだろうし
さすがいままでのレスで自己中ぶりを発揮しまくっただけあるやつだなあ。ただただ気持ち悪いのもそれは自己中ぶりからなんだかが、わからないだろうな、わかってたらそんな自己中にはならんだろうし
865デフォルトの名無しさん
2018/09/15(土) 16:55:24.75ID:SSTURz0o なるほど、コマンドライン上にある変数(シェルが予め展開する変数)はそのままなのか
fork & exec されるプロセス空間の環境変数にのみ作用するのだからそうなるわな
$ PATH=hoge ls "${PATH}"
$ PATH=hoge /bin/ls "${PATH}"
fork & exec されるプロセス空間の環境変数にのみ作用するのだからそうなるわな
$ PATH=hoge ls "${PATH}"
$ PATH=hoge /bin/ls "${PATH}"
866デフォルトの名無しさん
2018/09/15(土) 17:01:07.67ID:Svn0IWNp >>865
それと、(一時的)環境変数をいつするのかと、環境変数をいつ展開するのかが被ってるてとこかなあ
A=123 /bin/echo "$A"
A=123 bash/dash/ksh/etc... -c 'echo "$A"'
それと、(一時的)環境変数をいつするのかと、環境変数をいつ展開するのかが被ってるてとこかなあ
A=123 /bin/echo "$A"
A=123 bash/dash/ksh/etc... -c 'echo "$A"'
867デフォルトの名無しさん
2018/09/15(土) 17:19:32.41ID:8KftQgLD >>866
そのコマンドラインは,「直前に指定した変数が影響しない」のが正しい挙動だよな
なぜならシェルはそれらを一緒くたに処理するから,変数の変化を参照できない
↑この理解って正しい?
bashコマンドラインで
$ VAR=val echo $VAR
# なにも返らず
$ VAR=val; echo $VAR
val
こういう挙動から推測したんだけども。
そのコマンドラインは,「直前に指定した変数が影響しない」のが正しい挙動だよな
なぜならシェルはそれらを一緒くたに処理するから,変数の変化を参照できない
↑この理解って正しい?
bashコマンドラインで
$ VAR=val echo $VAR
# なにも返らず
$ VAR=val; echo $VAR
val
こういう挙動から推測したんだけども。
869デフォルトの名無しさん
2018/09/15(土) 17:42:37.90ID:pm09nqHo >>865
forkされる場合ってのはわかりやすいんだけどね
> A=
> A=123 echo "$A-1"
> echo "$A-2"
>
> 次のように表示されるんだよ
> 123-1
> 123-2
実行するのがシェルビルトインコマンドであっても実行後は元に戻る
ん?頭にA=123をつけた時、本当にシェルビルトインの
echoが呼ばれてるのか?と思ってecho --versionとしてみたが、
やっぱりシェルビルトインの方だった。
(/bin/echo --versionだとバージョン情報が表示される)
他のシェルで試してみたがすべて同じ挙動
ということで
> A=123 echo "$A-1"
と書いたら変数の内容は実行後に元に戻る。
というのが基本の動きでいいのだろう
まあよく知られた機能だよね。
forkされる場合ってのはわかりやすいんだけどね
> A=
> A=123 echo "$A-1"
> echo "$A-2"
>
> 次のように表示されるんだよ
> 123-1
> 123-2
実行するのがシェルビルトインコマンドであっても実行後は元に戻る
ん?頭にA=123をつけた時、本当にシェルビルトインの
echoが呼ばれてるのか?と思ってecho --versionとしてみたが、
やっぱりシェルビルトインの方だった。
(/bin/echo --versionだとバージョン情報が表示される)
他のシェルで試してみたがすべて同じ挙動
ということで
> A=123 echo "$A-1"
と書いたら変数の内容は実行後に元に戻る。
というのが基本の動きでいいのだろう
まあよく知られた機能だよね。
870デフォルトの名無しさん
2018/09/15(土) 17:43:08.57ID:pm09nqHo ちなみにコマンドライン(シェル)じゃなくて
スクリプトを書いて実行して確かめてる
スクリプトを書いて実行して確かめてる
871デフォルトの名無しさん
2018/09/15(土) 17:56:26.73ID:pm09nqHo 知ってると思うんだけど、念の為
var=value command
この構文は、変数varにvalueを入れるだけじゃなくて
export varした状態になる。だからcommandが
外部コマンドであっても値は引き継がれている
(今回の話とは直接関係はない)
var=value command
この構文は、変数varにvalueを入れるだけじゃなくて
export varした状態になる。だからcommandが
外部コマンドであっても値は引き継がれている
(今回の話とは直接関係はない)
872デフォルトの名無しさん
2018/09/15(土) 18:00:22.45ID:pm09nqHo 話を簡単にすると
A=
A=123 eval :
echo $A
dashだと123と表示される。
bashだと何も表示されない。
A=
A=123 eval :
echo $A
dashだと123と表示される。
bashだと何も表示されない。
873デフォルトの名無しさん
2018/09/15(土) 18:15:21.72ID:SSTURz0o >>872
ふむ、bash で set -o posix してから実行すると 123 って表示されるね
ふむ、bash で set -o posix してから実行すると 123 って表示されるね
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】運命のW杯抽選会、NHK総合が生中継&DAZNが無料ライブ配信! 今夜 12月5日(金)26時~ ★3 [阿弥陀ヶ峰★]
- 【サッカー】運命のW杯抽選会、NHK総合が生中継&DAZNが無料ライブ配信! 今夜 12月5日(金)26時~ [阿弥陀ヶ峰★] ★2 [阿弥陀ヶ峰★]
- 渡邊渚「性を売ってるくせに」批判に反論 幻滅「これが涛本の現状だよbネー」「『渾身bフ下着!』といb、ような意味でb竄チてない」★2 [Ailuropoda melanoleuca★]
- ひろゆき氏、日中対立に 「結局、人口というのは国力なので。10億人以上いる国に、1億2000万人で対抗可能であるというのが間違い」 [冬月記者★]
- 渡邊渚さん脅迫か 写真集に包丁置く写真投稿 30代女性書類送検 渡邊さん「外に出るのも怖く身の危険を感じる」 [ひかり★]
- 【千葉】会社で58歳女性刺される 殺人未遂容疑で同僚の中国籍の男(39)逮捕 女性死亡 いすみ市 [ぐれ★]
- 【NHK他】FIFAワールドカップ2026 組み合わせ抽選★3
- 【NHK他】FIFAワールドカップ2026 組み合わせ抽選★2
- 【NHK他】FIFAワールドカップ2026 はじまらない組み合わせ抽選★3
- とらせんIP ★2
- こいせん 全レス転載禁止
- 巨専】
- 【NHK/DAZN/YouTube】FIFAワールドカップ2026組み合わせ抽選★2
- 【01:45NHK~】サッカーW杯2026グルーブ分け組み合わせ抽選会いよいよスタート! [339712612]
- 【NHK/DAZN/YouTube】FIFAワールドカップ2026組み合わせ抽選★1
- 【残酷な事実】VIPをやっていると頭が悪くなります
- w杯抽選ドラゴンが~グループステージ抽選始めます~
- 【風向き】ヤバい!高市が導入を検討する「防衛特別所得税」、ネトウヨらもまさかの反対の大合唱。。さすがに国民を舐めすぎたか? [219241683]
