X



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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
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/
0149デフォルトの名無しさん
垢版 |
2021/10/13(水) 05:53:56.92ID:DA35qh3D
>>147,144
>あ...>>989 の間違いだった(趣旨がトンチンカンの>>982のに「まあ、これなんだよね(笑)」と同意してる)
>誠にすまんことです
>繰り返したぶん、 ID:FcrICImt にもすまん
あ...>>12,136 で間違ってるのかと思った。間違ってないな、勘違いだった、どうかここは無かったことに

>前スレ>>984もワイやし
あくまでも「なにいうてんねん、イキりをイジりはじめたんはワイのが先やろ?w」の拘りかっw勘弁してくれ、そのノリは一瞥にはわからんw
0150デフォルトの名無しさん
垢版 |
2021/10/13(水) 10:39:03.69ID:QRtQ0cE0
レスバ乙。
最後に俺がまとめてやんよ。
終了ステータス0を真と見なすのはifコマンドの仕様です。
これでスッキリするな。
0153デフォルトの名無しさん
垢版 |
2021/10/13(水) 11:05:00.12ID:V99uCirA
まだやってたのか

>シェルスクリプトだけじゃなくてC言語も成功は0を返さないとだめだって言ってんだろ

仕様書嫁
0154デフォルトの名無しさん
垢版 |
2021/10/13(水) 11:07:10.05ID:V99uCirA
>>10
判ってる人間は「負論理」で済むはずなんだよな
結局「仕様書嫁」としか言い様が無い
1が真でも
0が真でも
どっちでも良いんだよ
0155デフォルトの名無しさん
垢版 |
2021/10/13(水) 11:09:43.80ID:V99uCirA
>>11 は馬鹿確定
0156デフォルトの名無しさん
垢版 |
2021/10/13(水) 11:13:26.44ID:V99uCirA
>>12
Windows API は Boolean を返す関数が 0/1 以外に負の数を返したり普通にあるからな
0157デフォルトの名無しさん
垢版 |
2021/10/13(水) 11:18:51.98ID:2R4gu/cR
どっちもどっち
ここまでコミュ力低いやつらはリアルで見たことないわ
運がいいのかこいつらがよほど特殊なのか
0158デフォルトの名無しさん
垢版 |
2021/10/13(水) 12:41:04.06ID:D0IOdnVZ
>>150
それやと、また真偽バカを召喚しちゃうやろ!w

if節の終了ステータスが0のときにthen節を、そうでないときにelse節を実行する、と実際の挙動のみをいえばよい。
0159デフォルトの名無しさん
垢版 |
2021/10/13(水) 12:48:29.67ID:D0IOdnVZ
>>154
正論理負論理は、2値の場合に使う考えかた。
整数についてはふつう言わない。

知ってる理屈をほかにムリヤリ適用すな!
0163デフォルトの名無しさん
垢版 |
2021/10/13(水) 14:52:00.13ID:D0IOdnVZ
>>161
知らんがな。関係あらへん。w

まあ、分岐の話をするんなら、CPUからやな。
ゼロフラグとキャリーフラグで3分岐できるもんやし。
0164デフォルトの名無しさん
垢版 |
2021/10/13(水) 14:54:53.19ID:D0IOdnVZ
>>162
理解力ないんか。。。

中盤以降は、そういうAPIはないやろ。
タイプセーフも強まっていったから、昔の挙げ足はええやろ、というとるんや。
0167デフォルトの名無しさん
垢版 |
2021/10/16(土) 21:47:00.16ID:D7GMWgGE
シェルスクリプト使いにとってキモいは褒め言葉。
つか何でposixに終了ステータス0はtrue、1はfalseって書いてあんのに揉めてるの?
0168デフォルトの名無しさん
垢版 |
2021/10/17(日) 00:10:56.78ID:/rMY6gHo
>>167
どこに書いてあるかを言わないからだろ
お前が揉める原因なんだよ
いい加減嘘ついてあらすのはやめろ
0169デフォルトの名無しさん
垢版 |
2021/10/17(日) 06:17:14.04ID:evqBS6BP
>>168
ggrks
0171デフォルトの名無しさん
垢版 |
2021/10/17(日) 06:29:47.67ID:y+jMo+pm
>>168
終了ステータスは、
trueは0、falseは1は正しいが
0はtrue、1はfalseは正しくない
というのがわからない残念な人なんだろう
0172デフォルトの名無しさん
垢版 |
2021/10/17(日) 06:33:21.39ID:8eKBj5MQ
このようにどこに書いてあるのかを言えという
当たり前の質問にも答えられないわけですよ(笑)
0174デフォルトの名無しさん
垢版 |
2021/10/17(日) 07:02:09.17ID:evqBS6BP
>>171
えと、本気で理解できないんだが詳しく教えてもらえないでしょうか。
0177デフォルトの名無しさん
垢版 |
2021/10/17(日) 11:07:01.52ID:DWmfIprR
いや、>>171はたしかにおかしいな。w
反対や。

