シェルスクリプト総合 その28

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/07/24(火) 11:01:16.36ID:r0TJj2hB
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ: シェルスクリプト総合 その27(https://mevius.5ch.net/test/read.cgi/unix/1525337663/
2018/09/06(木) 20:33:38.49ID:DUG5skog
もう一つ

case '!' in
[\!]) echo OK ;;
*) echo NG ;;
esac

これを実行すると、kshだけNGって表示されるんだけどkshのバグ?
mkshだとOKなのに
2018/09/06(木) 22:05:19.31ID:DUG5skog
>>736はここじゃ知ってる人少なそうなんでこっちに移動しますね。

OS XをUnixとして使ってる人の為のスレ 18 [無断転載禁止]©2ch.net
https://egg.5ch.net/test/read.cgi/mac/1462475819/
2018/09/07(金) 03:14:55.87ID:SvYUtRYX
>>737
ブラケット内だけの特殊文字 ! (および ^) でのエスケープ対応が必須ならバグだし、言及してないとかだったら動作不定なだけだな
ブラケット内の ! と ^ でのエスケープが効く効かないの動作が違うのはcaseの場合だけじゃないよ
2018/09/07(金) 08:32:30.20ID:dfq99u5c
>>739

いろいろ挙動を調べたけど
1. ブラケット内で!のエスケープは必須ではないし、必要ない。
2. 多くの実装ではどんな文字でもエスケープできるため \! は ! と認識されるが、kshはそうではない
3. ブラケットの先頭に!をつけた、 [!・・・] は否定表現
4. 否定表現自体にはどの実装も対応している
5. 例えば[A]だとAにマッチだが、[!]だと否定表現として扱われる
6. kshでは[!]を否定表現として扱われるのを防ぐ方法がない
7. 普通は[]を使うときは2文字以上になるはずなので殆どの場合問題ない
 (ただし何かの処理で動的にパターンを生成している場合はありえる)

ってことなのかな?

ちなみにこれ、POSIXブラケット表現っていう名前なのかな?
2018/09/07(金) 08:42:27.12ID:SvYUtRYX
動的の場合もksh以外でもエスケープしなきゃならないんだから同じじゃね
[!] は文法上エラーのようなもんだから、そもそもブラケットで括らないとかなんかもう一文字入れて ! を2文字目にするとか
2018/09/07(金) 08:53:35.87ID:dfq99u5c
あー、動的っていうのは、
> そもそもブラケットで括らないとかなんかもう一文字入れて ! を2文字目にするとか
ということをしたいんだけど、
ここが設定ファイルに書かれている文字とかで
ユーザーが1文字を指定してしまった場合
とかいうことです。

まあ1文字なら[!]じゃなくて!にするようにすればいいんですが。

> 動的の場合もksh以外でもエスケープしなきゃならないんだから同じじゃね
ksh以外だとエスケープして [\!] と書けばOKですが、
kshだとエスケープして [\!] と書いてもNGという問題です。
2018/09/07(金) 09:02:06.16ID:SvYUtRYX
POSIXブラケット表現は違うんじゃないかなあ
ブラケットだけを何というのか知らんけど、パターンマッチング、ワイルドカード、グロブ定義のひとつかな。グロブがどうやららしいがそんな言葉使ったことないw
2018/09/07(金) 09:04:59.23ID:SvYUtRYX
>>742
細かく拘ってるけど、なに言いたいのかちょっとわからないねえ。本題と関係ないってことでいいね?
2018/09/07(金) 09:18:53.90ID:dfq99u5c
Bracket Expression
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05

ワイルドカードっていうのは仕様ではなく何にでも使える文字という意味でしか無く
globはファイル名に展開するもののことだと思いますよ
2018/09/07(金) 09:27:59.54ID:SvYUtRYX
じゃ、パターンマッチングでいいよ。めんどくさいw

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13
2.13.1 Patterns Matching a Single Character
では、エスケープ対応しろと読めるような気がしないでもない。が、! 関連ではエスケープだけじゃなく動作が違うな、dash/bash/kshでは(bashだけが違うというのもある)
2018/09/07(金) 09:40:21.51ID:dfq99u5c
あー、やっぱりバグな気がしてきました。
一旦変数に入れるとkshでもOKになりました
ちなみにksh以外とはbash、zsh、dash、yash、posh、mkshのことです。

