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

■ このスレッドは過去ログ倉庫に格納されています
2021/10/05(火) 22:49:30.91ID:KsbWuyFp
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
・「POSIX原理主義」「ユニケージ」「USP研究所」はPOSIXとUnixを曲解し
間違ったシェルスクリプトを広めている宗教です。洗脳されないようにしてください。

前スレ: シェルスクリプト総合 その36
https://mevius.5ch.net/test/read.cgi/tech/1614212414/

関連スレ
・【Bash】Windows Subsystem for Linux【WSL】11
https://mao.5ch.net/test/read.cgi/linux/1627507889/
・Bashでプログラミング [転載禁止](c)2ch.net
https://mao.5ch.net/test/read.cgi/linux/1443885102/
・シェルスクリプト総合 その28
https://mevius.5ch.net/test/read.cgi/unix/1533154936/
・zsh その7
https://mevius.5ch.net/test/read.cgi/unix/1337844883/
・過去UNIXで使われていた ksh というシェルについて
https://mevius.5ch.net/test/read.cgi/unix/1582358403/
・【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net
https://mevius.5ch.net/test/read.cgi/unix/1443103705/
・おまえら! shell は何を使っているんですか?
https://mevius.5ch.net/test/read.cgi/unix/1012330865/
2021/10/05(火) 22:50:14.38ID:KsbWuyFp
・特記なき場合、POSIX準拠シェルが既定です(古きBourneシェルはほぼ絶滅しました)
 POSIX準拠シェルは(d)ash, bash, zsh, (m)ksh, yash, posh, (p)boshです
 参考 https://unix.stackexchange.com/questions/145522/
 特定のシェルの専用機能に依存する場合は明示しましょう(特にPOSIX準拠シェルではないfish, (t)csh等)
・POSIX準拠シェルのおすすめは?→多く使われているのはDebian/Ubuntu系のdashです
・bashでいいじゃん→bashがインストールされてない環境があります。環境によってデフォルトシェルの実体は異なります
  Debian系 … dash   CentOS系 … bash   Alpine … busybox ash  Android … mksh
  FreeBSD … ash   Solaris,OpenBSD … ksh
  macOS … bash(Single UNIX Specification準拠のために一部動作が異なる)
・macOSはzshなんだよね?→ログインシェルがzshに変わっただけで/bin/shはbash 3.2です
・シェルスクリプトは可搬性を持たせるために可能な限りPOSIXに準拠しましょう
 仕様 http://pubs.opengroup.org/onlinepubs/9699919799/
・シバンになにを使えばいいの?→POSIX準拠してるなら#!/bin/sh、bashなら#!/bin/bashか#!/usr/bin/env bash
・bash依存はなるべく避けましょう。自覚なきbashism。シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?
・Bourneシェル(≒POSIXシェル)はPOSIX標準化前にUNIXで使われていたシェルで多くの亜種が存在します
 Version 7 UNIXのshに一番近いのはOpenSolaris由来のHeirloom Bourne Shell、次点でSchily Bourne Shellのoboshです
  Heirloom Bourne Shell: sh http://heirloom.sourceforge.net/sh.html
  Schily Bourne Shell: obosh http://schilytools.sourceforge.net/bosh.html
 歴史的資料 https://www.in-ulm.de/~mascheck/
・csh/tcshでのシェルスクリプトは*まったく推奨しません*
  参考 http://www.speech-lab.org/~hiroki/csh-whynot.euc
・Linux/UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。Manページや各種リンクを見ましょう
・ワイルドカード・パターンは正規表現ではありません。正規表現の話題は正規表現スレへ
・シェル芸とシェルスクリプトは全く異なります
・シェルスクリプトのことをシェルってゆうな
3デフォルトの名無しさん
垢版 |
2021/10/06(水) 17:20:42.12ID:XJEs7oM2
2ゲット
4デフォルトの名無しさん
垢版 |
2021/10/08(金) 03:54:38.51ID:LzOvy0cf
3げと
5デフォルトの名無しさん
垢版 |
2021/10/09(土) 07:02:28.75ID:F/g3bnt2
げっとわいるど
6デフォルトの名無しさん
垢版 |
2021/10/12(火) 17:53:02.51ID:elEZT6pO
つーか真偽値の問題じゃなくて
シェルスクリプトのifが終了ステータスを判断するコマンドってだけだろ
7デフォルトの名無しさん
垢版 |
2021/10/12(火) 17:54:35.21ID:elEZT6pO
あとシェル関数が返すのも終了ステータス
戻り値じゃない、そもそも終了ステータスしか返せないだろ
returnだからって他の言語のretruntを同じだと思うなよ
2021/10/12(火) 17:59:10.51ID:FcrICImt
>>6
だから真偽値の問題でしょw
お前、いい加減自分で何言ってるかわかってないだろw
それを言ったらC言語のifだって値を判断するだけのコマンド(文)って
なっちゃうだろwww