0はtrue、1はfalse(と評価されること)は正しいが、
trueは0、falseは1(の値をあらわすこと)は正しくない。
0178デフォルトの名無しさん
垢版 |
2021/10/17(日) 12:11:19.76ID:evqBS6BP
>>175
どこにってのは、どの項目かよく見ろと暗に示してるのかな?
sh
https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/sh.html
EXIT STATUS
The following exit values shall be returned:
0
The script to be executed consisted solely of zero or more blank lines or comments, or both.
1-125
A non-interactive shell detected an error other than command_file not found or executable, including but not limited to syntax, redirection, or variable assignment errors.
126
A specified command_file could not be executed due to an [ENOEXEC] error (see Command Search and Execution, item 2).
127
A specified command_file could not be found by a non-interactive shell.

test
https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/test.html
EXIT STATUS
The following exit values shall be returned:
0
expression evaluated to true.
1
expression evaluated to false or expression was missing.
>1
An error occurred.

>>177
理解しました。
0179デフォルトの名無しさん
垢版 |
2021/10/17(日) 13:22:52.78ID:4nH2b59z
>>178
testコマンドの部分は
引数で渡された式が真ならtestコマンドは0を返す(以下略
と書いてあるだけじゃん
真というのはtestコマンドのテスト式内の話
0180デフォルトの名無しさん
垢版 |
2021/10/17(日) 14:36:53.55ID:7C23oe5i
>>171
>trueは0、falseは1は正しい
>0はtrue、1はfalseは正しくない

ここだけ読むとイミフ
0181デフォルトの名無しさん
垢版 |
2021/10/17(日) 14:38:28.76ID:7C23oe5i
>>171
>>177
どちらも可笑しい
仕様書に描いてあることが正しいのであって
おまえの意見はどうでもいい
0182デフォルトの名無しさん
垢版 |
2021/10/17(日) 14:50:31.56ID:VtgDJrjp
>>177
ture/false コマンドに(Exit Status) 0 および1を返すと書いてある
testコマンドに評価としてtrueとは書いてあるが、それは評価としてでその値が1なのか0なのかというのではないという理解だけど
POSIXに書いてあるという話なら
0183デフォルトの名無しさん
垢版 |
2021/10/17(日) 15:28:23.08ID:N+Nl+RmC
ぱっと流れを見てきただけだが、
[]/test コマンドの評価が真で0を返すってところからはじまって、
他のコマンドの返り値もこれにならって処理成功で0を返すようになったというだけじゃないの?
これをもって終了ステータス0が真を意味するってわけじゃないよねぇ

日本語と英語で、否定文に対する同意にyes/noが反対になるのと似てると思う
前者は否定文それ自体、後者は事象全体について、それぞれ評価してるよね
0184デフォルトの名無しさん
垢版 |
2021/10/17(日) 15:57:56.52ID:VtgDJrjp
>>177
trueコマンドのExit Statusは0、falseコマンドのExit Statusは1
評価した結果trueならExit Statusは0、falseならExit Statusは1
てことででの、trueは0、falseは1 (のExit Status) になるでしょ??

testコマンド(など)で書いてるtrueは一般的な文上でのtrue(例えばtest条件に一致する=真)と読んでるけどなあ

って、よく読んだら同じこと言ってるのか。シェル内部(?)の部分の話かそれ>>177
Exit Status が 0だったらtrue、1だったらfalse と評価されることは正しいが
(ここはわかる)
trueは0、falseは1(の値をあらわすこと)は正しくない
(言いたいことはなんとなくわかるしだったら否定はしないが、うーむ)

>>171は、
>終了ステータスは、
から始まってるとおり(上にも書いたけど)、
trueは0、falseは1は正しいが (そういうExit Statusになる)
だからといって、
シェルスクリプト上で 0はtrue、1はfalse(と見なすのは)正しくない
てこと。下は「trueは0、falseは1(の値をあらわすこと)は正しくない」と同じ意味だわな
0185デフォルトの名無しさん
垢版 |
2021/10/17(日) 16:08:04.69ID:VtgDJrjp
>>183
>[]/test コマンドの評価が真で0を返すってところからはじまって、
>他のコマンドの返り値もこれにならって処理成功で0を返すようになったというだけじゃないの?
Unixで動くプログラムはExit Statusが問題なければ 0、問題あればそれ以外というとこからはじまってかな。testコマンドもそれに合わせてのような
Unixを作る上でのOSのUnixとしてのExit Statusとはどういうものかというのは最も先に考えるだろうから、そこからはじまってかな
0187デフォルトの名無しさん
垢版 |
2021/10/17(日) 16:36:48.76ID:VtgDJrjp
8ビットいっぱいでの値(=unsigned char)となってるね、POSIXでは
int main( ... ) だから、失敗なんぞで -1 をreturn できる(エラーにはならない)が、255になったりするねえ
0188デフォルトの名無しさん
垢版 |
2021/10/17(日) 16:50:37.61ID:8eKBj5MQ
ん?まさか、trueコマンドとfalseコマンドを
真偽値のtrue/falseのことだって勘違いしてる?
いやそんなアホはいないよねw

終了ステータスは数値であって
true/falseじゃないよ
はっきりした
0189デフォルトの名無しさん
垢版 |
2021/10/17(日) 16:59:10.58ID:VtgDJrjp
ただの独りよがり、マウントだけは取りたがり
まあわかったようなのでいいけど
0190デフォルトの名無しさん
垢版 |
2021/10/17(日) 17:35:18.24ID:8eKBj5MQ
>>183
終了ステータスは昔から0が正常終了、それ以外が異常終了という意味
シェルスクリプトのifは正常終了の場合にthenの中身を実行する

それだけの話なのに真とか偽とか、trueとかfalseとか
言ってるやつがいるだけ

trueコマンドは正常終了を返す
fasleコマンドは異常終了を返す
ifは正常終了か異常終了かで処理を分岐させるもので
真か偽かで処理を分岐させるものではない
0191デフォルトの名無しさん
垢版 |
2021/10/17(日) 17:37:48.32ID:VtgDJrjp
なにか必死感
>>175なんて平気で偉そうに自分で調べる探すことはできないくせに
まあこれ以上イジルのは止めようw
0193デフォルトの名無しさん
垢版 |
2021/10/17(日) 17:48:01.87ID:VtgDJrjp
誰とは言わんがw某君は自分で調べることも探すこともできないは明らかだが、
そこからくる無知がコンプレックスからなんだろうなその常時上から目線すぐに誤魔化す癖なのは
と思われるw
0194デフォルトの名無しさん
垢版 |
2021/10/17(日) 19:16:51.89ID:evqBS6BP
>>190
例えばカーニハン、ロブパイク共著のTHE UNIX PROGRAMMING ENVIRONMENT のp140のif構文の説明には
if command
then
commands if condition true
else
command if condition false
do
と書かれている。P145のwhile untilの説明にもtrueとfalseが使われている。
あなたの言いたい事は分かる、というかみんなわかってる。ただ、昔からの習慣をぶった切って何が得なのか分からない。
0195デフォルトの名無しさん
垢版 |
2021/10/17(日) 19:34:34.14ID:8eKBj5MQ
「条件が真」というのは真偽値とは別の話だよ
条件とセットになってないといけない

何が真かどうかは条件文つまりコマンドによって変わる
値だけをみて真かどうかなんてわからない
0196デフォルトの名無しさん
垢版 |
2021/10/17(日) 19:37:39.52ID:8eKBj5MQ
例えばexprという条件文は、1(0以外)が真で、0が偽
testという条件文は、文字列の長さがあれば真で、空文字なら偽
だからtestの場合は0も1も真だし、testの演算子を使えば、それに応じて結果も変わる
どの値が真か偽かなんてわからない
少なくともexprでは0は偽
0197デフォルトの名無しさん
垢版 |
2021/10/17(日) 21:21:40.04ID:evqBS6BP
>>195-196
つまりスクリプトの文脈や使うコマンドに依存するって事ですよね。それは誰でも知っている。
全てに共通では無いからと言ってif文の話の時ですらtrue falseと言う言い方、表現を認めないと言うのはそれこそ文脈無視。何でそこまでtrue falseを否定するの?
0200デフォルトの名無しさん
垢版 |
2021/10/17(日) 22:53:52.24ID:RKnKEp2y
>ifは正常終了か異常終了かで処理を分岐させるもので
>真か偽かで処理を分岐させるものではない

そこが普通のプログラミング言語と違うから
混乱することあるよねって話だったんじゃ?
0201デフォルトの名無しさん
垢版 |
2021/10/17(日) 23:53:53.96ID:DWmfIprR
>>200
混乱するよな、だったら、そうやな、で終わってた。

ところが、混乱した頭でムリヤリ合理化して、シェルスクリプトとC言語に真偽を融合した大統一理論wを主張されたら、そりゃあ黙ってはおれん。

いや、スルーしてもええんやけど、イジったらおもろいやん?
0202デフォルトの名無しさん
垢版 |
2021/10/17(日) 23:59:20.58ID:DWmfIprR
>>184
コマンドの話やったらちゃんと「trueコマンド」って書かんと。
真偽値の話もあるところに単独で「true」とあったら、かならずしもコマンドのことやとは思わんやろ。。。

>>188
誤解のない文章を書けるようになれよ?
クソ文を読めない人間の悪口なんか言わんと。
0203デフォルトの名無しさん
垢版 |
2021/10/18(月) 00:47:48.71ID:JsauePnn
>>202
元々に合わせてのなんだけどな
基本的に元のレスに合わせる感じ、なんか断定的に書いてたりしたら、ひとりごちでわかったように書いてたらw
(true/falseってコマンドが真っ先にじゃね?wともあってなあ。シェルスクリプトでtrue/false書くのはコマンドのだし)
0204デフォルトの名無しさん
垢版 |
2021/10/18(月) 01:12:06.51ID:JsauePnn
>真っ先にじゃね?wともあってなあ
真っ先にじゃね?wともあってなあ、「わかるだろ」と親切心w皆無(何故かは書いた通りw)なこともあり
てことね
0205デフォルトの名無しさん
垢版 |
2021/10/18(月) 02:50:01.04ID:mrfOLNSK
おまいMbだろ
0207デフォルトの名無しさん
垢版 |
2021/10/18(月) 07:42:47.78ID:9KKYdoU5
>>206
ごめんなさい、fi です。
whileの説明も書き写していたけど長いと思って削除したんですが、その時のミスです。
0208デフォルトの名無しさん
垢版 |
2021/10/18(月) 08:55:39.51ID:9KKYdoU5
>>200
Ifに関しては普通のプログラムも真かそれ以外かだと思うけど。
0209デフォルトの名無しさん
垢版 |
2021/10/18(月) 08:57:21.08ID:9KKYdoU5
>>208
失礼、プログラムじゃなくてプログラミング言語
0212デフォルトの名無しさん
垢版 |
2021/10/18(月) 10:32:14.58ID:sM+wOftf
>>208
普通のプログラム言語は式が真かそれ以外と評価される
シェルスクリプトはコマンドの実行結果が真かそれ以外と評価される

例えば C言語で if (foo(0)) { ... } とあったとき、
0は真だと思うかね?偽だと思うかね?

それと同じことだよ
0213デフォルトの名無しさん
垢版 |
2021/10/20(水) 04:35:22.97ID:tjBtBq8J
Mb
>プログラミング言語どころかコンピュータのことすら
理解していない奴が荒らしにきているわけだ。
初心者はもちろん歓迎するのだが、

邪魔する奴は全力でツブす

という、怖ろしい連中がいることを肝に銘じてほしい。」
0218デフォルトの名無しさん
垢版 |
2021/10/24(日) 00:23:08.92ID:Ku/iA6Hb
好きにだな
シェルがやる(汎用)のかコマンドがやる(独自)のかの違い
得られるのは同じ
0223デフォルトの名無しさん
垢版 |
2021/11/07(日) 20:05:32.87ID:xhLNYeNd
shでmain関数を定義して
ループ内で main & すればサブプロセスで動いてくれてechoしたときの出力も全部表示されるやん?
powershellで同じことしたいのにできひんねんけど誰か教えてくれ
0228デフォルトの名無しさん
垢版 |
2021/11/15(月) 14:15:42.51ID:o0383L8J
すごく初心者はいきなりcshとかやらずに
コンピュータの仕組みを理解するのが先だと思う
0229デフォルトの名無しさん
垢版 |
2021/11/15(月) 14:28:42.54ID:2zWqj8FL
ありがとうございます。

linuxは業務で触っていて
基本的なコマンドは知っています。
苦手ではありますが。

ハード屋なのですが
c言語、matlab、vba辺りの
コードは書いていました。

会社のメンバーが
cshで実行するスクリプトを
多用していて理解したり
自分で書いたりする必要が
発生しました。
0236デフォルトの名無しさん
垢版 |
2021/11/16(火) 12:03:49.53ID:a9xlbndo
40代だけど、Solarisでtcshがログインシェルだったなあ
作業手順書作って、承認受けてから変更作業するタイプのしごとしてて、
ワンライナースクリプトをcshrcに書いてた記憶がある。
帰ったらその頃の資料探してみる
独立したshell scriptを書くには向かないのは同意
0237デフォルトの名無しさん
垢版 |
2021/11/16(火) 13:09:44.40ID:6naJ2IpF
Bsh系も、testコマンドのオプション扱いじゃなく、
直感的な == < > <= >= != を使いたいと思うことがある
普段他の言語を書いてて、たまにshを使おうとするといつも一瞬考えてしまう
Bashだと = のかわりに == が使えるけど、後は駄目だもんな
= もスペースのあるなしで代入と区別するなんてこと忘れてて悩むことしばし
0240デフォルトの名無しさん
垢版 |
2021/11/18(木) 00:52:48.55ID:8Z3t28Md
>>236
使ってた本は
技術評論社のThe UNIX Surper Text 上
で、
第29章 csh プログラミング
だと思う。
ほかはmanとwebの情報でやってたはず。

csh系はたとえシングルクォートの中でも!はエスケープしないといけないのが注意点かな。
変数の中に入れるときにエスケープはいつでも必須で、
それを使うときにヒストリ置換するならそのままつかい、ヒストリ置換せずに使うなら再度エスケープがいる。

あとは慣れだと思う。
リダイレクト関連はcshだと実現できないことがあったはずで、
それはcshからperl呼んで実質perlスクリプトになってたはず。
0241デフォルトの名無しさん
垢版 |
2021/11/18(木) 02:41:57.64ID:+R4B5ZiG
>>240
それで思い出したけどcshでシングルクォートだかダブルクォートだか
変数に入れることって出来る?
前に挑戦して挫折したことがあるんだが
0242デフォルトの名無しさん
垢版 |
2021/11/18(木) 07:27:37.37ID:8Z3t28Md
>>241
シングルクォートを入れたければ、ダブルクォートでくくる。
ダブルクォートを入れたければシングルクォートでくくる。


set hensu="single ' double "'"'" hogehoge"

古いbshもこの方式が必要だったはず。
0243デフォルトの名無しさん
垢版 |
2021/11/18(木) 08:22:45.64ID:+R4B5ZiG
あれ?できるね?なにで引っかかったんだっけか?
改行文字だったかな?

入れること自体はできるけど、それを使おうとすると
Unmatchedが表示されない?
改行+クォートの場合だけ?

どうも仕様がよくわからん
0244デフォルトの名無しさん
垢版 |
2021/11/18(木) 14:06:14.63ID:a7FUItee
昔に何故cshでshell scriptを書くべきでないかという英語文書があって日本語訳もあった
調べたい人は自分で調べてくれ
0247デフォルトの名無しさん
垢版 |
2021/11/19(金) 00:59:37.90ID:Z3I1Kt5f
cshの問題点

> 4. クオート
> csh ではまともにクオートをすることができません。

これか

> 改行をクオートするためにはバックスラッシュを使う必要があり、文字列に含
> めるのは本当に難しいことです。

難しいのか不可能なのかはっきりしてほしいな
不可能なんじゃないのか?
■ このスレッドは過去ログ倉庫に格納されています

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