# 挙動を合わせるためposix互換モードにしています
# もしかしてkshにも似たようなのありますかね?
# kshでPOSIXLY_CORRECT、set -o posixは使えませんでした。
[ -n "$BASH_VERSION" ] && set -o posix

[ -n "$ZSH_VERSION" ] && emulate -R sh


expression='[\!]'
case '!' in
$expression) echo OK ;; # ksh、ksh以外でOKになる
*) echo NG ;;
esac

case '!' in
[\!]) echo OK ;; # ksh以外でOKになる
*) echo NG ;; # kshだけNGとなる
esac
2018/09/07(金) 09:44:26.93ID:SvYUtRYX
なんか「バグ」にこだわっているようだけど、バグだったらバグレポートでもする気なの??
bashの [a!] の場合の方が大きな問題のような気がしないでもないが、それもエスケープすればすむのでkshさえなのかな??
2018/09/07(金) 09:52:52.93ID:dfq99u5c
>>748
> bashの [a!] の場合の方が大きな問題のような気がしないでもないが、
どういうことでしょうか?
試してみましたが、どの環境でも想定通り動いているようですが。
↓検証コード

[ -n "${BASH_VERSION:-}" ] && set -o posix
[ -n "${ZSH_VERSION:-}" ] && emulate -R sh

expression='[a!]'
case '!' in
$expression) echo OK ;; # すべてでOKになる
*) echo NG ;;
esac

case '!' in
[a!]) echo OK ;; # すべてでOKになる
*) echo NG ;;
esac

!は最初に持ってきたときだけメタ文字扱い(エスケープが必要)で
途中にあってもエスケープは必要ないみたいですね。
(むしろエスケープしないほうが良いみたい。後述?)
2018/09/07(金) 09:57:25.65ID:SvYUtRYX
ああ、すまん勘違いしてた。コマンドライン上での ! でのヒストリからの展開だった
2018/09/07(金) 10:04:32.56ID:dfq99u5c
!が最初以外にある場合に、\! とエスケープするとどうなるか?ですが挙動がバラけました。

[ -n "${BASH_VERSION:-}" ] && set -o posix
[ -n "${ZSH_VERSION:-}" ] && emulate -R sh

expression='[a\!]'
case '\' in
$expression) echo OK ;;
*) echo NG ;;
esac

case '\' in
[a\!]) echo OK ;;
*) echo NG ;;
esac

# 変数に入れると a \ ! のいずれかだと判断されている
#(\はエスケープ文字列として認識されていない)
ksh  OK  NG
zsh  OK  NG
yash  OK  NG
posh  OK  NG
mksh  OK  NG

# 変数に入れると a ! のいずれかだと判断されている
#(\はエスケープ文字列として認識されている)
bash  NG  NG
dash  NG  NG

変数に入れない場合は、どちらも\はエスケープ文字列として認識されている
2018/09/07(金) 10:11:14.19ID:dfq99u5c
まとめると、どのシェルでも同じように動かすには

1. 可能ならば!は[]の最初に書かない
2. 1を満たしている場合には、!はエスケープする必要はない(しても良い)
3. !が[]の最初に書く場合は変数に入れてマッチングさせる
4. 3の場合には、!はエスケープする

というところでしょうか?
2018/09/07(金) 10:11:47.58ID:SvYUtRYX
んー、発表会なの??どうすんのかどう書くのかじゃないのか??
2018/09/07(金) 10:13:19.48ID:SvYUtRYX
! を文字としてなら、ブラッケットで括らない、他の文字があるなら2文字目以降にする
だけじゃないのかなあ
2018/09/07(金) 17:31:04.46ID:+cI6iexZ
>>736はへえと思ったけど他は正直どうでもいい
シェルによって違いはあるものだし同じシェルでもバージョンによっても違うかもしれないし
2018/09/08(土) 12:02:12.04ID:t/+GvP7Y
文字列の末尾がLFのものを別の変数に入れる場合、
b=$a ってするしかないかな?
b=$(foo "$a") ってやったら消えるよね