だれかがboolean型持ち出したから、混乱してんのかもしれないけど、
昔のC言語にはそんな型ねーからな?w
2021/10/12(火) 18:01:19.29ID:FcrICImt
結局、Cでも(その他でも)シェルスクリプトでさえも、
ifってのは式の値を真偽に判断するものなんだよ。
2021/10/12(火) 18:04:36.01ID:FcrICImt
だから、シェルスクリプトが他と違って特殊なのは、
式の値を0の場合を真と判断するところ、だけだよ。
それがexit statusであるかとかは全く関係がない。
要点はそこだけ。
2021/10/12(火) 18:05:26.22ID:h64P2lE5
>>ID:FcrICImt
本当に、前スレ>>984で言われた通りだな
if command; then
で、commandのとこにコマンドを書いたことないのか?

プログラミングにおいて、問題なく実行できたら別にどうとかはないが、失敗した時には原因が欲しいのは当然
コマンドの実行においても同じ。だから、成功できた場合は 0 で、それ以外の値は失敗になるのも当然。エラーの場合のExit Statusの値を規定できてなかった/してなかったからから「含み」を持たせてるだけになってるが
(よくわからんが、JCLとやらも同じそう)

>シェルスクリプトで、0がノーエラーでなければいけない理由はif文の条件式の判定が
>特殊だから。
逆だよ、上に書いてある通り、また、前スレ>>936のK&Rが言っている通り、0 が正常(お前の言う「真」)が先だよ

シェルスクリプトがコマンドを実行するためのものなんだから、成功=0(=お前の言う「真」)とするのも独特でもなんでもないな。他の言語と比べると独特と見えるのかもだが
command && command
とか、常識的に見えるだろ?上手く整合性があるようにできてるんだよ

つづく
2021/10/12(火) 18:05:36.77ID:h64P2lE5
つづき

真偽に拘りたい真偽でしか理解できないなら、
他の言語は 「評価式の結果 != 0」
シェルスクリプトは「コマンドを実行した Exist Status == 0」
がどちらも暗黙的に行われてると思えばいいだろ
これなら純粋(=完全な2値になる)真偽だしな

他の言語で
value = 何か
if (value != 0)
...
シェルスクリプト
if コマンドのExit Status == 0; then
...

前スレ>>989なんて言ってるけど、確かにWindows APIはBooleanで返すのが多い
だがそれはWindows APIの文化でしかない、シェルスクリプトの本家wであるUnixで何か書いたことがあるなら文化が違うとわかりそうなもんだが、なぜかWindows APIのが全てと言ってそうな前スレ>>989
WSLからのにわかか?
何かまだ言い張ってるなあ
2021/10/12(火) 18:06:45.20ID:FcrICImt
あ、あとついでに言っとくと、終了コードを判断するしかないのは、シェルスクリプト
はそれ自体がそもそも計算ができないからw
そうならざるを得ないのは、この点にかかるw
2021/10/12(火) 18:09:14.05ID:h64P2lE5
もうにわかの勝手な妄想爆発と思うしかないなw
2021/10/12(火) 18:16:00.36ID:FcrICImt
ID:h64P2lE5はそもそもプログラミング言語というものを理解できてないんだなw
いや、プログラミングが理解できてないのか?w
あと日本語も多分理解できてないんだろうなw

で、結局、ID:h64P2lE5は何が言いたいんだ?w
もうさっぱり分からんよw
2021/10/12(火) 18:19:01.30ID:FcrICImt
え?まさか、>>10を否定しているの?w
シェルスクリプト以外のプログラミング言語を少しは勉強したら?w
つかシェルスクリプトも書けそうな気がしねーけどな、ID:h64P2lE5はw
2021/10/12(火) 18:20:12.34ID:h64P2lE5
>>15
お前にわかりやすいように書いてやったのにw
全く理解できないんだな。もしくは認めたくないからのか?その何の内容もないただの無意味な誹謗wなのだけは
2021/10/12(火) 18:21:35.92ID:h64P2lE5
>>16
お前の根本的なプログラミング/プログラミング言語の誤った理解だよ、否定してるのは
よく「日本語も多分理解できてないんだろうな」とか言えるな
2021/10/12(火) 18:22:26.42ID:FcrICImt
>>17
だから、結局何が言いたいんだよw
お前の文章は支離滅裂で関係ないところに
あっちこっち飛ぶから、ものすごくわかりにくいよw
まずは、>>16に答えてくれやw
2021/10/12(火) 18:24:29.03ID:h64P2lE5
>プログラミング言語というものを理解できてないんだなw
>いや、プログラミングが理解できてないのか?w
>あと日本語も多分理解できてないんだろうなw
>シェルスクリプト以外のプログラミング言語を少しは勉強したら
>つかシェルスクリプトも書けそうな気がしねーけどな
>お前の文章は支離滅裂で関係ないところにあっちこっち飛ぶから
すげえな、改めて見ると。この異常さは何か察してしまうな
2021/10/12(火) 18:25:31.96ID:FcrICImt
>>18
「根本的なプログラミング/プログラミング言語の誤った理解」をしているのはお前だよw

例えば、Cでさ、
if (0) {printf("true");}else {printf("false")}
として実行したら何が表示されると思う?w

trueが表示されると思ってる?w
2021/10/12(火) 18:27:51.86ID:h64P2lE5
>>21
>>12で既に書いてるんだけどな

そんな初心者的な問いかけををして...可哀想に
俺が初心者にも劣ると?馬鹿にしてるつもりなんだろうが、そんなこと平気で書けるお前の程度が知れるだけ
御愁傷様です
2021/10/12(火) 18:28:56.01ID:FcrICImt
>>21
まあ言わずもがなだろうけど、
同様のコードで、trueが表示される言語を
俺はシェルスクリプト以外に知らないわw
他ある?w
2021/10/12(火) 18:29:58.72ID:h64P2lE5
>>23
>>11に既に書いてる
2021/10/12(火) 18:30:33.61ID:h64P2lE5
読まないやつのはもう知らんぞ
2021/10/12(火) 18:30:59.65ID:FcrICImt
>>22
初心者的な問いかけされてるのは、
お前がそう疑われてもしょうがない言動を
してるからしょw甘んじるよりしかたなかろうw

で、御託はいいから答えなよ。初心者じゃないつもりならw
2021/10/12(火) 18:32:00.93ID:FcrICImt
>>25
逃げるんだったら黙って逃げろ。
見苦しい
2021/10/12(火) 18:32:21.39ID:h64P2lE5
>>26
>俺が初心者にも劣ると?馬鹿にしてるつもりなんだろうが、そんなこと平気で書けるお前の程度が知れるだけ
本当に読まないな、お前は
2021/10/12(火) 18:34:03.18ID:h64P2lE5
>>27
自分は見苦しくないと思ってるのか...マジもんかよ
お前の行動なんてある意味もう見透かされてるんだけど、それにも気づかないしなあ、お前は
2021/10/12(火) 18:34:40.41ID:FcrICImt
>>28
自分の発言の引用?w
お前こそ読めよw
答えろよw

そもそも==ってのは「比較演算子」であって、
2021/10/12(火) 18:37:47.06ID:FcrICImt
あーあ、ミスってしまったw

そもそも==ってのは比較演算子であって、値を算出するものだ、ってのは理解してるかな?w