関数で処理した結果を変数に代入したいんだけど、文字列末尾のLFは消したくないし、
LFはない場合も複数個の場合もあるので無条件にLFつけたりもできない
2018/09/08(土) 12:14:51.45ID:S5S855ao
IFS
2018/09/08(土) 12:29:20.28ID:S5S855ao
IFS変更しなくてもb=$(foo "$a")ってやったら消えてないじゃん。"$a"ならば
2018/09/08(土) 12:57:29.41ID:t/+GvP7Y
消えますよ

[test.sh]
IFS=""
LF=$(printf '\012_') LF=${LF%_}
a="test$LF$LF$LF"
foo() { printf '%s' "$1"; }

printf '%s' "$a" # 1つめのテストの末尾のLFは消えていない
b="$(foo "$a")"
printf '%s' "$b" # 2つめのテストの末尾のLFは消えてる

[実行]
test.sh | hexdump -C

00000000 74 65 73 74 0a 0a 0a 74 65 73 74 |test...test|
2018/09/08(土) 13:25:21.83ID:wZDaW80s
foo() { printf '%s ' "$1"; } とすると挙動が変わるんだね
2018/09/08(土) 13:28:37.24ID:t/+GvP7Y
違う。$(・・・)をすると挙動が変わる(末尾のLFに全削除の効果)

foo "$a" だけなら末尾のLFは消えない
2018/09/08(土) 13:38:57.95ID:wZDaW80s
Command substitution の仕様ってことね。

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03

> removing sequences of one or more <newline> characters at the end of the substitution.
2018/09/08(土) 13:54:13.20ID:t/+GvP7Y
そういやファイル名やディレクトリ名に改行を含めるべきかどうか
POSIXで議論してるみたいな話が上の方で書いてあったけど
名前の末尾に改行が含まれてる場合に消えるから
dirnameやbasenameで取得できないってことになるな。
もういい加減仕様で含めるのやめればいいのに
2018/09/08(土) 16:24:05.28ID:xje6Dohs
実際名前に改行含めるような仕事したくないけどな
2018/09/08(土) 16:39:55.00ID:S5S855ao
>>763
あんたって決して自分のミスは認めないのね。うやむやにするいつもの人でしょ
2018/09/08(土) 16:53:13.12ID:SescvIaG
>>765
一人で何の話してるの?
2018/09/08(土) 16:55:08.56ID:SescvIaG
> IFS変更しなくてもb=$(foo "$a")ってやったら消えてないじゃん。"$a"ならば

消えますよ?だからまず自分のミスを認めましょうってことですよ。
2018/09/08(土) 16:58:21.15ID:SescvIaG
自分のミスはちゃんと認めましょう。

認めるまで言い続けますよ
2018/09/08(土) 16:59:06.30ID:SescvIaG
> IFS変更しなくてもb=$(foo "$a")ってやったら消えてないじゃん。"$a"ならば

>>759を読みましょう。
明らかに消えています。

あなたのミスですよね?
実験もしないで嘘ばっかり
2018/09/08(土) 22:31:06.03ID:B+r7WAvB
なんか病人多いなここ最近
2018/09/09(日) 00:05:42.19ID:MseSAwkB
うん
2018/09/09(日) 01:30:00.09ID:40h5Vf3t
alias wgeti='wget -ci <(cat <<_'
エイリアスでwgetをちょっと弄ったんですがこれの関数版作れないですかね
これで複数行のURLをDLできるけど最後に_と)入れる必要あるので
2018/09/09(日) 11:41:02.87ID:ZnXA8VyU
bashの拡張機能で便利なのってなんだろうか?
変数展開は便利だと思うんだが、
配列とかハッシュとか必要なんだろうかね?

配列は標準入力から受け取ってループで回せば良いわけで
それが必要になった時点で使い方を間違ってるという気がしてる