ま、読まないし、聞かないし、基礎もだめ、なのを相手にしても無益か。
ID:h64P2lE5
は結局、核心を突かれた質問をされると相手を罵倒して逃げるだけのクズだということでw
2021/10/12(火) 18:38:48.32ID:h64P2lE5
>>30
>>11に既に書いてるのに、理解できてないと思えるお前の頭の七不思議
2021/10/12(火) 18:39:27.41ID:h64P2lE5
>>31
また変なこと言い出してるw
2021/10/12(火) 18:40:50.86ID:h64P2lE5
>>31
そんなことも平気で言えるんだからなあ...つくづく程度が知れる
それも>>11に書いてることだぞ
2021/10/12(火) 18:43:19.24ID:h64P2lE5
>>32,34
>>11 でなくて >>12
読まない D:h64P2lE5 が悪いw
いや、すまん
2021/10/12(火) 18:46:33.75ID:FcrICImt
>>34
お前さ、本当に俺の書いてあること読めてる?理解できる?
お前のようなやつを「おさとが知れる」っていうんだぞ?w
ボキャも貧弱で、おまえの日本語能力すらも程度が知れるんだがw

だからさ、結局、何が言いたいの?w
シェルスクリプトの真偽判定は特殊ではない、
Cと同じだ、と言いたいの?w

で、それは違うよ、って言ってるんだけど、まだ分からない?
日本語が理解できないの?w
2021/10/12(火) 18:49:13.63ID:FcrICImt
あと、なんで、そんなに自分の発言引用したがるの?ID:h64P2lE5
自作自演してるの?w
2021/10/12(火) 18:50:53.32ID:h64P2lE5
>>35
あ...
>読まない D:h64P2lE5 が悪いw
何やねん、俺

>>11の冒頭でも書いてるけど、
value = 何か
if (value != 0)
...
ってあるだろ?なんか知らんアホな問いかけに当てはめると、
if (0 != 0)
...
になるわけだよ、!= 0 が暗黙的を明示しての表記
で、0 != 0 は純粋な二値Booleanになるわけだよ。もちろん false のな
そういうこと言ってるのに理解できないんだからなあ...
多分これも理解できないとか言い出すだろうけど

>>37
既に書いてることをアホのようにそれが無いようにお前が聞くからだな
2021/10/12(火) 18:58:52.25ID:FcrICImt
>>38
!=
ってのが比較演算子であって、計算をしている、ってのは理解できる?
「0 != 0 は純粋な二値Booleanになる」
ここが判ってないな、と思うわw

プログラミング言語ってのはそれをBooleanにしてるわけじゃないんだよw
「0かそれ以外」に分けてるだけなんだよw
(アセンブラを分かれば、こんなことは自明なんだけどねw)
概念的にbooleanと言ってるかもしれないけど、それは単に概念的な話であって、
実際とは違う。

ま、比較演算子については1か0かしか返さないよ。
でも、それは比較演算子だから、であって、例えば、算術演算子使って
if ( 1+1 ) {..}
でも成立するってのはわかってる?w
2021/10/12(火) 19:03:07.20ID:h64P2lE5
>>39
んー...
>>11の冒頭でも書いてるけど、
>>12の冒頭でも書いてるけど、
な。すまん

>>36
11に既に書いてる
わかりづらいのはあるかもだがw、もう根本的にはお前の理解不足(知見の無ささによる)としか思えんから、頑張って読んでね

>>39
「計算」をした結果が、純粋な二値Booleanになるんだけど?
自分で「比較演算子については1か0かしか返さないよ」って書いてるくせに何を言ってるの?
だから暗黙的に != 0 がされてると「思え」と言ってるんだが、まだわからんのだが
if ( (1+1) != 0 ) {..}
ってことがわからないんだな...知識が無さすぎだろう
2021/10/12(火) 19:10:50.57ID:FcrICImt
>>40
>「計算」をした結果が、純粋な二値Booleanになるんだけど?
だから、そこが判ってないだろw
「二値Booleanになる」のではなくて、「二値Booleanとして判断する」だけ。
だから、「思え」とかいうお前の独善的な命令なんか知ったことじゃないん
だってw

> if ( (1+1) != 0 ) {..}
> ってことがわからないんだな...知識が無さすぎだろう
だから、お前がそう理解したい、って言うんなら、それは間違いではない、とは言ってやるよw
でも、それは「正しい」わけじゃないし、「唯一の間違いじゃない解」でもないんだよ。
頭悪すぎだよ、お前。

あとさ、本当に俺の書いたことをお前は読んだの?俺の言いたいことはちゃんと書いてあるし、
理解できるのなら、お前は俺に対して行った数々の暴言を詫びるべきじゃないかな。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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