他にbashで便利なものってあるかな?
pipefailぐらい?
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
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 -
}
776デフォルトの名無しさん
垢版 |
2018/09/10(月) 00:47:57.63ID:hUyLWeb6
それってこれでいいのでは?

wgeti () {
wget -c $@
}
2018/09/10(月) 00:48:53.10ID:hUyLWeb6
ああ、でも、引数にするなら何もしなくていいのかw
そのまんま wget の後に URL 入れるだけだ。
2018/09/10(月) 02:03:17.65ID:P2aNZV+z
標準入力からURLのリストを渡したいから
<(cat <<_って書いてあるんだと思った。
wget、普通に引数から複数のURL渡せるね
2018/09/10(月) 02:36:11.00ID:MLFQqRH+
コマンド引数の文字数制限に引っかかる可能性を
考慮すると wget -ci <(cat <<_ の方が無難なのだろう
(xargs でもいいけど)
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だけ設定したくても、すべての引数を設定する必要があるけど。
グローバル変数は時に分かりづらいバグを生むことがあるけど
これをうまく使えば、使用する変数をなくせたり減らせたりするかもしれないな
2018/09/10(月) 23:57:57.78ID:3w8KnLJN
ダイナミックスコープはperlとかpowershellとかmathematicaとかにもあるけど、これもグ口ーバル変数並にバグの温床な気がする
2018/09/11(火) 01:49:50.99ID:oHtbKRPF
あぁ、これがダイナミックスコープのことなのか
Perl?って思ったけど、(Perlの)localを使った場合の話なのね。
通常はmyを使ってたから。
2018/09/13(木) 14:07:12.80ID:q7iUBK5M
ふと思ったんだけどシバンってあるじゃんシバン
あれってさ、#がコメントじゃない言語だったらどうするの?
Cインタプリタだったら

//!/usr/local/bin/c

とか書くの?
2018/09/13(木) 15:47:52.06ID:CY4XgXEU
>>783
あれはカーネルが解釈してるからだめ。
2018/09/13(木) 16:45:07.13ID:1sKEH3Wo
>>784
シバンってカーネルが解釈してんのか
だからFreeBSDとOS XとGNU/Linuxで挙動が変わるんだな。同じbashでも。
2018/09/13(木) 17:23:01.88ID:CY4XgXEU
>>785
別問題じゃね?どんな挙動?
2018/09/13(木) 21:25:29.73ID:fcPV9kIu
>>783
面白いネタを振ってくれてありがとう。いろいろ調べて勉強になったよ。
ちなみに質問の答えは「できないとは限らない」ということになるかなあ。
ネタを振ってくれたことには感謝するけど、自分で調べるほうが楽しいよ。
2018/09/13(木) 21:47:40.27ID:mocTFwRb
今日の荒らしは ID:fcPV9kIu か。NG推奨
2018/09/13(木) 22:02:34.22ID:QPFUtiyL
落ち着け
2018/09/14(金) 04:16:04.32ID:q3l06dS7
>>786
FreeBSDだと
#! /usr/bin/env awk -f
これが普通に通るけど
GNU/Linuxだと
“awk -f”なるコマンドがないとかなんとか言われる
2018/09/14(金) 05:06:28.57ID:hVbFTBye
素朴な疑問
・ shebangは シェバン? シバン?
・ "#!"の後にスペース入れずに "#!/bin/sh" ? スペース入れて "#! /bin/sh" ?
自分はともに前者、特にスペースについては入れるべきではないというの最初に覚えたんだけど、
結構後者も目にすることがあるので、実際のところ、どうなの?
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 内のホワイトスペースが引き数の区切りとなる。
2018/09/14(金) 09:40:37.87ID:CXa+ZLzo
>>790
本題のshebang仕様とは話がずれるが、
awkはいにしえの奴も含め俺の知る限りすべて/usr/bin/awkで起動できるから
env使う必要ないと思う。
2018/09/14(金) 09:48:01.90ID:CXa+ZLzo
>>791
#! の後のスペースは、どのOSでも有無に関わらず動いたと思う。
ただしshebang行に32バイト制限のあるOS があったので、
それに引っかかるギリギリならスペース無しにする必要アリ。

読みは知らない。
2018/09/14(金) 10:54:54.26ID:6xTUz+7n
>>793
自分でビルドしたawkを使う場合は?
2018/09/14(金) 12:12:08.80ID:CXa+ZLzo
>>795
システム付属じゃ駄目で、自分でビルドした特有の事情があるなら、絶対パス指定で呼べばいいのでは?
2018/09/14(金) 16:14:10.39ID:6xTUz+7n
>>796
それだと実行権限の意味がなくなるじゃん
実行権限をつけるのは、いちいち実行プログラムのパスを指定しなくていいからでしょ?
拡張子もなくせばなんの言語で作られているかも意識しないですむし。

手でコマンドを打ったときと同じように、環境変数の$PATHからどれを使うかが決まる。
そもそもなんで最初からそういう仕組みにして置かなかったんだろう?
そうすりゃシバンなんて #!awk だけですんだのにね
2018/09/14(金) 16:33:58.92ID:gmWhNmZA
実行権限は絶対パスでも相対パスでも必要なので関係ない
2018/09/14(金) 16:35:21.26ID:KKMncdOE
スクリプトのパスとインタプリタのパスを混同している
2018/09/14(金) 16:36:11.79ID:6xTUz+7n
>>798
シバンの話だよ
実行するスクリプトのパスじゃなくて
実行するスクリプトが使用するインタプリタのパス
2018/09/14(金) 16:46:56.10ID:gmWhNmZA
シバンの話は分かってるけど?
実行するスクリプトが使用するインタプリタに実行権限付いてなかったら
当たり前だけど絶対パスで指定したって実行できないよ?
2018/09/14(金) 16:49:01.41ID:CXa+ZLzo
>>797
なんか誤解してる?
絶対パスで書くってのは
#!/home/me/bin/awk -f
みたいに書くって意味だよ。
2018/09/14(金) 16:53:40.07ID:UfVRD/gP
>>794
> shebang行に32バイト制限のあるOSがあった
なるほど、そんな理由もあったんだね。

逆にスペースorタブを入れなければならない、なんていう例(4.1BSD)もあったみたいだ。
これについては修正されたようだけど、今でもこれを守っている人もいるらしい。

同じ#で始まっていても、コメントとは違うと思うから、
やはりスペースを入れることにはなんとなく躊躇しちゃうわ。
2018/09/14(金) 18:40:33.82ID:q3l06dS7
俺は半分脳死状態で
#! /bin/sh -
↑半角スペース ↑ハイフンマイナス
にしてるわ。

上でも書いてくれた人がいるけど,#!の後に空白が必要な環境があったり
先頭行から継続してパースしてしまい
(ほとんどありえないことだけど)
#! /bin/sh

-c
みたいなファイルに対し
/bin/sh -cというオプション付きshインタプリンタを起動してしまうOSもあるみたい
(オライリーのシェルスクリプト本に記述あり)
2018/09/14(金) 18:50:01.26ID:hBiQ1eS5
- で閉じるのはオレもやってるけど、
シバンの後のスペースは入れない
#!/bin/sh -
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 を見て欲しい
807デフォルトの名無しさん
垢版 |
2018/09/14(金) 19:21:44.66ID:za5qG/O1
なんかいろいろ誤解しとるw
2018/09/14(金) 19:27:29.88ID:EsLYvq4M
>>806
何をしたいとかは別として、実装としてできないんだよ。
カーネルのシステムコールexecveはPATHを見ない。
PATHを見てるのはユーザランドのライブラリ関数のexecvpとか。
大改造が必要になる。
2018/09/14(金) 19:38:49.59ID:6xTUz+7n
>>808
実装としてできないってどっちの話?

勘違いしている人がいて、話の前提で止まっている人がいてややこしいけど
>>806の話は理解した上で、俺が提案した #!awk でいいじゃんって話だよね?

PATHを見れないというのなら、見る必要はないよ。
#!awk -f という記述(絶対パスでないもの)を決め打ちした文字(/usr/bin/env )を
頭に入れて #!/usr/bin/env awk -f として解釈すればいいだけ

どういう文字を頭に入れるかはディストリが決めたカーネルの
ビルドオプションででも設定すればいいだろう

単なる文字列の変換でしかないので、カーネルだけでできる
2018/09/14(金) 20:18:23.13ID:EsLYvq4M
カーネルが特定の決め打ちしたバイナリを呼ぶようなことはないよ。
せいぜいinitだけ。
2018/09/14(金) 20:29:56.82ID:6xTUz+7n
そういう中途半端なレスはやめて欲しい。
結局>>809の方法で可能だってことだろう?
そうでないなら、そうでないとわかるように理由を添えて書いてくれ
2018/09/14(金) 20:33:39.49ID:EsLYvq4M
それほど言うなら試しにlinuxのパッチ書いて投げてみたら?
2018/09/14(金) 20:33:54.17ID:6xTUz+7n
補足すると>>809読めばわかると思うけど、読み取ったシバンの文字列を置き換えるだけ。
だからカーネルが特定の決め打ちしたバイナリを呼ばないというのが事実であっても
読み取ったシバンの文字列を置き換える話と無関係の話ということ
2018/09/14(金) 20:35:05.30ID:6xTUz+7n
>>812
話がすり替わってる。

技術的に可能かどうかの話をしている所に、
じゃあってみせろと言われても、
それは関係者を説得するのは難しいだろう?別の話だろ?
2018/09/14(金) 20:36:01.42ID:EsLYvq4M
可能か不可能かで言えば、もちろん可能だよ。なんだって可能。
でも、カーネルとユーザランドは明確に分けろって怒られるだろうね。
2018/09/14(金) 20:39:33.43ID:6xTUz+7n
>>815
話聞いてるか?
シバンはカーネルが読み取るもの
ユーザーランドのものには一切手を出していない。
読み取ったシバン文字列を置き換えるだけなんだから
2018/09/14(金) 20:39:41.70ID:1jWDqP4V
>>809
カーネルいじればそれは可能だな。
カーネル書ける人なら目茶目茶難しいってほどじゃないから、
カーネル書ける人雇えばいいぞ!

ただしそれを標準カーネルの機能として入れてもらえるように
議論するのは、カーネルに機能追加するよりだいぶ大変かも。
#! じゃない別のmagic文字列にした方が提案通りやすいかもな。
頑張れw
2018/09/14(金) 20:42:06.79ID:6xTUz+7n
>>817
技術的に可能でありユーザーランドを触ってないってのは同意したの?

だから関係者と話をつけるのが難しいっていうのは
別の話だから、すり替えるのはやめてくれと行ったんだが
2018/09/14(金) 20:43:14.61ID:6xTUz+7n
つーか、いい加減にしないといつもの荒らしモードに入るぞ?w

議論に負けそうになると、話をすり替えて、
俺を呼ばわりするのはいつもの手だよなw

もうそろそろ荒らし認定することだと思ってるんだが?w
2018/09/14(金) 20:43:32.04ID:6xTUz+7n
訂正

俺を荒らし呼ばわりするのはいつもの手だよなw
2018/09/14(金) 20:46:17.92ID:6xTUz+7n
反論しないならさっさとNGIDに入れて
俺に反論できない状態を作ってくれよ?

見れなくなったら俺に反論できないんだから
それこそ俺の望んだ結果だw

はい、結論。>>809の方法で技術的には実現可能です。
反論がある人は、関係者を説得して調整をするのが難しいって
別の話にすり替えないで技術的な話でお願いしますねー
2018/09/14(金) 20:46:23.72ID:1jWDqP4V
>>818
なんか別人と勘違いしてるようだが、俺は技術的にできないと書いたことは一度もない。

この勝手に勘違いしてるあたり、もしかしていつもの人か?
2018/09/14(金) 20:48:41.19ID:6xTUz+7n
>>822
はい、技術的な内容を長文で書いて
相手を論破するのは、いつもの俺のパターンw
2018/09/14(金) 20:48:54.07ID:1jWDqP4V
だって勝手に勘違いして勝手な仮定して勝手に腹立ててるんだもん。

せっかく賛成してた俺まで敵視しだす有り様だし。
自業自得ってことよ。
2018/09/14(金) 20:51:13.71ID:jAge75Zy
長文ってだけでとりあえずスクロールする
2018/09/14(金) 20:54:16.23ID:6xTUz+7n
>>824
5ちゃんねるなんだからこの程度のもんよ

こっちが真面目に話をしていても、とりあえず何か言い返せば
それが反論したことになるみたいな、みたいなクソみたいなレスしてくる

いい案だと思うなら一言「それはいい考えだ」ぐらい書けと
自分が間違っていたら、素直に間違いを認めるやつばかりなら、
それもこんなにどうでもいいことを、毎回書かなくてすむんだよ
2018/09/14(金) 20:58:13.19ID:EsLYvq4M
>>816
ファイルシステムの構成に何らかの仮定を置いた時点でユーザランドと分離できていない。
2018/09/14(金) 20:59:16.05ID:EsLYvq4M
ちなみに俺はIDずっと変えてないよ。
2018/09/14(金) 20:59:57.05ID:6xTUz+7n
>>827
ファイルシステムの構成に仮定をおいたりしてない
単にシバン文字列を置換するだけ
2018/09/14(金) 21:08:41.85ID:EsLYvq4M
>>829
仮定せずにどうやって/usr/bin/env付ければいいってわかるの?
2018/09/14(金) 21:12:09.04ID:6xTUz+7n
>>830
単なる文字列の置換に過ぎない
カーネルはシバンがファイルパスなんて思ってない。

カーネルがシバンを読み取るというのなら、少なくとも
読み取ったものがシバンであるということはわかってる
あとはそこににある文字列が、ファイルパスだろうが
ランダム文字列だろうが関係ない

単に#!の後に固定の文字列を埋めるだけ
あとは後続のプログラムに渡せば、
そいつが勝手になにかしてくれるんだろ?
それはカーネルの知ったことじゃない
2018/09/14(金) 21:30:49.25ID:gmWhNmZA
この話と実行権限が関係ないのは理解できたのか?
2018/09/14(金) 21:44:08.73ID:6xTUz+7n
>>832
お前1人で意味不明の話をしてるんだってw

(awkスクリプトで書いた)fooコマンドが実行できるのは
fooコマンドに実行権限がついているからだし、そのfooコマンドの
シバンで指定されたプログラムも実行権限がついていなければいけない

当たり前の話だが、上記の理由により awkであっても /usr/bin/envを
使っておいたほうが良いって結論を言ったんだが、
それに対して前は何の話をしてるのだ?
2018/09/14(金) 21:46:58.87ID:6xTUz+7n
どうもこの話を理解できないのが、おかしいと思うんだが、
もしかしてawkスクリプトに実行権限をつけるという発想がないのか?
いつもawk -f スクリプトファイル名 で実行してるとか?

いや、まさかな。
シバンはスクリプトファイル名だけで実行するためにあるんだし
そのために実行権限つけるだろう。

でもなぁ、ここまで以上に理解能力がないのは、
まかさが的中しているとしか思えない。
シバンをつける意味もわかってなかったりしてw
2018/09/14(金) 21:49:19.68ID:jAge75Zy
ここまでの話全く読んでないけどawk実行させる時は-f使うわ
2018/09/14(金) 22:00:24.41ID:6xTUz+7n
>>835
ということは、シェルスクリプトを実行させるときはsh使って
perlスクリプトを実行させる時はperlを使ってるのかな?

かつてsystemdが普及するまではみんなが使っていた
serviceコマンドやbyobuはシェルスクリプトだし
apt-fileやshasumはPerlスクリプトだし
ufwはPythonスクリプトだよ

実装がなんのスクリプト言語で作られているかなんて気にしなくていいじゃないかw
2018/09/14(金) 22:02:01.56ID:jAge75Zy
shは実行権限つける
perlは場合による
意味はない
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況