X



シェルスクリプト総合 その37
レス数が1000を超えています。これ以上書き込みはできません。
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/
0002デフォルトの名無しさん垢版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ページや各種リンクを見ましょう
・ワイルドカード・パターンは正規表現ではありません。正規表現の話題は正規表現スレへ
・シェル芸とシェルスクリプトは全く異なります
・シェルスクリプトのことをシェルってゆうな
0003デフォルトの名無しさん垢版2021/10/06(水) 17:20:42.12ID:XJEs7oM2
2ゲット
0004デフォルトの名無しさん垢版2021/10/08(金) 03:54:38.51ID:LzOvy0cf
3げと
0005デフォルトの名無しさん垢版2021/10/09(土) 07:02:28.75ID:F/g3bnt2
げっとわいるど
0006デフォルトの名無しさん垢版2021/10/12(火) 17:53:02.51ID:elEZT6pO
つーか真偽値の問題じゃなくて
シェルスクリプトのifが終了ステータスを判断するコマンドってだけだろ
0007デフォルトの名無しさん垢版2021/10/12(火) 17:54:35.21ID:elEZT6pO
あとシェル関数が返すのも終了ステータス
戻り値じゃない、そもそも終了ステータスしか返せないだろ
returnだからって他の言語のretruntを同じだと思うなよ
0008デフォルトの名無しさん垢版2021/10/12(火) 17:59:10.51ID:FcrICImt
>>6
だから真偽値の問題でしょw
お前、いい加減自分で何言ってるかわかってないだろw
それを言ったらC言語のifだって値を判断するだけのコマンド(文)って
なっちゃうだろwww

だれかがboolean型持ち出したから、混乱してんのかもしれないけど、
昔のC言語にはそんな型ねーからな?w
0009デフォルトの名無しさん垢版2021/10/12(火) 18:01:19.29ID:FcrICImt
結局、Cでも(その他でも)シェルスクリプトでさえも、
ifってのは式の値を真偽に判断するものなんだよ。
0010デフォルトの名無しさん垢版2021/10/12(火) 18:04:36.01ID:FcrICImt
だから、シェルスクリプトが他と違って特殊なのは、
式の値を0の場合を真と判断するところ、だけだよ。
それがexit statusであるかとかは全く関係がない。
要点はそこだけ。
0011デフォルトの名無しさん垢版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
とか、常識的に見えるだろ?上手く整合性があるようにできてるんだよ

つづく
0012デフォルトの名無しさん垢版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からのにわかか?
何かまだ言い張ってるなあ
0013デフォルトの名無しさん垢版2021/10/12(火) 18:06:45.20ID:FcrICImt
あ、あとついでに言っとくと、終了コードを判断するしかないのは、シェルスクリプト
はそれ自体がそもそも計算ができないからw
そうならざるを得ないのは、この点にかかるw
0015デフォルトの名無しさん垢版2021/10/12(火) 18:16:00.36ID:FcrICImt
ID:h64P2lE5はそもそもプログラミング言語というものを理解できてないんだなw
いや、プログラミングが理解できてないのか?w
あと日本語も多分理解できてないんだろうなw

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

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

trueが表示されると思ってる?w
0022デフォルトの名無しさん垢版2021/10/12(火) 18:27:51.86ID:h64P2lE5
>>21
>>12で既に書いてるんだけどな

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

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

そもそも==ってのは「比較演算子」であって、
0031デフォルトの名無しさん垢版2021/10/12(火) 18:37:47.06ID:FcrICImt
あーあ、ミスってしまったw

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

ま、読まないし、聞かないし、基礎もだめ、なのを相手にしても無益か。
ID:h64P2lE5
は結局、核心を突かれた質問をされると相手を罵倒して逃げるだけのクズだということでw
0036デフォルトの名無しさん垢版2021/10/12(火) 18:46:33.75ID:FcrICImt
>>34
お前さ、本当に俺の書いてあること読めてる?理解できる?
お前のようなやつを「おさとが知れる」っていうんだぞ?w
ボキャも貧弱で、おまえの日本語能力すらも程度が知れるんだがw

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

で、それは違うよ、って言ってるんだけど、まだ分からない?
日本語が理解できないの?w
0037デフォルトの名無しさん垢版2021/10/12(火) 18:49:13.63ID:FcrICImt
あと、なんで、そんなに自分の発言引用したがるの?ID:h64P2lE5
自作自演してるの?w
0038デフォルトの名無しさん垢版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
既に書いてることをアホのようにそれが無いようにお前が聞くからだな
0039デフォルトの名無しさん垢版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
0040デフォルトの名無しさん垢版2021/10/12(火) 19:03:07.20ID:h64P2lE5
>>39
んー...
>>11の冒頭でも書いてるけど、
>>12の冒頭でも書いてるけど、
な。すまん

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

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

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

あとさ、本当に俺の書いたことをお前は読んだの?俺の言いたいことはちゃんと書いてあるし、
理解できるのなら、お前は俺に対して行った数々の暴言を詫びるべきじゃないかな。
0042デフォルトの名無しさん垢版2021/10/12(火) 19:16:26.06ID:4emiI4KE
ID:FcrICImtはなんかいうたびにアホが漏れとるな。w

そんなんでイキっとったらアカンで!
相手にしてもらえるのはここだけなんやし。
ほかやったら完全スルーやで。
0044デフォルトの名無しさん垢版2021/10/12(火) 19:18:04.33ID:h64P2lE5
>>41
ごまかしか?
>!=
>ってのが比較演算子であって、計算をしている、ってのは理解できる
>「0 != 0 は純粋な二値Booleanになる」
...
>ま、比較演算子については1か0かしか返さないよ

に対してだぞ。「1か0かしか」は明らかに 純粋な二値Boolean だろうが、何を言ってるのか

お前は一般的な話で、
if true
next sentence
というようなこと言っただろう?そんなに真偽(true/false)に拘りたければの話だぞ
なら>>12って話で、他の言語もシェルスクリプトも暗黙的にやってると思えばそれにも合うって話なのに、つくづくお前は自己都合だな

まさか暗黙的ってことがわからないとかあるのか?>>39のあたりから薄々感じてるけどw
0045デフォルトの名無しさん垢版2021/10/12(火) 19:25:08.03ID:FcrICImt
>>44
> に対してだぞ。「1か0かしか」は明らかに 純粋な二値Boolean だろうが、何を言ってるのか
まだわかんないの?w
1も0もBooleanじゃないよwここで言ったのはまさに数としての1と0なんでねw
「Booleanとして判断するなら」、1はtrueで0はfalseと「解釈できる」だけの話だよ?w

真偽に拘りたければ、の下りは一体何を言ってるのか分からんよw
せめて、俺の具体的な言葉を使ってもらえんかね?
あと「暗黙的」なんて話はそもそもした覚えがないしなぜそのような言葉がここで
突拍子もなく出てくるのか分からんよw
0046デフォルトの名無しさん垢版2021/10/12(火) 19:33:54.34ID:h64P2lE5
>>45
>1も0もBooleanじゃないよw
知識が貧弱すぎて話にならないな
Booleanって言語での「型」だけだと思ってるんだろうな
1/0 (別に他の何かでもいいけど) 2値で真偽を表すのはBooleanなんだけど、それを知らないというのはわかった
自分で1が真だとも言ってる風なくせに

>>12 が全く読めてないのはわかった。「暗黙的」という意味がわからなかったというのもわかった
何かまた誤魔化してるようだけどな(誤魔化してるというかまだわかってない故にかもしれんけどw)

場合によっては真偽を言い、場合によっては言語特有のことをいい、ベース知識がないからフラフラしてんだよ、お前は
いや、単に何かいい負けたくないwだけか?w
0047デフォルトの名無しさん垢版2021/10/12(火) 19:36:18.86ID:FcrICImt
あ、あとさあ、
プログラミング言語の話をしてるときに、JCLを持ち出すってのはどうかな、と思うわ。
そもそもJCLって規格があったりする言語でもないだろうし(あんの?w大型は
ほとんど使ったことないから知らんけどw)
ID:h64P2lE5はプログラミング言語をCとシェルスクリプトくらいしか知らない、って読めるけど。
0048デフォルトの名無しさん垢版2021/10/12(火) 19:39:21.53ID:h64P2lE5
>>47
歴史的なことだよ、よく知らんけど
コマンド(小さなプログラムの)の実行と制御という点ではシェルスクリプトは近しいだろう

>ID:h64P2lE5はプログラミング言語をCとシェルスクリプトくらいしか知らない、って読めるけど。
また、言い出してるw
0049デフォルトの名無しさん垢版2021/10/12(火) 19:42:53.55ID:FcrICImt
>>46
知識が貧弱なのはお前だろw
で、なに、俺の書いた表現が間違ってると、
お前は強弁するわけね?w
解釈って言葉の意味は分かる?

じゃあさ、余計な御託は要らないから、俺の書いた文章のどこがどう
間違ってるか具体的に指摘してもらえるかね?

俺はお前がどう間違ってるか、具体的に指摘したよな。
それに対してお前は「知識が貧弱」だの、型だけだの、全然筋違いの「文句」を
並べただけだよな?(こういうのが「御託」ね?w)

あと凄く勘違いしているようだが、そもそも俺の書きこみに喧嘩売るような真似を
したのはお前の方だからな?
0050デフォルトの名無しさん垢版2021/10/12(火) 19:46:05.80ID:FcrICImt
>>48
>>48
あ、そw
ああ、そりゃ似てるねえw
コップとたらいが似てる程度にはねw

で、アセンブラは書いたことあるかい?w
0051デフォルトの名無しさん垢版2021/10/12(火) 19:48:23.86ID:h64P2lE5
>>49
また、まだ、めんどくさいことを言い始めてる
>>11,12で言い尽くしてる

お前の無知さからくる書いてること理解できないで(、また誤魔化しでw)、>>11,12に対して「お前が」わけわからんこと喚いているんだよ
「具体的」とやらもそれに対して「具体的」に返してるんだが、それに対してまた理解できないで(、また誤魔化しでw)ごちゃごちゃ言ってるくせによくいうよ
0052デフォルトの名無しさん垢版2021/10/12(火) 19:51:09.23ID:h64P2lE5
>>50
書いたことはあるな
今は読める程度だけどな
何で高級言語wで0か0以外かって話/自慢(w?)したいのか?
またしょうもない質問するなあ
0053デフォルトの名無しさん垢版2021/10/12(火) 19:55:09.09ID:FcrICImt
>>51
めんどくさいのはこっちだよw
何も間違ったことなど一つも書いちゃいないのに、
なんか、チンピラみたいなID:h64P2ltE5に因縁つけられて
絡まれて。

結局、また核心突かれると罵倒くりかえして逃げるんだねw
で、解釈って言葉の意味は分かるの?w
どうして指摘されたことにきちんと返さないの?w
これじゃ議論どころか会話にもならんよw
0056デフォルトの名無しさん垢版2021/10/12(火) 19:58:03.26ID:h64P2lE5
>>53
>>20の例みたいなこと書いておいてよく人のことをチンピラとか言ってるな
>>20の例みたいなこと書いてよく人のことを「また核心突かれると罵倒くりかえして」
そして>>54のようなレスを書くとw
つくづくお前ってやつわwww笑えすぎだろう
0057デフォルトの名無しさん垢版2021/10/12(火) 19:59:35.46ID:4emiI4KE
>>43
ちゃんと書いてやっても、どうせおまえは読めないやん?w

中途半端なCとアセンブリの知識を、シェルスクリプトにムリヤリ適用すんのはアホすぎやぞ!
0058デフォルトの名無しさん垢版2021/10/12(火) 19:59:53.17ID:h64P2lE5
>>55
アセンブリとか急に言い出したからな
自分でわけわからんこと急に言い出しておいて、思いついたように俺が言ったフレーズを真似てるようなこと言って...としか思えんぞ。しかもお前だからなw
0059デフォルトの名無しさん垢版2021/10/12(火) 20:00:50.43ID:h64P2lE5
>>57
>ちゃんと書いてやっても、どうせおまえは読めないやん?
そう思う俺以外のが居て嬉しいぞww
0060デフォルトの名無しさん垢版2021/10/12(火) 20:03:47.53ID:FcrICImt
>>58
俺がお前と似たフレーズを使うのは、お前に
わかるようにわざわざ似せてるからだよw
そんなこともわからないのかよw

>>57
だから、できるならやってみせろよw
おまえが何書いたっていうんだwスネオみたいなやつだなw
0061デフォルトの名無しさん垢版2021/10/12(火) 20:04:19.68ID:elEZT6pO
>>8
お前本当にわかってないのかw

C言語のifは真偽値を判断するもので
シェルスクリプトのifは終了ステータスを判断するものなの

C言語のreturnは戻り値を返すもので
シェルスクリプトのreturnは終了ステータスを返すものなの

C言語でもmain(コマンド)のreturnは正常時に0を返さないのいけないの
シェルスクリプトはすべての関数がコマンドと同じ扱いだから正常時に0を返すの

理解できたか?
0062デフォルトの名無しさん垢版2021/10/12(火) 20:05:29.05ID:h64P2lE5
>>60
また誤魔化しだな
マジでそうだったのかww
お前が無能としか思えんけどな。そして可哀想にとしか思えんけどな
0063デフォルトの名無しさん垢版2021/10/12(火) 20:08:03.12ID:FcrICImt
>>61
お前本当にわかってないのかw

C言語のreturnの戻り値ってのはifで判断されることは
理解してないの?w

一体、何を理解しろ、と?w
0064デフォルトの名無しさん垢版2021/10/12(火) 20:09:04.16ID:FcrICImt
>>62
ごまかしてんのはお前でしょw
逃げて罵倒するだけしかしてないお前のようなのを
無能、と呼ぶんじゃないかなあ?w
0065デフォルトの名無しさん垢版2021/10/12(火) 20:10:37.66ID:h64P2lE5
>>64
お前はすげえなああ
>逃げて罵倒するだけしかしてない
自分ではしてないつもりらしいww
すげえよお前www大笑いさせる才能あるぞw
0067デフォルトの名無しさん垢版2021/10/12(火) 20:12:46.01ID:h64P2lE5
>>66
マジか...www
そりゃそうだないい負けたくないんだろ?www故にそんなこと言えてしまうとしか思えん
天才的爆笑王の称号をあげたいw
0068デフォルトの名無しさん垢版2021/10/12(火) 20:15:05.91ID:FcrICImt
>>67
マジか...www
そりゃそうだないい負けたくないんだろ?www故にそんなこと言えてしまうとしか思えん
天才的爆笑王の称号をあげたいw
0070デフォルトの名無しさん垢版2021/10/12(火) 20:19:38.91ID:FcrICImt
まあ、馬鹿を相手にしても不毛だから、ほっとくとして。

結局、俺が言いたかったのは>>10だけね。
(ID:h64P2lE5にはどうせ聞いても無駄だからほっといて)、
なんか異議あるかい?w
0071デフォルトの名無しさん垢版2021/10/12(火) 20:24:05.47ID:h64P2lE5
>>70
>>11,12と既に書いてるw
まあ、結局読めないんだからなあ
読んでくれてると思うお前以外は、たぶん
少なくともお二人から何か言われては居ないからなw
0072デフォルトの名無しさん垢版2021/10/12(火) 20:25:25.50ID:FcrICImt
>>71
そう書くんだろうと思ったからお前には聞かない
って言ってんだろ。日本語読めないのか、お前は。
0074デフォルトの名無しさん垢版2021/10/12(火) 20:31:54.17ID:FcrICImt
>>73
本当に日本語が読めないんだねw
どうしても構ってもらえないといやなのかw
君も>>10が正しい、と認めてるって解釈していいかい?w
間違っている、というのなら、まずは、簡潔にどこそこがおかしい、
と書いてくれる?w
0075デフォルトの名無しさん垢版2021/10/12(火) 20:35:37.96ID:h64P2lE5
>>74
日本語読めない=俺の言う通りにしない/ならない
でしかないくせにwwwさすが天才的爆笑王

>>11,12で否定してるんだが。そもそも>>10はモロ馬鹿なことを言ってるんだけど
>それがexit statusであるかとかは全く関係がない
>>11,12でその間違いを指摘してるんだけど、読めない読まないんだからなあ
0076デフォルトの名無しさん垢版2021/10/12(火) 20:44:29.90ID:FcrICImt
>>75
>>10に関しては関係がないなw
別にそれに縛られなきゃならない理由はないだろw
ただ単にその方が都合がいいから、そうしてるだけだからなw
それを持って、>>10を間違いと言うのなら、そりゃお前の思考方法
が間違ってるよw
0078デフォルトの名無しさん垢版2021/10/12(火) 20:47:13.55ID:h64P2lE5
>>76
「それに縛られる」の「それ」ってなに?
exit status のこと?だったら縛られる、というか前提にするに決まってる
シェルスクリプトおよびCがどういう経緯で作られたのか知らんのか
(JCLもその流れのうちに入るだろうという話なんだが、わかってなさげだしな)
0080デフォルトの名無しさん垢版2021/10/12(火) 20:50:10.79ID:4emiI4KE
>>70
「式」でイキんな!ってゆうたやろ!
何回言わすんや!
アホなん?

>>60
前スレからずぅっと教えたってんのに。。。
アホなん?
0081デフォルトの名無しさん垢版2021/10/12(火) 20:52:05.04ID:elEZT6pO
>>63
> 一体、何を理解しろ、と?w

C言語のreturnじゃなくて
シェルスクリプトのreturnを理解しろと言ってる
0082デフォルトの名無しさん垢版2021/10/12(火) 20:53:48.29ID:FcrICImt
>>78
前提にするのが決まっていようがなんだろうが、そうでなきゃならん理由はないだろw
そして、0を真とするのがプログラミング言語として特殊なことも間違いないなw
それとも0を真とするのは多数派である、と強弁するのか?w
そして、Cは0は偽だよw
0083デフォルトの名無しさん垢版2021/10/12(火) 20:55:08.20ID:FcrICImt
>>81
そこに反応するんじゃなくて、指摘されたところに
ちゃんと返したら?w

一体なんなんだろうねえ、この連中はw
0084デフォルトの名無しさん垢版2021/10/12(火) 20:55:46.77ID:cBlO5Xil
>>78
> シェルスクリプトおよびCがどういう経緯で作られたのか知らんのか

シェルスクリプトはC言語から置き換えるために作られた
Unix哲学にはシェルスクリプトの方が移植性が高いとい書いてる
C言語は移植性がないから使い物にならない
Unix哲学ではシェルスクリプトをC言語に書き直すなって書いてある
つまりC言語からシェルスクリプトに書き直すために作られたものだ
シェルスクリプトはどこでも動く!シェルスクリプトで何でも出来る!
POSIX原理主義を信仰せよ!
0085デフォルトの名無しさん垢版2021/10/12(火) 20:56:55.48ID:h64P2lE5
>>82
>前提にするのが決まっていようがなんだろうが、そうでなきゃならん理由はないだろ
むちゃくちゃ言い出しましたーーーwww
あれか?シェルスクリプトってUnixが出る前から何らかの構想があったとでも思い込んでるのかな??

>そして、0を真とするのがプログラミング言語として特殊なことも間違いないなw
だーかーらーーー、真偽に(それもその値に)拘るなら、暗黙的に == 0 が付いてると思えばいいだろw

やっぱりすごいな天才的爆笑王
0086デフォルトの名無しさん垢版2021/10/12(火) 20:58:00.87ID:h64P2lE5
>>83
>この連中はw
自分一人が正しいとそこまで言い張るのか
wwwwwww すごすぎだな天才的爆笑王は。それ以上の称号をあげたいくらい
0087デフォルトの名無しさん垢版2021/10/12(火) 21:02:04.59ID:FcrICImt
>>85
だーかーらーーー、w
==0が付いていると思えばいいとか知ったことじゃないんだよw
お前がそう思いたければ思えよw勝手にしろよw

シェルスクリプトが0を真とする、というところで他と違う=特殊だと
指摘しただけだw

そもそも、なんだって、お前は俺の先生かなんかみたいにになろうとしてんの?w
いくらなんでも、その思考力じゃ自惚れが過ぎない?w
0088デフォルトの名無しさん垢版2021/10/12(火) 21:05:16.69ID:h64P2lE5
>>87
お前が「言い張って」「拘ってる」ことに対してなのに
本当にお前ってやつはw「知ったことじゃない」だってwww

>お前は俺の先生かなんかみたいにになろうとしてんの?
>いくらなんでも、その思考力じゃ自惚れが過ぎない?w
wwww 妄想すげーーーーーwwwww
マジですげえなああ、本当にww
ちょっと笑い疲れたぞw

大笑いできるけど、ここまで無知を拗らせてこうなるとある意味怖い面もあるな
大笑いから一息ついて、遠目で考えてみるとww
0090デフォルトの名無しさん垢版2021/10/12(火) 21:07:36.55ID:C/eJVmIN
コピペしやすいように一行にしてやる

if (( 0 )); then echo 真; else echo 偽; fi


if (( 1 )); then echo 真; else echo 偽; fi


if (( 2 )); then echo 真; else echo 偽; fi


if (( -1 )); then echo 真; else echo 偽; fi
0094デフォルトの名無しさん垢版2021/10/12(火) 21:10:27.73ID:FcrICImt
>>88
お前は本当につまらんね。
結局、核心をつかれるとまた罵倒して逃げるだけ。
なんだか九官鳥かなんかと会話している気がしてきたわ。

で、じゃ、いいよな。

シェルスクリプトは真偽の判定において、0を真とする、という点に
おいて特殊である。
これは真である、ということで。
0096デフォルトの名無しさん垢版2021/10/12(火) 21:13:31.20ID:h64P2lE5
>>94
また「核心をつかれると」だって
何言ってるんだかwそれこそ自惚れだぞwwwmまあ、目も当てられない自惚れすぎは>>83の最後とかも明らかで、無自覚なんだろうけど

馬鹿馬鹿しい、また、何をまた変なことを急にって話でしかないからなんだが
さすがだな本当にw
0097デフォルトの名無しさん垢版2021/10/12(火) 21:13:36.59ID:FcrICImt
>>89
え?w
それはちょっと汚なくないかね?w
それはbashの拡張だろうw
シェルスクリプトと言ってるのに、それはずるいw

ま、面白い反論ではあるとは思うよw

>>90みたいなことをやらなければ、もうすこし相手してもいいんだけどね。
0099デフォルトの名無しさん垢版2021/10/12(火) 21:19:22.22ID:C/eJVmIN
>>97
> それはbashの拡張だろうw

ちがう、kshの拡張
ほとんどシェルはkshをパクってるからほとんどのシェルで動く
これがシェルスクリプトの仕様と言っても過言じゃないよ
0100デフォルトの名無しさん垢版2021/10/12(火) 21:22:46.48ID:FcrICImt
>>99
kshかwまだIBMは使ってんだろうなあw
ま、それはそれとしても、

過言じゃない、と言っても、それを
シェルスクリプトの仕様だ、と強弁するのは
おかしいだろw
0101デフォルトの名無しさん垢版2021/10/12(火) 21:23:05.58ID:h64P2lE5
>>99
言うなら 次世代シェルスクリプト だな。もちろん未だにそんなのない
if command;
の話をしてるんだから、関係ないよ
この形式は後も残るし、その拡張とは別の話をしてるんだし
0102デフォルトの名無しさん垢版2021/10/12(火) 21:27:53.18ID:FcrICImt
結局、lD:h64P2lE5人の発言にただケチをつけて大物ぶりたがるだけの
ネットチンピラだった、ということでいいよな?w
0103デフォルトの名無しさん垢版2021/10/12(火) 21:29:09.94ID:C/eJVmIN
じゃあ (( 0 )) は禁止でいいよ。代わりに [ 0 ] 使うからな

if [ 0 ]; then echo 真; else echo 偽; fi


if [ 1 ]; then echo 真; else echo 偽; fi


if [ 2 ]; then echo 真; else echo 偽; fi


if [ -1 ]; then echo 真; else echo 偽; fi


あれれー?全部真じゃねーか。
どう説明してくれるのかな?
0104デフォルトの名無しさん垢版2021/10/12(火) 21:30:19.79ID:h64P2lE5
>>102
「ケチをつけて」だってww
「大物ぶりたがる」だってwwwww
お前の勝手な受け取りでしかないな
もう、本当に、お前はwwwwwww やっぱりもっと上の称号を上げたいとは思ってしまう
0105デフォルトの名無しさん垢版2021/10/12(火) 21:31:42.55ID:FcrICImt
>>104
だって、お前、結局、一つも俺の発言の間違いを
指摘できなかったじゃんw
それは客観的な事実でしょw
0107デフォルトの名無しさん垢版2021/10/12(火) 21:32:54.54ID:h64P2lE5
>>103
testコマンドの結果(testコマンドが終わるときのExit Statusの値)でしかない
testコマンドに何故なのか書いてあるだろう
シェルスクリプトの話ではない=シェルはそれに関係してないよ
0108デフォルトの名無しさん垢版2021/10/12(火) 21:34:55.96ID:h64P2lE5
>>105
さすがwwwwすげえええwwww
まだそんなこと「言い張る」のなww
客観的な事実wwwwwwwww
すげえなあ、本当に、マジでマジで
0109デフォルトの名無しさん垢版2021/10/12(火) 21:36:55.49ID:FcrICImt
>>107
なに、とうとう宗旨替え?w
こっそりと紛れようと?w

ま、なんつーか、もうすこし謙虚さをみにつけなさい。
そうしたら、コンピュータやプログラミング言語も理解
できるようになるよw
0110デフォルトの名無しさん垢版2021/10/12(火) 21:38:27.71ID:h64P2lE5
>>103,107
string True if string is not the null string.
これだな
>あれれー?全部真じゃねーか。
>どう説明してくれるのかな?
わかったならもう出る必要ないぞ
0111デフォルトの名無しさん垢版2021/10/12(火) 21:39:03.20ID:C/eJVmIN
>>106
やりなおしじゃねーよ。
重要なことだろ

お前が言ってる真とか偽の話は、testコマンドの話であって
シェルスクリプトと関係ねーんだよ

if [ 0 ]; then echo 真; else echo 偽; fi


if [ 1 ]; then echo 真; else echo 偽; fi


両方が真になる理由を言ってみろ
testコマンドの仕様じゃねーか
0114デフォルトの名無しさん垢版2021/10/12(火) 21:41:24.99ID:C/eJVmIN
一方こっちはPOSIXシェルじゃないってだけで
シェルスクリプト仕様なんだわ

if (( 0 )); then echo 真; else echo 偽; fi


if (( 1 )); then echo 真; else echo 偽; fi


((コマンドなんてないからな
0115デフォルトの名無しさん垢版2021/10/12(火) 21:41:30.85ID:FcrICImt
>>111
シェルスクリプトの仕様の話であって、
testコマンドの仕様の話じゃないよ。
そんなこともわかんねーの?
つまんないやつ。
じゃあ、もういいから出てくんなよ。
0117デフォルトの名無しさん垢版2021/10/12(火) 21:43:37.74ID:C/eJVmIN
testコマンドじゃなくexprコマンドを使えば
この通り0が偽で1が真になる

$ if expr 0; then echo 真; else echo 偽; fi
0


$ if expr 1; then echo 真; else echo 偽; fi
1


シェルスクリプトと同じ結果

if (( 0 )); then echo 真; else echo 偽; fi


if (( 1 )); then echo 真; else echo 偽; fi
0120デフォルトの名無しさん垢版2021/10/12(火) 21:47:41.25ID:FcrICImt
>>118
無礼だなあw
態度と思考はお前が最悪だろうにw
謙虚に、と言っただろ?w
そういうことやってるとまた間違えて恥を晒すことになるぞ?w
0123デフォルトの名無しさん垢版2021/10/12(火) 21:50:51.74ID:h64P2lE5
>>122
test の 0 も 1 も文字でしかないからな、そういう「testコマンド[の]」
exprもtestを置き換えれば同じ話
0125デフォルトの名無しさん垢版2021/10/12(火) 22:37:31.32ID:FcrICImt
>>123
ほら、言ったそばからこれだよ…
謙虚に、っていったろ?
exprの終了コードは特殊なんだよ。
わからないことはわからないとまず認めること。
テキトーこいてごまかそうなんて一番ダメだ。
0126デフォルトの名無しさん垢版2021/10/12(火) 22:54:40.85ID:h64P2lE5
>>125
「特殊」=「exprコマンド[の]」
本当にお前は読めないやつだな
何が「謙虚に」だよ、お前こそ謙虚に読みやがれよw
0128デフォルトの名無しさん垢版2021/10/12(火) 23:04:22.32ID:h64P2lE5
>>127
お前こそお前が言った「ケチつけて」でばっかというのが気づかないんだなあ
>>11,12をちゃんと謙虚に読めよw
その流れのうちの話でしかないからな
それも読まない/読めないくてだからなあ、言っても「全く」わからないんだろうけど
0130デフォルトの名無しさん垢版2021/10/12(火) 23:07:56.95ID:FcrICImt
>>128
だからちゃんと自分のレスを読み返してねw
間違ってるぞw
testとexprの終了コードは同じじゃないぞw
もう面倒だから、これ以上の指摘もしないけど。

つか、このスレこんな自称「プロ」みたいのが常駐してんの?w
うへぇw
0131デフォルトの名無しさん垢版2021/10/12(火) 23:12:44.17ID:h64P2lE5
>>130
...すんげー読めなさぶりを発揮してくれちゃってもうwwwww
本当にお前はwww
誰も評価が同じとは言ってない。そこかよwww

exprだろうがtestだろうがコマンド[の](独自とか独特とか何でもいいけどそんなん)でしかないと読めると思ったんだがなあ
[の]の後に何が続くかも読めないのか...何が続くと思ったのだろう?いや続くとは思わなかったのか??不思議だなあ
(
日本語日本語とお前は言ってるが、日本語小説読めないぞそんなんじゃ。読まない読めないのか?)
0132デフォルトの名無しさん垢版2021/10/12(火) 23:23:38.49ID:FcrICImt
>>131
うん、少しわかったw君は日本語が書けないんだね?w
日本語ができないのかwまずそこから勉強しようねw
0133デフォルトの名無しさん垢版2021/10/12(火) 23:25:37.38ID:h64P2lE5
>>132
お前にもわかるような教科書や参考書のような日本語は面倒で書くわけがないわな
お前が望んでるのはそんなのだなw
0134デフォルトの名無しさん垢版2021/10/12(火) 23:28:04.77ID:FcrICImt
>>133
なるほどね。
だから、俺の書いてあることがよくわからなくて、
いちゃもんつけて絡んできたわけか。
最低だな。まさにネットチンピラだねw
0135デフォルトの名無しさん垢版2021/10/12(火) 23:32:03.22ID:h64P2lE5
>>134
wwwwww
何で「だから〜」になるやねんwwwww
さすがだなあ

お前が読めない読まないくせに。俺だけじゃないらしいぞお前のそういう評価はw
それを踏まえての>>133なんだが、何故その理解になるんだか、七不思議
まあ、それもお前は自分の言ってることが正しいとお前だけ言い張るからだろうけど
0136デフォルトの名無しさん垢版2021/10/12(火) 23:38:40.11ID:h64P2lE5
>>134
華麗にスルーされたけどさ、

前スレ>>989なんて言ってるけど、確かにWindows APIはBooleanで返すのが多い
だがそれはWindows APIの文化でしかない、シェルスクリプトの本家wであるUnixで何か書いたことがあるなら文化が違うとわかりそうなもんだが、なぜかWindows APIのが全てと言ってそうな前スレ>>989
WSLからのにわかか?

って、合ってる?w
あと、宮城県に住んでいたりする?w
日付も変わるし、>>11,12以降何も意味あることないからw(互いになww)、もう締めようかと
で、>>12での俺の疑問と、後はなんかソレっぽい(まあ、無いと思うけど)確認したいんだけどw
0137デフォルトの名無しさん垢版2021/10/12(火) 23:50:54.06ID:FcrICImt
とうとう変なゲスの勘繰りまで始めた…w
いや、読めんよ、これはw本当にw
もしかして、頭がおかしいのだろうかね…
0138デフォルトの名無しさん垢版2021/10/12(火) 23:53:59.72ID:h64P2lE5
>>137
「ゲスの勘ぐり」wwww
散々してる、お前が言うなーーーーーーーwwwww
すげえなあ

ちゃんと理由書いてるからな、最初のは
後のは特定w有名人に似すすぎてな、その自己完結して他の人の指摘を聞き入れない頑固さ自己防衛意識wだけなのは
0140デフォルトの名無しさん垢版2021/10/12(火) 23:57:17.44ID:FcrICImt
さすがにID:h64P2lE5みたいなのと会話するのはちょっと神ならぬ我が身では無理、
だな。
犬に噛まれたと思って諦めるよ
0141デフォルトの名無しさん垢版2021/10/12(火) 23:58:27.76ID:h64P2lE5
>>139
すげえよww(マジ似すぎwwww)
俺に対して「こうじゃないか」とお前は散々言っているんだがな、根拠全くなく(=外れてるから)
いや、お前のは「こうだ」と決めつけてるけどな。俺はお伺いしてるんだから謙虚wwだろう?w
0143デフォルトの名無しさん垢版2021/10/13(水) 00:02:02.99ID:2M6ScVbl
YESかNOで済む話なのに、何で答えるのに拘るのか
別にNOでもそれ以上突っ込むことは無いのに
まあ、なんかわけわからんプライドからだったりするんだろうな
NOすら貰えなくて残念だったわ
じゃあ、また会おうw
0144デフォルトの名無しさん垢版2021/10/13(水) 01:33:02.11ID:D0IOdnVZ
>>135
> 俺だけじゃないらしいぞお前のそういう評価はw

なにいうてんねん、イキりをイジりはじめたんはワイのが先やろ?w
前スレ>>984もワイやし、前スレ>>897からの付き合いや!

て、あれ?
もう終わったん?
0147デフォルトの名無しさん垢版2021/10/13(水) 05:40:01.42ID:DA35qh3D
>>144
>なにいうてんねん、イキりをイジりはじめたんはワイのが先やろ?w
w 先かもしれないなあ、いや先だろな
別に俺が言い始めたとは言ってないから勘弁してくれw

>前スレ>>984もワイやし
あ...>>989 の間違いだった(趣旨がトンチンカンの>>982のに「まあ、これなんだよね(笑)」と同意してる)
誠にすまんことです
繰り返したぶん、 ID:FcrICImt にもすまん
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じゃないよ
はっきりした
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 ではまともにクオートをすることができません。

これか

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

難しいのか不可能なのかはっきりしてほしいな
不可能なんじゃないのか?
0250242垢版2021/11/19(金) 08:41:17.13ID:STy6DLgM
LFが入った変数を再度シェルに評価させるときは、
もともとその変数の末尾に¥¥を書く。
気をつけるのはヒストリ置換だけじゃなかったね
忘れてたよ。

alias time-filter '(perl -e '"'"'\\
use POSIX qq(strftime); \\
$| = 1; \\
while (defined(my $line = <>)) { \\
print strftime("%Y/%m/%d %H:%M:%S ", localtime), $line; }'"')"

こんな感じ。
csh手元にないから動作確認してみて。
tail -f 時刻が出ない追記されていくファイル | time-filter
って感じで使ってた
0251デフォルトの名無しさん垢版2021/11/19(金) 21:58:57.06ID:QjMBy/iN
例の大学で教授やってるやつ、どうどう利用規約違反してたことを
宣言しててこいつやばくね?わかってないのかね?

リッチー大佐の中の人

https://twitter.com/col_richie/status/1460830111939186689

> Twitter API v2は、収集可能なツイート数の制限が無料プランでも月200万ツイートに緩和される、
> とアナウンスされたのだが、我らのTwitterアプリ「小鳥男」なら、とっくの昔から、
> 理論上432万ツイートを1日で(1秒あたり50)収集する能力を持っているぞ。
https://twitter.com/5chan_nel (5ch newer account)
0255デフォルトの名無しさん垢版2021/11/20(土) 10:05:52.73ID:+pLKjIh3
例えて言うのなら、

1ヶ月30GBまで使えるように緩和されます

とっくの昔から理論上一日で30GB使い切るアプリを持っているぞ!

何を自慢しているのかわからないなw
そんなのどんなアプリだって使い切る能力ぐらい持ってるでしょ


432万ツイートを収集できる能力のどこが「とっくの昔から能力を持ってるぞ」と
自慢するようなないようなのかわからん
0256デフォルトの名無しさん垢版2021/11/20(土) 10:12:48.03ID:+pLKjIh3
むしろ1秒あたり50ツイートって遅くね?
1ツイートあたり 280文字?として多めに見積もって1ツイート1KB
つまり50KB/sでしょ?

Twitter側の帯域制限があるのだろうと思うけど
別に自慢できる量じゃないなぁ
そもそも通信速度とサーバーの負荷に依存する話なので
たかがクライアントアプリを自慢するようなもんじゃない
0258デフォルトの名無しさん垢版2021/11/23(火) 15:01:42.04ID:HIAOM8SH
全ての事をシェルスクリプトで実現可能だと信じる者にとっては、この世の全てはシェルスクリプトの話になる。
0259デフォルトの名無しさん垢版2021/11/24(水) 16:26:22.49ID:uH6oNI9g
すみません、質問です。

hoge(関数) /usr/bin/python /usr/local/bin/piyo/piyopiyo.py

mv foge fogefoge
rm *hege*.csv
exit

hoge()[
python -B $1
以下、処理
]

という形は、
hoge(関数)というサブルーチン内で/usr/local/bin/piyo/piyopiyo.pyを実行する形になりますでしょうか。

お手数おかけして恐縮ですが、教えていただければ幸いです。
0261デフォルトの名無しさん垢版2021/11/25(木) 01:32:33.90ID:nh0ZEMSE
コマンド呼び出しは、 `〜`, $(〜)

〜の所に、/usr/bin/python /usr/local/bin/piyo/piyopiyo.py
を書けばよい

python で、スクリプトファイルを実行する
0262デフォルトの名無しさん垢版2021/12/06(月) 13:07:43.50ID:EdXlAvnn
リッチー大佐ヤケドしすぎててワロタw
あの2人、終始レッテル貼りと揚げ足取りばっかりで終わってるな
0264デフォルトの名無しさん垢版2021/12/07(火) 08:02:22.59ID:J63EZfFq
お?本人登場ですかな?www
0265デフォルトの名無しさん垢版2021/12/07(火) 11:51:58.44ID:sVKUttQ/
ガチでヌーブなんですけどrequestsとbeautifulsoupでスクレイピングやってます
waitかけないとバンされるよと言われましたがどうすればいいですか?
requests.get()でtimeoutは今書きましたがforで同じサイトの似たようなページに何度もアクセスするのでサーバーへの負荷はすごいと思います
これに対してどうすればいいですか?
0267デフォルトの名無しさん垢版2021/12/08(水) 18:51:18.84ID:pKMBsr2n
すみません、質問です。

cp -f dir1/file dir2 を実行し、もし失敗したとき、
echo File copy failure >> log
を実行させる処理はどのようにすればよいですか?
0270デフォルトの名無しさん垢版2021/12/08(水) 21:26:49.78ID:FensyVy4
シェルスクリプト if文
でググると最初の方にあるのは、[ ] (test) ありきで、
評価するのは 条件式 と他の言語と同じような説明してるのなんだな
0271デフォルトの名無しさん垢版2021/12/09(木) 11:10:12.63
一定時間ごとにechoするスクリプトがあります
プロセスっていうのでしょうか、
そのechoされたものを動的に取得し
別のスクリプトに渡したいのですがどうやればいいのでしょうか

【sample1.sh】
echo aaa
sleep 3
echo bbb

【sample2.sh】
echo $1

$ bash sample1.sh & sleep 5 && bash sample2.sh

このコードになんらかを加えてsample2にbbbを渡せたらな、
というのを期待しています
0272デフォルトの名無しさん垢版2021/12/09(木) 11:16:25.28
補足 >>271
実際はsample1.shの部分はサードパーティな他のスクリプトで
そのプロセスが走ってる感じです
具体的にはbash sample1.shの部分は
npm localtunnel --port 8010
です。
これが途中で your url is https://○○
みたいな表示が出てくるのですが
そのhttps://○○をsample2.shで受け取りたいのです。
0274デフォルトの名無しさん垢版2021/12/09(木) 11:52:59.62ID:4q0mFQ+L
# コマンドの実行履歴を出力する
set -x

# コマンドの返り値が非ゼロのとき停止する
set -e

コマンド終了時には「終了ステータス (exit-status)」と呼ばれる、
コマンドの成否を表す数値が、特殊変数 $? に自動で設定される

各コマンドにより異なるが、一般的には、
コマンド成功時には「0」
失敗時には「1」(コマンドやエラーの種類によっては、0 以外)

何かのコマンド
echo $?

例えば、
#!/bin/sh

cat abc

case $? in
0) echo "ファイルが存在する" ;;
*) echo "ファイルが存在しない" ;;
esac

これを、if [ $? = 0 ]; then
と書くと、Shell Check の警告が出る

SC2181: Check exit code directly with e.g. 'if mycmd;', not indirectly with $?.
0275デフォルトの名無しさん垢版2021/12/09(木) 11:59:18.64ID:4q0mFQ+L
>>271
プロセスの標準出力・エラーを、tee とかでファイルへリダイレクトして、
そのファイルを、tail とかで読み込めば?

単純に、パイプでつないでも出来るかな?
分からないけど
0278デフォルトの名無しさん垢版2021/12/09(木) 22:10:34.91ID:ghcaSzTo
>>271 mkfifoで名前付きパイプを使ってもいいと思った
取りこぼしが無いよう、先にパイプを作る必要はあるが
mkfifo pipe
sample2.sh < pipe &
sample.sh > pipe &
fg %-
みたいな
0279デフォルトの名無しさん垢版2021/12/09(木) 22:21:13.87ID:2QHtVdpK
sample2の引数にsample1を取って中で実行させるんじゃ駄目なの?
0281デフォルトの名無しさん垢版2021/12/10(金) 01:52:13.39ID:Uh57IFJZ
>>274
無駄な書き方だからでは?
警告通りに if mycmd ... の形式を使うわけには行かないのか?
0283デフォルトの名無しさん垢版2021/12/11(土) 14:27:15.50ID:uPYAT6Ja
>>274
普通はファイルが存在するならコマンドを実行する、と書くし、非存在時のechoコマンドの
出力先が標準出力な点も気になる(標準エラー出力であるべき)。また、catコマンド実行時に
ファイルが見つからなければ、"そのようなファイルやディレクトリはありません"とコマンド
自体が(標準エラー出力に)メッセージを出すので、重複した記述でもある。
0284デフォルトの名無しさん垢版2021/12/11(土) 18:07:38.11ID:vrksYrpn
> 普通はファイルが存在するならコマンドを実行する、と書くし、

書かねーよ。
ファイルが存在すると判断した後の消されたどうすんだ
シェルスクリプト業界って素人が多いのか?
0285デフォルトの名無しさん垢版2021/12/11(土) 18:07:53.48ID:vrksYrpn
ファイルが存在すると判断した後に消されたどうすんだ
0287デフォルトの名無しさん垢版2021/12/11(土) 18:15:19.56ID:vrksYrpn
シェルスクリプト業界だろ?w
シェルスクリプトばーっかりやってる
シェルスクリプト最強って言ってるアホ会社ども
0289デフォルトの名無しさん垢版2021/12/11(土) 19:21:54.38ID:Vruq/eED
どうせエラー出て失敗するんだからやり直せばいいだけのことなのに
あらゆる可能性を想定して滅多に使われない機能まで組み込んで肥大化する方があるある
0290デフォルトの名無しさん垢版2021/12/11(土) 19:36:54.86ID:EpvuxOsQ
問題点に対するソリューションのご提案。
・ファイルロックを取得してから操作します。
・ファイルロックを取得できなかった場合、
 1.他のプロセスが既に取得している。
 2.ファイルが存在しない。
・以上を確認します。
0291デフォルトの名無しさん垢版2021/12/11(土) 20:08:06.21ID:vrksYrpn
>>288

> 普通はファイルが存在するならコマンドを実行する、と書くし、

これがだめなやり方だって話をシてるんだが理解してる?
0293デフォルトの名無しさん垢版2021/12/11(土) 22:38:36.00ID:qYkp+8zL
テキストの入力、加工、出力以外の処理を無理に書くべきじゃない
それ以上のことがやりたくなったら別の言語使った方が楽
0294デフォルトの名無しさん垢版2021/12/11(土) 22:39:56.90ID:vrksYrpn
シェルスクリプトでcpやrmを実行するなとか言ってんの?
アホじゃね?
お前シェルスクリプトの使い方を間違ってるよ
むしろテキストの加工ならなんの言語でやってもいい
0295デフォルトの名無しさん垢版2021/12/11(土) 23:30:45.47ID:dNHI9UuU
どこの会社でもやたら批判的な発言をするものの具体的な答えは何も示さず
相手が何を言い返しても分かった風の立場で「それは違う」と上から目線で言い続けるだけのマシーンっているよね
一言目から答え出しておけば無駄な会話もなくなるのに
0296デフォルトの名無しさん垢版2021/12/11(土) 23:47:58.53ID:6uvwt7oX
変な会社に勤めてるんだな
自分の特殊な環境なのに全体にするとか
ネットによく居るタイプだな
0300デフォルトの名無しさん垢版2021/12/12(日) 12:20:58.07ID:JyN9iiR1
ファイルをロックしてまで、やっているスクリプトは珍しい

普通は、ファイルが存在しなければ、そこでエラーになるだけ
0301デフォルトの名無しさん垢版2021/12/12(日) 12:27:49.49ID:y4gnCele
シェルスクリプトには真のファイルロックなんてない
ロックファイルを作ってごまかしてるだけ
だからその状態で電源OFFとかエラーで強制終了すると
中途半端にファイルが残ってトラブルになる
0302デフォルトの名無しさん垢版2021/12/12(日) 12:28:31.23ID:y4gnCele
そもそもファイルをロックするなんて出た時点で
シェルスクリプトを使うのは間違ってる
データベースを使えばいい
0309デフォルトの名無しさん垢版2021/12/14(火) 09:18:10.80ID:/wewuKga
name=value
: $(($name = 123))
echo $value

これってPOSIX準拠?
0311デフォルトの名無しさん垢版2021/12/14(火) 15:31:16.80ID:VTHB4KBI
bc使わないで小数の比較演算ってできますか?
RHEL8.0環境で何もインストールしてはいけません縛りの環境を渡されてbc入ってなくて詰んでます。
0314デフォルトの名無しさん垢版2021/12/14(火) 15:56:55.09ID:VTHB4KBI
確かに
pythonで計算することにします
ありがとうございました
0315デフォルトの名無しさん垢版2021/12/14(火) 15:59:09.28ID:/wewuKga
>>311
何もインストールできないせいで、生産性が下がっていますって
言わないとあとで苦労する
生産性が下がっている原因を、くだらない決まりを作ったやつに押し付けろ
0321デフォルトの名無しさん垢版2021/12/14(火) 17:54:50.69ID:sz49PmUD
まさか「書いてる」という言質が欲しかったわけじゃないよな
言葉使いからは「いつもの」っぽいけど
書いてると言われても見つけられなさそうだな、パターン的には
0322デフォルトの名無しさん垢版2021/12/14(火) 17:57:32.23ID:0juEz1uN
>>318
「比較」やそうやから、「計算」やないんでセーフ。
値とかバージョンとかの比較は、シェルスクリプトでもしたいことはあるやろ。

と書いて、ひとつ思い出した。

>>311
sort --sort numericでいいんでは。
0324デフォルトの名無しさん垢版2021/12/14(火) 18:04:26.19ID:sz49PmUD
Linuxは一貫としてbcはデフォでは入ってないんだな。なんでだろ
LinuxというかGNUがだろけど
0325デフォルトの名無しさん垢版2021/12/14(火) 18:15:04.93ID:sz49PmUD
POSIXとの互換性、仮にGNU bcでPOSIXのがそのまま動くとしても互換動作モードやドキュメントを書くのが面倒 とかかなと思ったら、
-w, --warn
POSIX bc に対する拡張機能が入力された場合は警告を出します。
-s, --standard
POSIX bc の言語仕様に厳密に従って処理します。
きっちりあるやん。なんでだろ。ナゾい
0329デフォルトの名無しさん垢版2021/12/14(火) 19:18:10.50ID:sz49PmUD
なんか、予告的なアンカーだなw
書いてませんでした と言えるのがイミフ。凄すぎてわからん
0330デフォルトの名無しさん垢版2021/12/14(火) 19:18:12.33ID:/wewuKga
なるほど、本当にここに書いてあるという主張してるのか

2.6.4 Arithmetic Expansion
Arithmetic expansion provides a mechanism for evaluating an arithmetic expression and substituting its value. The format for arithmetic expansion shall be as follows:

$((expression))

The expression shall be treated as if it were in double-quotes, except that a double-quote inside the expression is not treated specially. The shell shall expand all tokens in the expression for parameter expansion, command substitution, and quote removal.

Next, the shell shall treat this as an arithmetic expression and substitute the value of the expression. The arithmetic expression shall be processed according to the rules given in Arithmetic Precision and Operations, with the following exceptions:

Only signed long integer arithmetic is required.

Only the decimal-constant, octal-constant, and hexadecimal-constant constants specified in the ISO C standard, Section 6.4.4.1 are required to be recognized as constants.

The sizeof() operator and the prefix and postfix "++" and "--" operators are not required.

Selection, iteration, and jump statements are not supported.
0331デフォルトの名無しさん垢版2021/12/14(火) 19:18:27.78ID:/wewuKga
All changes to variables in an arithmetic expression shall be in effect after the arithmetic expansion, as in the parameter expansion "${x=value}".

If the shell variable x contains a value that forms a valid integer constant, optionally including a leading <plus-sign> or <hyphen-minus>, then the arithmetic expansions "$((x))" and "$(($x))" shall return the same value.

As an extension, the shell may recognize arithmetic expressions beyond those listed. The shell may use a signed integer type with a rank larger than the rank of signed long. The shell may use a real-floating type instead of signed long as long as it does not affect the results in cases where there is no overflow. If the expression is invalid, or the contents of a shell variable used in the expression are not recognized by the shell, the expansion fails and the shell shall write a diagnostic message to standard error indicating the failure.

どこにあるのか、言ってみ
0334デフォルトの名無しさん垢版2021/12/14(火) 19:21:00.40ID:/wewuKga
英語めないんでしょ?

2.6.4 算術式の展開
算術展開は、算術式を評価してその値を代入するためのメカニズムである。算術展開のフォーマットは以下のとおりです。


$((式))

式は二重引用符で囲まれているかのように扱われますが、式の中の二重引用符は特別に扱われません。シェルは、パラメータの展開、コマンドの置換、
引用符の除去のために、式のすべてのトークンを展開する。

次に、シェルはこれを算術式として扱い、式の値を代入する。算術式は、以下の例外を除き、
「算術の精度と演算」で示された規則に従って処理されなければならない。

符号付き長整数の算術演算のみが必要である。

ISO C規格の6.4.4.1項で規定されている
10進数定数、8進数定数、16進数定数のみを定数として認識する必要があります。

sizeof()演算子、前置および後置の "++"および"--"演算子は必須ではありません。
選択、反復、およびジャンプ文はサポートされていません。

算術式の中の変数に対するすべての変更は、"${x=value}"というパラメータ展開のように、
算術式の展開の後に効力を持つものとします。

シェルの変数xが、有効な整数定数を構成する値を含み、オプションとして先頭に<プラス記号>または
<ハイフン-マイナス>を含む場合、算術展開の"$((x)) "と"$(($x)) "は同じ値を返すものとします。

拡張機能として、シェルはここに挙げた以外の算術式を
認識することができます。シェルは、signed long のランクよりも大きいランクの符号付き整数型を使用することができます。
シェルは、オーバーフローが発生しない場合の結果に影響しない限り、signed long の代わりに real-floating 型を使用してもよい。式が無効な場合、または
式で使用されているシェル変数の内容がシェルによって認識されない場合、展開は失敗し、シェルは失敗を示す診断メッセージを標準エラーに書き込まなければならない。
0337デフォルトの名無しさん垢版2021/12/14(火) 19:23:44.74ID:/wewuKga
書いてないものをよく読めっていってごまかしてるのは
自分の間違いを認められないからなのかな?
0338デフォルトの名無しさん垢版2021/12/14(火) 19:24:02.73ID:sz49PmUD
>>334
英語読めない...w
よく言うよ。その日本語でもいいけど、英語の方がわかりやすいと思うぞ
しかも、テキストでなくハイパーテキストの方が
0340デフォルトの名無しさん垢版2021/12/14(火) 19:26:13.37ID:/wewuKga
> シェルの変数xが、有効な整数定数を構成する値を含み、オプションとして先頭に<プラス記号>または
> <ハイフン-マイナス>を含む場合、算術展開の"$((x)) "と"$(($x)) "は同じ値を返すものとします。

ここよく読めばわかるが、書いてないと言ってる。

他に言い返す言葉はある?
0342デフォルトの名無しさん垢版2021/12/14(火) 19:29:37.68ID:sz49PmUD
ちなみに確認だが、
>>330,331と出してきた(よく探せて偉いぞw)ってことは、
問題にしてるのは
$(($name = 123))
これ
name = 123
これ
=
これ
ってことでいいんだな?

>>340って、もろPOSIXに準拠してるやんって書いてるとこをわざわざ出してイミフなことからも上記の通りで良さげかな

>>339,340
>>336,338の書いた通り
0343デフォルトの名無しさん垢版2021/12/14(火) 19:31:39.59ID:/wewuKga
>>342
なんで内容を端折るんだ?
たった3行だろ
全部読めよ
理解してないまま回答してるんだから
そりゃ嘘つき呼ばわりされてもしょうがない

name=value
: $(($name = 123))
echo $value

これってPOSIX準拠?
0344デフォルトの名無しさん垢版2021/12/14(火) 19:32:41.80ID:/wewuKga
英語読めない。規格書を読めないって
バカにされていた○○主義者ってのがいたなぁ
0345デフォルトの名無しさん垢版2021/12/14(火) 19:34:10.98ID:sz49PmUD
>>343
だから、それ全部、うん だってw そして書いてあるってw

お前が>>330,331と出してきてるんじゃないか
(またその中からもトンチンカンに一部抽出したりしてw)
0349デフォルトの名無しさん垢版2021/12/14(火) 19:35:59.31ID:/wewuKga
name=value
: $(($name = 123))
echo $value

これよんで、

> 問題にしてるのは
> $(($name = 123))
> これ
> name = 123
> これ
> =
> これ
> ってことでいいんだな?

なんて質問するのも頭が悪い
0350デフォルトの名無しさん垢版2021/12/14(火) 19:36:18.40ID:sz49PmUD
>>346,348
いつもの 誤魔化 しかよ
つくづくだな

お前はどこがPOSIX準拠じゃないと思ってるねん?
name=value
: $(($name = 123))
echo $value
全部か?w
0351デフォルトの名無しさん垢版2021/12/14(火) 19:37:27.42ID:/wewuKga
>>350
はぁ。説明しないと理解できないのか・・・

POSIXにはname変数の中身が整数定数でないときに
どうなるかの挙動が書いてない

反論はあるか?
0354デフォルトの名無しさん垢版2021/12/14(火) 19:42:47.04ID:sz49PmUD
>>351,352,353
>POSIXにはname変数の中身が整数定数でないときに
>どうなるかの挙動が書いてない
なに言ってるの? name = 123 この部分だろ?
name変数の中身が整数定数 なんて関係ないぞ
コンピューターサイエンスw的に、型が無い言語なら当たり前的にもな

お前は仕様書、規格書読むのに必要な知識が足りなさすぎだがな、
よく言うよほんと自己紹介好きw
0355デフォルトの名無しさん垢版2021/12/14(火) 19:44:03.99ID:/wewuKga
> なに言ってるの? name = 123 この部分だろ?

name = 123 と書いたのはおまえ

↓どこにも書いてない。目が悪い?それとも頭?

name=value
: $(($name = 123))
echo $value
0356デフォルトの名無しさん垢版2021/12/14(火) 19:44:44.42ID:/wewuKga
> If the shell variable x contains a value that forms a valid integer constant,

読めないんだろうなぁ

はい、翻訳
シェルの変数xが、有効な整数定数を構成する値を含み、
0357デフォルトの名無しさん垢版2021/12/14(火) 19:45:07.43ID:6VIYonG0
$nameをvalueに変えるparameter expansionは最初に行われるでしょ
> The shell shall expand all tokens in the expression for parameter expansion, command substitution, and quote removal.
その後は普通にvalue = 123が実行されるだけ
0359デフォルトの名無しさん垢版2021/12/14(火) 19:45:41.12ID:sz49PmUD
>>355
じゃあ、お前の言う
>POSIXにはname変数の中身が整数定数でないときに
>どうなるかの挙動が書いてない
ってどこの部分やねん

お前は他人の文の意味を読めなさすぎ、のくせによく言うよを繰り返しすぎだな
0360デフォルトの名無しさん垢版2021/12/14(火) 19:51:21.66ID:sz49PmUD
>>356,358
= の左辺には関係ないとわかりそうなもんだが
というか、そのトンチンカンに取り出した一部ではない全文が何を説明したいのかわかってないだろ
お前は他人の文の意味を読めなさすぎ
0363デフォルトの名無しさん垢版2021/12/14(火) 20:16:20.29ID:/wewuKga
今までの流れからすればこう書いたほうがいいね

name="var=1+2"
echo $(( name ))

name変数の中身が整数定数でないときに
どうなるかの挙動は書いてない
0365デフォルトの名無しさん垢版2021/12/18(土) 21:47:26.51ID:ThKMmio5
文字の長さに応じていい感じにタブの個数調整してくれる素敵なワンライナーとかない?
0366デフォルトの名無しさん垢版2021/12/19(日) 00:43:08.09ID:1P9anxgU
ワンライナーじゃなくてコマンドだろ
だいたいタブ個数調整と言われて
仕様がわからないとなんとも言えん
0369デフォルトの名無しさん垢版2021/12/25(土) 21:25:20.38ID:gsyC6xqY
>>368
2バイト文字では試してないけど
タブは8の倍数で位置を揃えるために必要な数が切り替わるので文字列リストの中で最大文字数のものに付与するタブを1として文字数が少なくなるほどタブを増やして行けばいいと分かった

最大文字数が42の場合
0〜7 タブ6つ
8〜15 タブ5つ
16〜23 タブ4つ
24〜31 タブ3つ
32〜39 タブ2つ
40〜47 タブ1つ
……

BINDのzoneファイルにAレコード大量追加したかっただけだから
ifで分岐させてなんとかしたけどもっと上手いことできるなら頼む
0370デフォルトの名無しさん垢版2021/12/25(土) 21:48:29.81ID:sYCPCNUA
>>369
これを渡したら
<test.lst>
abc.c0м
defghijk.c0.jρ
123456.nёt
zzz.i0

これを出力して欲しい
<test_.lst>
abc.c0м   IN A localhostのIP
defghijk.c0.jρ IN A localhostのIP
123456.nёt  IN A localhostのIP
zzz.i0     IN A localhostのIP


スマホからだからあれだがIN A以降は揃ってるつもり
0372デフォルトの名無しさん垢版2021/12/25(土) 22:32:53.73ID:o6Yb7nqK
ifとprintfでやった
0373デフォルトの名無しさん垢版2021/12/26(日) 01:41:37.96ID:7bx5KWMB
>>370
スペース区切りの複数単語が1行に入っていて1番目と2番目の間の空白を調整して2番目が全行で同じ位置から始まるようにするってことね。
0374デフォルトの名無しさん垢版2021/12/26(日) 01:44:16.01ID:7bx5KWMB
あ、ちょっと違うか。2番目以降は固定で決まっているから1番目の単語だけ読ませてその後ろのタブを何個付加するかの問題か。
0375デフォルトの名無しさん垢版2021/12/26(日) 02:10:55.11ID:7bx5KWMB
>>370
できた。perl だ。

$ perl -ne 'chomp;push(@s,$_);if($l<length){$l=length} END{$m=int($l/8)+1;for(@s){print$_.("\t" x ($m-int(length($_)/8)))."IN A localhostのIP\n"}}' test.lst
abc.c0м IN A localhostのIP
defghijk.c0.jρ IN A localhostのIP
123456.nёt IN A localhostのIP
zzz.i0 IN A localhostのIP
$
0376デフォルトの名無しさん垢版2021/12/26(日) 02:14:02.08ID:7bx5KWMB
ただし、UTF-8で複数バイト文字混ざりだと画面上の幅とバイト数が一致しなくて失敗する行が出てくるだろうな。
0378デフォルトの名無しさん垢版2021/12/26(日) 06:24:53.12ID:7bx5KWMB
>>377
シェルだけでワンライナーにしろってか?可能な感じはするが、長くなりそうだな。ちょっと君試しに作ってみなよ。
0381デフォルトの名無しさん垢版2021/12/26(日) 08:08:53.29ID:7ywlyW9o
columnコマンドなんてあったのな
これしゅごい
0382デフォルトの名無しさん垢版2021/12/26(日) 09:30:37.45ID:JgxQVN1x
>>378
スレタイ読めよ
0383デフォルトの名無しさん垢版2021/12/26(日) 12:47:31.30ID:N3NYq5+A
プログラム技術。
0384デフォルトの名無しさん垢版2021/12/26(日) 12:59:08.59ID:VAEhq19p
すれたい
0386デフォルトの名無しさん垢版2021/12/26(日) 17:10:00.49ID:NwCcamJz
シェルではないね
0391デフォルトの名無しさん垢版2021/12/26(日) 23:55:43.97ID:7bx5KWMB
>>380>>385
TABになってないじゃん。
0392デフォルトの名無しさん垢版2021/12/26(日) 23:56:34.73ID:7bx5KWMB
>>387
既存のコマンドで丁度良くTAB入れるやつは何てコマンド?
0393デフォルトの名無しさん垢版2021/12/27(月) 01:45:10.81ID:t9d2fK6k
>>392
スペースをタブに置き換える unexpand ってコマンドがあるよ!

>>385をちょっと改造、第一フィールドを50文字にしてスペースをタブに変換してみよう

awk '{printf "%-50s %s", $1, "IN A 127.0.0.1\n"}' test.lst | unexpand -a


でタブをスペースに置き換えるのが expand ってコマンド
expand はたまに使うけど unexpand はあんまり使わないよね
0394デフォルトの名無しさん垢版2021/12/27(月) 01:51:55.20ID:4XXPAYbv
>>393
第一フィールだけやるな
50文字固定にするな
awkで実装したって劣化版になるだけやろ?
columnをインストールすればいいだけやん
0395デフォルトの名無しさん垢版2021/12/27(月) 02:06:52.16ID:4gZrwhe1
>>393
unexpand -a だと全ての空白を対象にしてTABに置き換えようとするためにうまく行かなくなることがあるのでは?

>>394
column コマンドでは TAB は出力されないよね。
0396デフォルトの名無しさん垢版2021/12/27(月) 02:53:50.89ID:t9d2fK6k
>>394
何そんなに怒ってんの?
入学試験じゃないんだからさ〜、臨機応変、柔軟、適当にやればいいじゃん
それに column 使うのはいいとしてAレコードの追加しなきゃダメでしょう?

>>395
あんまり細かいことは突っ込まないでねw
0397デフォルトの名無しさん垢版2021/12/27(月) 05:01:52.38ID:4XXPAYbv
> column コマンドでは TAB は出力されないよね。
スペースをタブに変換すりゃいいだろ
0398デフォルトの名無しさん垢版2021/12/27(月) 05:02:55.30ID:4XXPAYbv
シェルスクリプトというのは既存のコマンドを使って
いかに楽をするかっていうのが重要
POSIXにこだわるのはアホ
0399デフォルトの名無しさん垢版2021/12/27(月) 05:33:06.74ID:oI31DZmc
>>394
columnコマンド使って>>370やってみろよ
0400デフォルトの名無しさん垢版2021/12/27(月) 11:39:49.78ID:4gZrwhe1
>>396
TABかスペースが関係ないならそれで良いんだよ。>>369, >>370 の求めているものとは違うものになるけどな。

>>397
それをするのに丁度良いコマンドはあるの?
unexpand -a では全スペースが対象になってしまって駄目かも知れないわけだが。
0401デフォルトの名無しさん垢版2021/12/27(月) 12:51:40.94ID:t9d2fK6k
ハイハイ、ご要望通りにいたしましたw

F="%-`wc -L test.lst|cut -f1 -d' '`s";awk '{printf"'$F'\t%s",$1,"IN A 127.0.0.1\n"}' test.lst|unexpand -a
0402デフォルトの名無しさん垢版2021/12/27(月) 22:40:58.39ID:6GChlJ/6
>>401
ありがとう
0404デフォルトの名無しさん垢版2021/12/28(火) 12:30:02.74ID:IE5w4ImF
>>400
> unexpand -a では全スペースが対象になってしまって駄目かも知れないわけだが。

駄目だって事例提示してみ?
0408デフォルトの名無しさん垢版2021/12/28(火) 23:09:44.65ID:5lZUdhkB
POSIX原理主義者「POSIXにはないコマンドをawkで再実装した」

UNIX哲学「車輪の再発明をするな」

POSIX原理主義者「・・・」
0411デフォルトの名無しさん垢版2021/12/29(水) 01:12:38.97ID:Uqmbe8qT
2カラム目以降に何が来ようとも決してTAB変換されなくするには2カラム目以降を完全に後付けにすれば良い
それとawkの-vで事前に最大文字数入れておいて後でprintfのフォーマットに*使った方が見た目奇麗になるね

awk -v m=`wc -L < test.lst` '{printf "%-*s\t\n", m, $1}' test.lst | unexpand -a | xargs -i echo "{}IN A 127.0.0.1"
0412デフォルトの名無しさん垢版2021/12/29(水) 02:59:14.48ID:I8/QQkF4
スーパーコンピュータシステムのファイル消失のお詫び
https://www.iimc.kyoto-u.ac.jp/ja/whatsnew/information/detail/211228056999.html

2021年12月14日 17時32分 から 2021年12月16日 12時43分にかけて,
スーパーコンピュータシステムのストレージをバックアップするプログラム(日本ヒューレット・パッカード合同会社製)の
不具合により,スーパーコンピュータシステムの大容量ストレージ(/LARGE0) の一部データを意図せず削除する事故が発生しました.


Lustre ファイルシステムのファイル消失について
https://www.iimc.kyoto-u.ac.jp/services/comp/pdf/file_loss_insident_20211228.pdf

1 ファイル消失の影響範囲
対象ファイルシステム: /LARGE0
ファイル削除期間: 2021 年 12 月 14 日 17 時 32 分〜2021 年 12 月 16 日 12 時 43 分
消失対象ファイル: 2021 年 12 月 3 日 17 時 32 分以降、更新がなかったファイル
消失ファイル容量: 約 77TB
消失ファイル数: 34,011,293 ファイル
影響を受けたグループ: 14 グループ(4 グループが復元不能)

3 ファイル消失が発生した原因
バックアップスクリプトには、find コマンドにより 10 日以上古いログファイルを削除する処
理が含まれています。スクリプトの機能改善と合わせて、find コマンドの削除処理に渡す変数名
を視認性・可読性を高めるため変更いたしましたが、この修正したスクリプトのリリース手順に
考慮不足がありました。
bash は、シェルスクリプトの実行中に適時シェルスクリプトを読み込みます。この挙動によ
る副作用を認識できておらず、実行中のスクリプトが存在している状態でスクリプトの上書きに
よりリリースしてしまったことで、途中から修正したシェルスクリプトの再読み込みが発生し、
結果的に未定義の変数を含む find コマンドが実行されてしまいました。この結果、本来のログ
ディレクトリに保存されたファイルの削除をする処理ではなく、/LARGE0 のファイルを削除し
てしまいました。
0415デフォルトの名無しさん垢版2021/12/29(水) 04:05:13.87ID:DIjHY86S
シェルスクリプト以外ではほとんど見られない性質ではあるからなあ。
たしかに人災とも言えるけど。
0416デフォルトの名無しさん垢版2021/12/29(水) 04:51:32.06ID:Uqmbe8qT
シンボリックリンクで新しいバージョンのプログラムにリンク先切り替える方式にしておけば被害は防げたかも知れないな
0418デフォルトの名無しさん垢版2021/12/29(水) 10:35:20.64ID:HbjA8KL2
Linux の場合プログラムは起動時に全てメモリに読み込まれるから
稼働中にプログラムを差し替えても OK って考えて実際に差し替えたら
メモリ上の古いプログラムがファイルシステム上の新しいモジュール
ファイル読もうとして動作不良になったことがあったなあ
0419デフォルトの名無しさん垢版2021/12/29(水) 10:53:37.16ID:yFPIHMKS
この挙動ってinodeが同じまま書き換えたから起こったんだよね?
inode変わるファイル更新なら起こらないよね?
0420デフォルトの名無しさん垢版2021/12/29(水) 11:28:25.09ID:DIjHY86S
>>419
更新手順が更新されるんやろなあ。
既存ファイルに直コピーが禁止になって、新規ファイルを作成後に既存名に改名とか?
0421デフォルトの名無しさん垢版2021/12/29(水) 11:33:56.17ID:EOkSZQC4
リリース手順の考慮不足以前にfindを使った削除の運用自体に問題がある
ちゃんと金払ってまともなもの作ってもらわないと

未定義の変数を含むfindコマンドが実行すると
rootディレクトリのファイルが全削除される?
0422デフォルトの名無しさん垢版2021/12/29(水) 13:13:58.03ID:KOMId+4/
findとか関係ねーよ
例えばrmで終わるコマンドがあったとして

xxxxrm / が rm / と解釈されることだってある
0423デフォルトの名無しさん垢版2021/12/29(水) 13:53:35.50ID:kCXooe0G
/LARGE0${undefined}ってこと?
0426デフォルトの名無しさん垢版2021/12/29(水) 15:31:39.64ID:V1sEjw5U
門外漢なんで純粋に知りたいんだけどこのbashの実行中の書き換えも書き換えたとこから逐次実行する仕様って歴史的経緯によるもの?もしくは
有効に活用できるケースがたくさんあるから意図して実装している?
0428デフォルトの名無しさん垢版2021/12/29(水) 17:29:01.73ID:wwN1RbRp
Linuxはホットパッチが売りなので。
0432デフォルトの名無しさん垢版2021/12/29(水) 18:01:34.74ID:o6aVS5Lj
inode云々は問題の表層でしかない
実行中のスクリプトが新しくなったからといって77TBものユーザーデータをサクッと削除しちゃえるのがおかしい
何重にもガードできているのが当たり前の案件
0435デフォルトの名無しさん垢版2021/12/29(水) 21:10:55.07ID:t8aruUm+
スパコン系の人達は運用周りのリテラシーすごく低い
シェルスクリプトしか知らない人達よりもひどいくらい
0439デフォルトの名無しさん垢版2021/12/30(木) 01:25:09.88ID:TO85sxcb
log4jで消そう
0440デフォルトの名無しさん垢版2021/12/30(木) 01:49:09.54ID:wfs2tbs7
perlのワンライナーでやるべき
0444デフォルトの名無しさん垢版2021/12/30(木) 02:25:12.29ID:IL1LVlOR
>>426
bashに限らずevalが使えるスクリプト言語はどれも似たようなもの
その方が効率がいいから

ファイルを全部メモリに読み込んでたらメモリの無駄遣い。必要になった時に読み込んで
コンパイルして中間コードをメモリに保存したほうが効率がいい

書き換えたところから実行する仕様とかじゃなくて
読み込み中にファイル内容が書き換わっただけ
0445デフォルトの名無しさん垢版2021/12/30(木) 05:20:47.81ID:jspnt6Wc
#!/bin/sh
{
# Your stuff goes here
exit
}

って書くと、全部読み込んでから実行する…らしい。
0446デフォルトの名無しさん垢版2021/12/30(木) 05:51:55.73ID:W4YtctsR
>>444
> bashに限らずevalが使えるスクリプト言語はどれも似たようなもの

知らんけどJK、PerlもRubyも違うやろ。。。
0447デフォルトの名無しさん垢版2021/12/30(木) 05:57:08.73ID:jspnt6Wc
>>446
REPL(Read-Eval-Print Loop)が使えるスクリプト言語あたりが妥当?
0448デフォルトの名無しさん垢版2021/12/30(木) 06:03:55.94ID:IL1LVlOR
>>446
検証してないけどPerlとPHPも同じらしい

それに厳密に言えばRubyでスクリプトを起動している途中で
gemsをアップデートしたらおかしくなる可能性があるやろ?
今から読み込もうとしたライブラリファイルが
中途半端に入れ替わってる可能性がある

シェルスクリプトは1ファイルの中で中途半端に
読み込まれて実行されてる可能性があるが
他のスクリプト言語は、それはないかもしれないけど
複数のファイルで構成されてる場合、中途半端に読み込まれて
実行されてる可能性がある

そしてバイナリでも動的にライブラリを読み込むようなものがあれば
同じようなことになる可能性がある
0449デフォルトの名無しさん垢版2021/12/30(木) 06:43:40.02ID:QArx8wCq
動的なのがあれば、な・・・
0450デフォルトの名無しさん垢版2021/12/30(木) 09:02:46.96ID:InFuAQoQ
こういう面倒なことになるからWindowsはアップデートの時に再起動が必要な仕様にしたんだよね
0451デフォルトの名無しさん垢版2021/12/30(木) 09:39:47.43ID:rDu++FLs
ツッコミどころが多すぎるんだよなぁ

しいて他山の石とするなら
findの結果を直で削除せず
チェックしてから削除したほうがいいってことくらいかな
0452デフォルトの名無しさん垢版2021/12/30(木) 09:58:18.91ID:uV4Ti94h
>>448
よほど特殊なケースを除いて
RubyやPythonでは同じ問題は発生しないよ
かと言って実行中に上書きはしないけどな
0453デフォルトの名無しさん垢版2021/12/30(木) 10:30:47.99ID:IL1LVlOR
>>451
突っ込みどころが多いのはお前だろ
どうやってシェルスクリプトでfindの結果をチェックして削除済んだよ
しかもそのチェックコードすら書き換わるって話だろ
何が問題になってるのかわかってない
0457デフォルトの名無しさん垢版2021/12/30(木) 12:07:43.56ID:WfZiLBBo
>>448
>それに厳密に言えばRubyでスクリプトを起動している途中で
>gemsをアップデートしたらおかしくなる可能性があるやろ?

そういう運用を前提にするなら起動途中にgemをアップデートしてもおかしくならないように作ればいい
0461デフォルトの名無しさん垢版2021/12/30(木) 13:07:53.94ID:W4YtctsR
>>450
Linuxは、実は再起動が必要なときでも、システムがそれを認知しないだけやったりするからな。。。
考えてみると、システムのsoファイルを更新しまくっても再起動不要なのはヤバいやろ。w
0462デフォルトの名無しさん垢版2021/12/30(木) 13:58:37.21ID:A3EHubzP
とりあえず手持ちの(Ubuntu20.04のデフォルト)環境だと

testと表示される
```
#!/bin/sh
echo echo test >> $0
```

testと表示される
```
#!/bin/sh
{
echo echo test >> $0
}
```

testと表示されない
```
#!/usr/bin/python3
import sys
with open(sys.argv[0], "a")as f:
f.write("print('test')")
```

/bin/sh はファイルを展開したまま参照してるけど、
/usr/bin/python3 は一度どっかにコピー(構文解析済みキャッシュ)してるから実行中の上書きが反映されない感じだと思う
0463デフォルトの名無しさん垢版2021/12/30(木) 16:24:30.20ID:W4YtctsR
>>458
いいや、閉じ括弧の後、EOFを検出する前(要はブロック実行中)に行が追加されるリスクがあるやろ。
リスクを心配したいんかしたないんか、どっちやねん?w
0464デフォルトの名無しさん垢版2021/12/30(木) 17:21:00.62ID:p57leh5q
>>453
君のところでは実行中に直接上書きするのが当たり前なの?
うちではそんなことしないから考慮する必要ないんだよね

削除に至るまでのセーフガードが他にもいくつかあるからあえて教訓を得るなら削除前のチェックかなって話
0465デフォルトの名無しさん垢版2021/12/30(木) 18:18:54.05ID:QArx8wCq
プログラム上書きで動作を変えられるというのは、ある意味脆弱性と言えるかな
権限奪われた後でしか起こせないけど
0466デフォルトの名無しさん垢版2021/12/30(木) 18:28:25.88ID:QArx8wCq
Perlとかはプログラム全部読んでから内部コードにコンパイルしてからそれを実行するので動的な部分以外は大丈夫だと思う
Perl で動的というと eval に文字列引き渡した場合と require でソース読んだ場合かな
シェルで言うと eval とドットや soure でのソース読み込み
0467デフォルトの名無しさん垢版2021/12/30(木) 22:04:38.94ID:vZc7D3zM
>>443
説明が足りないんじゃない?
単一のシェルスクリプトの場合は、更新時にinodeが変わってれば大丈夫。で終わり。

シェルスクリプトから、別のシェルスクリプトを読んでる場合は、
読み込む行でpathを評価するから、
読み込むシェルスクリプトだけが新しくなって、読み出し元シェルスクリプトが環境変数を持たない結果、同じ事象が発生する可能性はある。

だから、
installを使ったからと言って、すべてのトラブルを避けられるわけではない
と言うのであれば妥当
0469デフォルトの名無しさん垢版2021/12/31(金) 00:01:34.88ID:tL7Nlh3I
>>459
スクリプト系は実行中にロードするんだよ
該当の行まで実行しないとgemsが読み込まれない
実行前に全てのライブラリを読み込むわけではない
0470デフォルトの名無しさん垢版2021/12/31(金) 00:02:22.53ID:tL7Nlh3I
>>463
> いいや、閉じ括弧の後、EOFを検出する前(要はブロック実行中)に行が追加されるリスクがあるやろ。
{
  exit
}

閉じカッコの後が実行されるとでも思ってんの?
0472デフォルトの名無しさん垢版2021/12/31(金) 00:03:51.43ID:tL7Nlh3I
>>466
> Perlとかはプログラム全部読んでから内部コードにコンパイルしてからそれを実行するので動的な部分以外は大丈夫だと思う
PerlとPHPはシェルと同じ問題がある
調べてから書き込め
0473デフォルトの名無しさん垢版2021/12/31(金) 00:05:13.58ID:tL7Nlh3I
>>464
お前何の話してんの?

> findの結果を直で削除せず
> チェックしてから削除したほうがいいってことくらいかな

が意味不明って言ってるだけやろ
0475デフォルトの名無しさん垢版2021/12/31(金) 00:15:48.12ID:K3Q5NoN0
ティム・クックCEOとのランチには5,500円ではなく5,500万円以上必要!

Appleのティム・クックCEOとのランチをする権利のチャリティーオークションが終了しました。
結果は51,500ドル以上(約5,500万円以上)で落札されたそうです。
このオークション、落札者にはティム・クックCEOとランチができる権利とAppleイベントの
基調講演に参加できるVIPパス2枚がついてきます。
2013年は約6,200万円、2014年は約3,300万円、2015年は約2,400万円で落札されていました。
今回は約5,500万円なので高値で落札されていますね。
しかしお高いランチ代。いったい誰が落札したんでしょうか。
0477デフォルトの名無しさん垢版2021/12/31(金) 00:56:01.88ID:QVDmbS0E
>>471
installについてだけ突っ込んでるけど、
文書の本質は、inodeか変わる場合は、という意味で話してるのは理解してるか?

mvで上書きするとinode変わると信じてるけど、
installつかったすべての状況で、inode変わるかまでは分からないから、
installを例に挙げたのが悪かったのは認める。
0478デフォルトの名無しさん垢版2021/12/31(金) 01:01:12.81ID:tL7Nlh3I
だーかーらーinstall使っても
inodeは変わらないって言ってんだろ
信じてるとかじゃなくて、ちゃんと調べろ
0480デフォルトの名無しさん垢版2021/12/31(金) 01:19:12.98ID:tL7Nlh3I
>>479
これのどこにinstall以外の本質の話が書いてあるんだアホか?

441 名前:デフォルトの名無しさん[sage] 投稿日:2021/12/30(木) 02:02:44.37 ID:bPzpLvLZ [1/2]
>>425
installコマンドを使わないバカが多いからなあ
0481デフォルトの名無しさん垢版2021/12/31(金) 02:12:06.87ID:FGQbYFO9
>>469
実行中に別モジュールをロードするんであって、スクリプト自身は構文木にコンパイル済み。
>>444にはほとんど関係のない話。

シェルスクリプトには実行エラーしかないけど、Perlとかは実行前にシンタックスエラーになるのはなぜだと思うの?w
0482デフォルトの名無しさん垢版2021/12/31(金) 02:37:27.40ID:JipSLIiO
https://stackoverflow.com/questions/21096478/overwrite-executing-bash-script-files

The { forces the shell to read at least through the matching } in order to properly parse the command, and the exit then makes sure it'll never try to execute anything that gets added after that }.

BTW, I was testing this with bash version 3.2.48(1)-release (on OS X 10.8.5); other versions may behave differently...

UPDATE: Other versions do indeed behave differently. I tried the same test with version 4.3.0(1)-release (under NetBSD 6.1.4), and it continued to run the old code after the file's contents had been replaced. Apparently it now buffers the file in 8KB blocks (see this unix.se answer).
0483デフォルトの名無しさん垢版2021/12/31(金) 02:50:56.77ID:JipSLIiO
Under bash 5..0.3(1)-release on linux, it reads in 8KB blocks... but this doesn't prevent the error (in the version without the {}s), because, after the sleep is done, it seeks back to the position in the file just after the sleep! Strange behavior. {}s still protect it, good answer.
0485デフォルトの名無しさん垢版2021/12/31(金) 14:35:36.48ID:fEOKhR13
お前は { ...; exit;} での対策が無効と思ってるのか?
それともそんな面倒なこと徹底できるわけないと思ってるのか?
0486デフォルトの名無しさん垢版2021/12/31(金) 15:21:35.07ID:3oIZShwK
>ファイルを全部メモリに読み込んでたらメモリの無駄遣い
メモリの無駄遣いじゃなかったの?
0487デフォルトの名無しさん垢版2021/12/31(金) 15:44:50.78ID:tL7Nlh3I
>>484
え?どこが非現実的なんだ?
お前のキーボードでは}が打てないとかそういう話か?

{
お前のコード
exit
}
0489デフォルトの名無しさん垢版2021/12/31(金) 15:46:40.16ID:tL7Nlh3I
例えばコメントとかメモリに置いておく必要はないよな
空白もそのままメモリに保持するのはメモリの無駄遣いでしかない
0491デフォルトの名無しさん垢版2021/12/31(金) 16:59:46.95ID:fEOKhR13
bashスクリプトは実行完了するまでスクリプトファイルをcloseしないでしょ

内部形式の変換だが知らんがコピーした分だけ余計メモリに使うから >>488 以降は同意できん
0493デフォルトの名無しさん垢版2021/12/31(金) 21:34:32.21ID:tL7Nlh3I
>>491
> コピーした分だけ余計メモリに使うから
何をコピーするんだよw
まさか起動中はメモリを解放できないとか思ってるのか?
0495デフォルトの名無しさん垢版2022/01/01(土) 01:34:30.30ID:X6UBQb83
>>494
自分でわからないって言っただろ
わからないなら、自分で勉強するか
わからない所を具体的に聞け
ちゃんと教えてやるぞw
0496デフォルトの名無しさん垢版2022/01/01(土) 01:48:54.59ID:X6UBQb83
まあ俺は優しいから教えてやろうw

{ echo '#!/bin/sh'; printf '#%100s\n' {1..1000000}; echo sleep 30; echo end; } > scr.sh

これで100MBぐらいのシェルスクリプトができる
これを実行しても3MBぐらいしかメモリは食わない
内部形式は小さいからだ

これを全部メモリに蓄えておくと100MB以上消費する
最初にパースして内部形式にする方式は
後ろにバイナリとかがついている時ににエラーになるから使えない
0497デフォルトの名無しさん垢版2022/01/01(土) 02:25:58.45ID:4YArnW91
ヤバいww マジもんのアホの子だったwww
0498デフォルトの名無しさん垢版2022/01/01(土) 02:34:27.52ID:C+d3qbg4
{ echo '#!/bin/sh'; echo '{'; printf 'printf %s\n' {1..1000000}; echo sleep 30; echo '}'; } > scr.sh

「内部形式は小さいからだ」wwwww
0499デフォルトの名無しさん垢版2022/01/01(土) 02:37:31.29ID:MVIeZ8kP
echo "あけおめ $(TZ=Asia/Tokyo date +%Y)"
0500デフォルトの名無しさん垢版2022/01/01(土) 03:08:50.88ID:IS6zNVE1
今回のケースって世代バックアップとかやってたとしても
それを掴んでたバックアップスクリプト自体が上書きされて暴走して余計なファイルまで全消ししたわけだよね
>実行中のスクリプトが存在している状態でスクリプトの上書きによりリリースしてしまった
問題はここだけだと思うんだけど
酷く杜撰な運用に見える
*nix使いってこの程度のITリテラシーしかないんだね
気持ち悪い
0501デフォルトの名無しさん垢版2022/01/01(土) 04:56:33.89ID:eqRzM57+
>>500
本気でやったら、金も時間もかなりかかりそうやからなあ。
やらかしでしかないんでいいわけのしようもないんやろけど、そこはあんまり重視してなかったんやろ。
0503デフォルトの名無しさん垢版2022/01/01(土) 09:27:14.46ID:xOGFhMUK
>>501
実行中なら中断するか終了を待ってから新しいのをリリースすればいいだけだろ
日次バッチを中断したり終了を待つのに金も時間もかなりかかるのかい?

他にも例えば権限管理をまともにしてれば防げたよね?
0504デフォルトの名無しさん垢版2022/01/01(土) 10:19:02.42ID:EsvsX5UV
>>500
バックアップ容量が多いと、書き込み先の書き込み速度以上のスピードはでないから、
複数世代バックアップするにも、ずっーとバックアップというかコピーというかの処理をし続けることになる。
月次フルバックアップ処理中に、次の増分バックアップ処理が始まるのはテープの場合はよくある。

今回は復元不能と言っていることから過去のバックアップも消えてそうでD2Dっぽいけど、
そういう設計なら基本的にスクリプトは止められないから、
止まったときに更新するんじゃなく、
別のスクリプトをリリースして、古いスクリプトを退役させるような方式を選ぶと思う。

毎日すぐに処理が終わるようなスクリプトしか目にしてないエンジニアが、
そんな設計とは知らず、そのまま更新しちゃったとかそんな理由なんじゃないかなあ?
0505デフォルトの名無しさん垢版2022/01/01(土) 11:10:41.01ID:eqRzM57+
>>503
そんなのなら本気やないな。w
テラバイトレベルのバックアップをしっかり実装すんのはなかなかやと思うが。
「日次」でいけるかどうかもあやしいやろ。

クリティカルなシステムでもなし、ただ甘く見てた、てところやろうとは思うが。
0506デフォルトの名無しさん垢版2022/01/01(土) 11:53:24.53ID:vr0aJE4l
>>505
長時間かかる処理は普通suspend/resumeできるようにするよね?
自作しなくても市販のソフト買ってもいいし

日次で終わるかどうかは障害とは関係ないが
ミラーリングなのに日次で終わらないようなら作りが悪いよ

それにバックアップスクリプトに削除を混ぜるのがそもそも間違い
ジョブの単位や依存関係の管理が杜撰
0508デフォルトの名無しさん垢版2022/01/01(土) 15:00:36.73ID:w7Saqf4k
>>506
世代バックアップするなら旧世代のバックアップを削除すべきだろうし、
スクリプトで作った一時ファイルは、そのスクリプトで消すべきだと思う。

やはりスクリプトの更新方法の不備かと。
0512デフォルトの名無しさん垢版2022/01/01(土) 16:05:12.10ID:5XWhCSq7
>>472
動的な部分以外で?
0513デフォルトの名無しさん垢版2022/01/01(土) 20:11:57.76ID:VJKo4de7
>>475
俺、ティム・クックと0円でランチを一緒にしたことあるぞ。
例の宇宙船にほど近いレストランのカウンター席でメシを食ってたら隣に誰か座ってきた。
その人は電話をしまくってて、落ち着かねー奴だなーと思って顔をよく見たら... !!!
0514デフォルトの名無しさん垢版2022/01/01(土) 21:57:57.81ID:eqRzM57+
>>509
> OSはLinuxやで
それはカーネルやろ。

> Cray用のソフトも普通に売ってるで
どこの店でどんなふうに?
いわゆる「市販」とちゃうやろ。
0515デフォルトの名無しさん垢版2022/01/01(土) 22:33:56.61ID:OowWZOH4
>>498
それ内部形式じゃないぞ?
100MBのシェルスクリプトのソースコードを生成してるだけ
100MBのシェルスクリプトを実行してもわずかのメモリしか消費しない

内部形式は小さいからだ!


やっぱアホの子はお前の方?w
0516デフォルトの名無しさん垢版2022/01/01(土) 23:26:19.57ID:2clFsvDI
>>514
off-the-shelf softwareの日本語訳だよ

そこら辺の電気屋さんとかで買えるという意味の市販とは確かに違うが
市販ソフトって言葉は文脈によってもう少し広い意味になるよ
勉強になった?
0521デフォルトの名無しさん垢版2022/01/02(日) 10:42:41.52ID:8JZTRTCW
>>508
処理をどので分割すべきか理解してない典型例
cronのような原始的なのしか使ったことないでしょ
*nix系あるある
0522デフォルトの名無しさん垢版2022/01/02(日) 12:46:42.90ID:krHLUjqu
>>519
それで動作保証まですんのはなかなかのチャレンジャーやと思うが。w
そんなことより、どこで売ってんの?
0524デフォルトの名無しさん垢版2022/01/02(日) 12:53:06.50ID:o9R7ffl7
>>472
LinuxでPerlで実験してみたが同じ問題は出なかったぞ。
$0 のファイルにプログラムを追加書き込みしてもその部分は実行されない。
シェルで同様に$0に追加書き込みしたらその部分は実行された。
0526デフォルトの名無しさん垢版2022/01/02(日) 14:56:13.51ID:o9R7ffl7
だよなあ。eval や動的にソース読んで実行する個所以外は問題ないよなあ。
0528デフォルトの名無しさん垢版2022/01/02(日) 16:05:33.33ID:rJLs0hO4
>>522
だからLinux用アプリを探せよ
それともお前、オーダーメイドはどこで市販されてるの?って聞いてるのか?
0530デフォルトの名無しさん垢版2022/01/02(日) 17:21:21.53ID:TQn3/Mee
inodeを同じにして実験してみろ。
0531デフォルトの名無しさん垢版2022/01/02(日) 18:18:29.48ID:krHLUjqu
>>528
>>506

ちなみに、ワイかてLinux用ソフトウェアを「購入」したことはあるが、「市販」やなかった。
試用版を借りてから代理店経由やったかな。

「市販」ていうからには、コンシューマ用アプリとしてどっかで売ってるんやろうから、どこでやと聞いとるんや。
0532デフォルトの名無しさん垢版2022/01/02(日) 18:23:43.20ID:krHLUjqu
>>526
evalも、ふつうは問題ないな。
ブロックなら解析済みやし、文字列でも内部でリテラル化済みやし。

Perlで唯一可能性があるとしたら、BEGINブロックか?
0534デフォルトの名無しさん垢版2022/01/02(日) 18:46:21.78ID:TQn3/Mee
通販か、楽天か。
0537デフォルトの名無しさん垢版2022/01/02(日) 21:51:30.45ID:TQn3/Mee
GPGPU対応ソフトウェアはMacが一番多いそうだけどね。
意外だよね。
0540デフォルトの名無しさん垢版2022/01/03(月) 00:01:22.65ID:3eYYTX8d
ノード数で値段が変わるソフトはスパコンを念頭に置いてるんだな。
0541デフォルトの名無しさん垢版2022/01/03(月) 02:53:21.64ID:NkK7sfLH
>>532
ファイルやソケットや標準入力から読んで作った文字列を eval に渡すなんてのがあったらダメかも知れないが、
これはもうプログラムの作りが悪いと言えるな。SQLインジェクションと同じだし。

require でソース読むやつは事前にチェックされてないのではないかな?
use でのモジュール読み込みはコンパイルされるが。
0546デフォルトの名無しさん垢版2022/01/03(月) 04:04:54.39ID:cOflznJy
正直、何となくまずいとは感じる程度のものだったけど解像度が上がって良かったと思ってる
単純なファイル操作だけど対象が巨大で時間がかかるってのは中々お目にかからない
0549デフォルトの名無しさん垢版2022/01/03(月) 12:52:48.32ID:AKaSmxyk
>>541
> require でソース読むやつは事前にチェックされてないのではないかな?

だからなに?
自分で書いてるやん。w

> これはもうプログラムの作りが悪いと言えるな。SQLインジェクションと同じだし。

ただし、実行時でなくロード時に読みきることは変わらないので、結局、シェルスクリプトほどのリスクはない。
0551デフォルトの名無しさん垢版2022/01/03(月) 19:01:29.66ID:mfU61qLK
シェルスクリプトのリスクは高い
なぜなら普通やるだろ?
起動中にプログラム書き換え
な?
0553デフォルトの名無しさん垢版2022/01/03(月) 23:42:21.51ID:Sz4S1PaG
結局シェルスクリプトが原因じゃなく
シェルスクリプト使いの低スキルが原因だった
0554デフォルトの名無しさん垢版2022/01/04(火) 00:46:56.04ID:GepGyN7D
自己書き換えシェルスクリプトは、昔に見た記憶があるな。
動作がちゃんとわかってれば、有用な機能として使えるんだろ。
0555デフォルトの名無しさん垢版2022/01/04(火) 04:39:07.32ID:mpSUdZEa
例えばWindowsのログオンスクリプトとかに使われるバッチファイルもアトミックな更新が必要になるね
そういう場合はログインする可能性のない夜間とかを狙って更新したりする
スパコンのアホは、よりによってバックアップ中にバックアップのスクリプトを更新しようとした
上の例で言えば一番ログインが試行される始業時間帯とかを狙ってわざわざ更新するようなもの
どれだけ愚かな行為か想像できよう
0556デフォルトの名無しさん垢版2022/01/04(火) 05:34:07.92ID:A3JfSOSv
OSやファイルシステムによっては出来ないかも知れないが、プログラム動作中に新バージョンへの入れ替えを
行っても動作しているプロセスはそのまま動かし続けて影響させず、次回起動時から新しい方が動く方式にして
おけば良かった。例えば Linux や UNIX 系 OS ならシンボリックリンクの指す先を変えることでこれは可能だ。
Windowsではどうやるか知らないがシンボリックリンクはあるようなので多分出来るんじゃないだろうか。
0557デフォルトの名無しさん垢版2022/01/04(火) 06:04:36.10ID:mpSUdZEa
>>556
Windowsだとリンクを一旦削除してから張り直す事になるから無理だろうね
リンク先が一旦消えるから、掴んでたバッチファイルは読み込みが途切れるか、
そもそも誰かが掴んでる状態ではリンクの削除に失敗するかどっちか
0558デフォルトの名無しさん垢版2022/01/04(火) 09:11:02.07ID:KoJ0HNB1
OSとしてはプログラムを実行中に入れ替え可能だとしても
アプリがそのように作られてない可能性はなくならない
0559デフォルトの名無しさん垢版2022/01/04(火) 11:24:49.85ID:K01QBlyF
実行中に上書き更新しないのは当たり前

undefinedになった場合でも全データを削除しないように作るのも当たり前

どちらも当たり前だと思ってないやつが多数いるのがシェルスクリプト特有の問題
0561デフォルトの名無しさん垢版2022/01/04(火) 14:35:05.73ID:5xHtBJHw
コマンドプロンプトとかいうゴミみたいなシェルは実行中にメモ帳から普通に上書き保存できるしbashみたいな更新問題がある

構文解析が闇鍋状態だからまともに(...&exit)でガードする気も起きん
0562デフォルトの名無しさん垢版2022/01/04(火) 14:40:41.27ID:5xHtBJHw
全スクリプトを{ ...;exit;}というとヤバいように見えるけど

... #オプション解析とか
main(){ ...;}
{ main "$@"; exit;}

とでもすれば多くの更新事故は防げると思う
0575デフォルトの名無しさん垢版2022/01/05(水) 06:55:29.27ID:gXRPzTKb
{ } を使ってるってことは、最後の}まで読まないと実行しないんだから問題なし
{ } の中でsoruce使っていれば } を読み込んだあとでsourceが実行される
soruceで読み込むファイルでも同じように { } を使えば全部読み込まれた後に実行されるから問題なし
0580デフォルトの名無しさん垢版2022/01/05(水) 11:30:55.99ID:rp3p3Ei2
低脳は自分が低脳だと気付かないから始末が悪い
テストして確認しましたと言ってもその内容も方法も間違ってる
基本的に日本語が通じない
0582デフォルトの名無しさん垢版2022/01/05(水) 13:12:18.88ID:ga42ykuy
こんな不確かな情報に頼ってまでやることじゃないと思うのだが
普通にスクリプト側に更新機能でも追加した方が確実だし
0585デフォルトの名無しさん垢版2022/01/05(水) 21:24:39.70ID:gXRPzTKb
{}が安全だとわからないアホは
}を読まないと文法が確定しないからって
理屈がわからないんだろうな
0593デフォルトの名無しさん垢版2022/01/10(月) 00:22:34.19ID:MINWORCd
スレ立てるまでもない質問はここで 158匹目
https://mevius.5ch.net/test/read.cgi/tech/1635193843/538

ここに、YouTube で有名な、雑食系エンジニア・KENTA のサロンの、
Ruby on Rails 初心者用コースの内容を書いておいた

基本的に、Rails以外のフレームワークは、シェアが少ないのでおすすめしない。
学習環境も揃わないので、無理

Railsでは、Railsチュートリアル・Railsガイド・
黒田努の3冊の本・パーフェクト Ruby on Rails・Ruby on Rails 6 エンジニア養成読本とか、
Rubyでは、改訂2版 パーフェクトRuby・改訂2版 Ruby逆引きハンドブックなどの教科書が揃っている

これほど、良い教科書が揃っているフレームワークはない!

Laravel のシェアは少しあるけど、KENTAがPHP は一生やる必要がないと言ったので、
PHP自体がオワコンになってしまったw

日本のウェブ開発の将来は、ほぼKENTAが決めている。
Scala を滅ぼしたのも、KENTA
0600デフォルトの名無しさん垢版2022/02/03(木) 14:44:47.61ID:PlIeOUah
質問スレなかったのでここで質問させてください。
フォルダ以下の全てのファイル内の特定の文字列からn行ずれた文字列を置換したいんですが、どういうコマンドを打ったら良いでしょうか?

具体的にやりたいこととしては、Unityのprefabファイルやsceneファイル(テキストファイル)に張り付いている特定のコンポーネントの名前を一括で置換したいです。
ファイルの構造は↓こんな感じになっていて、guidがc5b2e3eb25e32904fa18c5ae09b782d9の行の1行下のm_nameを書き換えたいんですが、コマンドがうまく動きません
https://github.com/Unity-Technologies/FPSSample/blob/master/Assets/Prefabs/Cameras/ServerCameraSpot.prefab#L51

作りかけのコマンド
git grep -n c5b2e3eb25e32904fa18c5ae09b782d9-- '*.prefab' | cut -f 1,2 -d ":" | awk -F ":" '{print $1 ":"($2 + 1)}' | sed -n $2p

適当にsedでm_nameを置換指定してしまうと、guidがc5b2e3eb25e32904fa18c5ae09b782d9以外のものまで置換してしまうので、
最初のgit grepでファイル名と行番号他を取得し、次のcutでファイル名と行番号だけにして、awkで行番号+1して、ファイル名と+1した行番号を元に、
ファイル名と行番号を指定したsed -eをしたいんですがprintしたものがうまく最後のsedに渡ってきません
0601デフォルトの名無しさん垢版2022/02/03(木) 16:11:17.44ID:709dXRKt
>>600
Sedでも特定行の次行の処理とかできるで?

これはダメやろうが、こんな感じでがんばったらいけるんちゃうの。
sed -q '/guid/{p;n;s/m_name:/.../p;b}p'
0602デフォルトの名無しさん垢版2022/02/03(木) 16:30:52.62ID:vAyV6XNb
処理時間気にしないなら

|while IFS=: name line etc; do sed -e "$((line+1)) s///" $name; done

とかで良くない?
0605デフォルトの名無しさん垢版2022/02/04(金) 00:19:45.01ID:ZnGIs6if
>>600
perl 使ってこんな風にするとか。

perl -pe 'if($f){s/m_Name:/置換したい文字列/}$f=/guid: c5b2e3eb25e32904fa18c5ae09b782d9/' 読むファイル >書くファイル

少なくとも一つ前の行の状態を今読んだ行の処理をする時に分かっていないとできない。
読む方法を行単位にしないのであればその限りではないが。
0607デフォルトの名無しさん垢版2022/02/04(金) 00:45:37.37ID:ZnGIs6if
もう一つ awk, sed, xargs の組み合わせでやるやつを考えたが書き込もうとするとエラーになって書けない。
要約を書くと

grep で行番号付きで出力 | awk でコロン区切りで読んで $1 をカンマ区切りで連結した文字列を作った後でその後ろに "s/m_Name:/xxxxx/" の文字列を付けて出力 | xargs で入力はsedスクリプトになるようにしてsedが読むファイルは最初にgrepで指定したファイルと同じにする。
0610デフォルトの名無しさん垢版2022/02/04(金) 01:03:24.21ID:r4soLYsS
そんなこといったら
pythonだってシェル使ってワンライナーやろうと思えばできるじゃん
0612デフォルトの名無しさん垢版2022/02/04(金) 01:25:44.27ID:53s+UEIz
>>600
なにをどう変えたいのか知らん(読むの面倒)けどこうすればいいだけ
自分でパズル(ワンライナー)問題を作ろうとするな

cat prefab | awk '
/guid: c5b2e3eb25e32904fa18c5ae09b782d9/ {
print
getline
print $0 "new"
next
}
{ print }
'
0614デフォルトの名無しさん垢版2022/02/04(金) 02:08:49.30ID:CBYs6kse
awk -v "var=`grep -A 1 'guid: c5b' source.prefab | sed -n '2p'`" '{ sub(var, "hello, world!"); print }' source.prefab > after.prefab
0615デフォルトの名無しさん垢版2022/02/04(金) 05:17:13.50ID:QBYNvY3/
>>612
なんかものすごくイキってるみたいだけど
まともに動くコード書いてからにしてねw
0621デフォルトの名無しさん垢版2022/02/04(金) 09:33:54.99ID:tCsz8H1O
sedやawkつかうならperlつかうな
シェルスクリプトなんだから、判定等はそちらに任せて
あくまで置換等の処理限定で
0623デフォルトの名無しさん垢版2022/02/04(金) 09:56:25.32ID:mTUPlCRU
>>600
sedの-zオプション使って複数行まとめて置換すれば?

sed -Ez 's/(guid: c5b2e3eb25e32904fa18c5ae09b782d9[^¥n]*¥n m_Name: )¥n/¥1FOOBAR!!¥n/g' ServerCameraSpot.prefab
0624デフォルトの名無しさん垢版2022/02/04(金) 09:57:49.27ID:tCsz8H1O
柔軟性のないsedや、ハードル高めのawkよりいいべ
シェルスクリプトができる環境ならだいたいperlは入ってるし
0625デフォルトの名無しさん垢版2022/02/04(金) 10:32:37.85ID:bISwOsTB
条件の行と処理したい行が分かれてる時点で単純なフィルタじゃ無理だからでしょ

awkなりperlなりで状態遷移は必須

むしろsedでできるなら教えてほしい
0627デフォルトの名無しさん垢版2022/02/04(金) 11:10:04.73ID:+I1ORxpE
たくさんのレスありがとうございます、試してみます
0628デフォルトの名無しさん垢版2022/02/04(金) 11:26:16.31ID:NXJAfnlz
あっさりワンライナーで書かれたもんだから激おこですな
0633デフォルトの名無しさん垢版2022/02/04(金) 12:54:29.42ID:mTUPlCRU
ワンショットならsedで十分なのかもしれないけど
同じタスクがまた発生しそうならunity yaml用のツール作っておくほうがいいと思う

from unityparser import UnityDocument

doc = UnityDocument.load_yaml(‘ServerCameraSpot.prefab’)
entry = doc.get(class_name='MonoBehaviour', attributes=('m_Script',))
for k, v in entry.m_Script.items():
 if k == 'guid' and v == 'c5b2e3eb25e32904fa18c5ae09b782d9':
  entry.m_Name = "FOOBAR!!!"

doc.dump_yaml()
0634デフォルトの名無しさん垢版2022/02/04(金) 12:58:11.93ID:NMPx/TbP
>>612
そんなのただのawkのベタ書きじゃねーか
ベタ餓鬼するなら断然perlのほうがいいよね

cat ServerCameraSpot.prefab | perl -ne '
if (/guid: c5b2e3eb25e32904fa18c5ae09b782d9/) {
chomp($a=<>);
print "$_$a new\n";
} else {
print
}'

perl最強!
0637デフォルトの名無しさん垢版2022/02/04(金) 13:51:48.01ID:mKMsSnzj
Ruby のyaml を使ったら、最初のPrefab 部分しか取れなかった。
行頭に、--- があって、複数の文書として扱われるからかな?

require 'yaml'

data = YAML.load_file( "ServerCameraSpot.prefab" )
p data

出力
{"Prefab"=>{"m_ObjectHideFlags"=>1,
"serializedVersion"=>2,
続く
0639637垢版2022/02/04(金) 14:34:10.41ID:mKMsSnzj
Ruby のyaml で、load_stream で複数文書を読めるらしいが、
14行目の、--- !u!1 &1459795647327810 で、エラーになる

found undefined tag handle while parsing a node at line 14 column 5 (Psych::SyntaxError)

require 'yaml'

File.open "ServerCameraSpot.prefab" do |io|
p docs = YAML.load_stream( io )
end
0640デフォルトの名無しさん垢版2022/02/04(金) 14:43:47.14ID:u7GqER63
>>638
5ch仕様なのか連続複数スペースは一つにまとめられるみたいね
m_Name: ) の前のスペースが一つになっちゃってる
0641637垢版2022/02/04(金) 17:49:45.92ID:mKMsSnzj
Unity は、UnityYAML と呼ばれる、独自に最適化された、YAML ライブラリを使用します。
UnityYAML ライブラリは、完全な YAML 仕様をサポートしません

--- で始まる行を、--- に置換すると、Ruby のYAMLでも動いた

require 'yaml'

# 行末の改行を削除して、1行ずつ処理する。accum は蓄積変数
input_yaml = File.foreach( "ServerCameraSpot.prefab", chomp: true ).with_object( String.new( ) ) do |line, accum|
line = "---" if line.start_with?( "---" )
accum.concat( line, "\n" )
end

docs = YAML.load_stream( input_yaml ) # 複数文書
p docs.dig( 1, "GameObject", "m_Name" ) #=> "ServerCameraSpot"
0642637垢版2022/02/05(土) 12:59:45.97ID:Wxa6LWM/
>>641
の最後の行を、コメントにして、
# p docs.dig( 1, "GameObject", "m_Name" ) #=> "ServerCameraSpot"

その後ろに、下の2行を付け加えると、内容を変更して出力できる。
docs[ 3 ][ "MonoBehaviour" ][ "m_Name" ] = "あいう" # 変更
puts YAML.dump_stream( *docs ) # 複数文書

ただし最初の、% で始まる、2行のディレクティブが出力されない。
それと、複数文書の区切りが、--- となる

--- !u!1001 &100100000
みたいな、Unity の型を、Ruby では解釈できない

UnityのYAMLは正規形じゃないから、普通のパーサーで解釈するのは、骨が折れる
0643デフォルトの名無しさん垢版2022/03/01(火) 06:59:09.07ID:/KEw0dOm
timeコマンドみたいな感じで、あるプロセスとその子プロセスが読み書きした
ファイルのデータ量を簡単に調べる方法ないですかね?

Linux板に書き込めなかったのでここで
0644デフォルトの名無しさん垢版2022/03/01(火) 07:24:58.47ID:2BqTSfQO
俺が知らないだけかもしれんが、コマンドとしてはないんじゃないかな?
mmapのメモリコピーによる書き出しの捕捉はカーネル空間じゃないと無理だろうし
比較的簡易的なのはstraceだけど、mmapのは漏らす
面倒なのでstapとか思いつく
0648デフォルトの名無しさん垢版2022/03/01(火) 21:55:02.49ID:84NGcGuL
「linux メモリ使用量 プロセス 監視」などで、検索すれば?

Zabbix などに、そういう項目は無いのか?
0656デフォルトの名無しさん垢版2022/03/26(土) 04:10:35.39ID:fJwm7Jgq
一時期は数ヶ月で1スレ消火するぐらいの勢いがあったのに。つわものどもが夢の跡
0658デフォルトの名無しさん垢版2022/03/29(火) 09:16:04.55ID:3XcWZYBt
見てきたけど酷いな。よくシェルショッカーなんて相手にするよ
リッチー大佐も冷静を装ってるが完全に脅迫になってるのわかってないのかな
0660デフォルトの名無しさん垢版2022/04/05(火) 15:31:19.76ID:0XOZrJsf
昔は、マクロでCを他の言語っぽく書けるようにする、つー流派?があったからなあ。w
begin/endを定義してPascalっぽくとか。
0663デフォルトの名無しさん垢版2022/04/06(水) 16:06:26.14ID:S7CGIPqQ
doが対称性を崩してるよな
キーワード …; do

done

FOR-ROF
LOOP-POOL
WHILE-ELIHW
美しい対称性
0664デフォルトの名無しさん垢版2022/04/07(木) 16:39:39.21ID:pi20fczf
xargs コマンドの -P オプションに、3時間ぐらい前に気付いた。
0665デフォルトの名無しさん垢版2022/04/11(月) 13:29:24.85ID:KjtEvxV7
>>659
#define POOL }
これやったことあるわ…
cの式とbrainf**kの命令は一対一対応してるので、main()内にそのまま展開すればbfトランスパイラになる
これそのままで動く

https://en.m.wikipedia.org/wiki/Brainfuck

brainfuck command C equivalent
(Program Start) char array[30000] = {0}; char *ptr = array;
> ++ptr;
< --ptr;
+ ++*ptr;
- --*ptr;
. putchar(*ptr);
, *ptr = getchar();
[ while (*ptr) {
] }

大体合法なCトークンじゃないので、一度BRAに置き換えてsedで置換する必要はあったけど
0666デフォルトの名無しさん垢版2022/04/15(金) 15:18:31.03ID:LoHMCFtw
bashの
[[ -a ${TMP_FILE} ]] && rm -f ${TMP_FILE}
って-aとか[[ ]] &&とかそれぞれどういう意味なの?
TMP_FILEがあったら消すってことなんだろうけど
0667デフォルトの名無しさん垢版2022/04/15(金) 16:01:54.46ID:hbtBlxLh
-aはファイルが存在すれば真になるという古い書き方
ANDの意味の-aと間違いやすいから-eを使え
&&は普通にANDだろ
0668デフォルトの名無しさん垢版2022/04/15(金) 16:05:53.77ID:LoHMCFtw
>>667
古い書き方なのねandの-aと紛らわしいな
0670デフォルトの名無しさん垢版2022/04/16(土) 09:12:23.33ID:AbnHWb9H
短絡評価。真、偽の順で表示される

and の場合は、左辺が偽なら、右辺を評価せずに、偽が確定する。
or の場合は、左辺が真なら、右辺を評価せずに、真が確定する

[ a = a ] && echo 真
[ a = b ] && echo 表示されない

[ a = a ] || echo 表示されない
[ a = b ] || echo 偽
0671デフォルトの名無しさん垢版2022/04/18(月) 16:18:56.11ID:GGXXVNot
bashは構文を拡張しすぎたせいで、変なのを書くやつが増産されてしまった。
0672デフォルトの名無しさん垢版2022/04/18(月) 16:20:19.34ID:GGXXVNot
>>668
[]がコマンドであることを認識した方がいい
0674デフォルトの名無しさん垢版2022/04/18(月) 18:56:00.27ID:IfcMEIPj
>>672
testコマンドってこと?
0675デフォルトの名無しさん垢版2022/04/20(水) 11:54:29.01ID:e4Ywa9g+
昔は [ が test にシンボリックリンクされていたものぢゃ
0676デフォルトの名無しさん垢版2022/04/20(水) 17:00:20.67ID:SrakFfBy
ファイルの先頭と末尾だけを表示させたくて
$ (head;tail) < tmp
みたいなことをしててふとハマったんだけど、
$ for i in {00..60};do echo "22-04-20 00:$i"; done > tmp
$ (head;tail) < <(grep 22-04-20 tmp)
だと head 分しか表示されなかった

多分シグナルとかの関係だろう、と思ってるんだけどイケてる回避策ってあるかな?
まあなければ愚直にファイルに書き出すだけなんだけども
0677デフォルトの名無しさん垢版2022/04/20(水) 17:17:12.72ID:65nfU3ze
たぶんheadが複数行まとめて読み込んで行数とか判断してるんだと思う

回避策はないかな
stdinから読み込む挙動を変えるオプションも無さそうだし
0679デフォルトの名無しさん垢版2022/04/21(木) 12:40:10.24ID:yp5x7VDG
せやったら全部Sedだけでええやろ!w

と思ったけど、なるほど、むつかしいんやな。。。
末尾複数行を簡単につまめないんやった。
$(($(wc ...)-N))を埋め込んだらできるけど、それもなー。
0680デフォルトの名無しさん垢版2022/04/21(木) 12:49:57.95ID:zIIL/8l3
どうでもいいけど22-04-20 00:60ってなによ
0682デフォルトの名無しさん垢版2022/04/21(木) 14:22:25.48ID:zIIL/8l3
年月日ではなく時分のところ
0684デフォルトの名無しさん垢版2022/04/21(木) 21:22:45.77ID:+ZjRtsOn
readでcsvのヘッダを読んで、本体だけが次のパイプに渡って処理され、最後にcatで再結合する技は見たことある

つまり、head じゃなくて10行readならいけるんでないか?
0686684垢版2022/04/21(木) 22:14:40.59ID:+ZjRtsOn
>>685
検索力に惚れるわ

俺は過去ログ取得に不快な広告見せられたのでコピペっておく
231 名無しさん@お腹いっぱい。 sage 2017/06/14(水) 11:09:43.34 .net
head -1 じゃなくて read を使ってこんな事をしてたり
df -h | { read h; echo "$h"; sort -k5,5gr; }

そうそうこんなん書いてたわ、例の通りdf -hやtsv/csvのヘッダ一時退避に重宝するイディオム

しかし-nは覚えてるけど行数オプションとかあったかな?
whileで包んで10回数えるのも多分行けるとは思うが、まあ最悪
read line; read line;…
なら通るでしょう()
0689デフォルトの名無しさん垢版2022/04/22(金) 01:40:46.85ID:p9VEf+/q
lsの日時の書式をyyyy/mm/dd hh:mm:ss固定にしたいのですがどっかに設定あるんでしょうか
0690デフォルトの名無しさん垢版2022/04/22(金) 02:32:55.95ID:SxzvmxoM
>>688
これ動くような気もするけど、エッジケースの詰め合わせみたいで関心するわ…ぜひ明日試したい

teeはプロセス置換への分配を均等に進めるのか?
head/tail でなければ入力も出力も数ブロックのバッファ単位で入り交じるはずだけど、バッファ単位に収まる10行のhead/tailの出力は一塊で吐かれるはず、つまりhead→tail/tail->headのいずれか
先頭だけ舐めるheadの方がtailより先に処理を終えるからhead->tail、の出力になるのだろうか?
0691デフォルトの名無しさん垢版2022/04/22(金) 02:54:12.16ID:AtJxm6z2
tee, head, tailの実装とバッファリングモード、入力データの素性の全てに依存してそうなヤバさ
0692デフォルトの名無しさん垢版2022/04/22(金) 03:06:07.22ID:xNmupzsw
とりあえず手元のandroidとかいう玩具で

GNU bash, version 5.1.8(1)-release (aarch64-unknown-linux-android)

$ seq 100 | tee >(head) >(tail) >/dev/null
91
92
93
94
95
96
97
98
99
100
1
2
3
4
5
6
7
8
9
10
0695デフォルトの名無しさん垢版2022/04/22(金) 03:34:30.65ID:SxzvmxoM
入力が小さいときに限っては、teeも実質引数に一回渡したきりだからheadの速さも関係ないんだろうね
seqの引数を二分していけば均衡して、結果はランダムになりそう
0696デフォルトの名無しさん垢版2022/04/22(金) 05:38:09.18ID:rkPZZrpS
awk -v N=10 '{ if (NR <= N) print $0; buf[NR % N] = $0 } END { for (i = (NR - N + 1 > N + 1 ? NR - N + 1 : N + 1); i <= NR; i++) print buf[i % N] }'
0697デフォルトの名無しさん垢版2022/04/22(金) 09:43:04.69ID:9We3r0d8
つまりさ、複数のコマンドを使って
効率的に処理する方法はないってことでしょ?
>>696みたいにするしかない
0699デフォルトの名無しさん垢版2022/04/22(金) 11:52:54.17ID:IqSZbuIe
>>689
ls −l −−time−style=+'%Y/%m/%d %H:%M:%S'
をaliasにでも登録しておく
0700デフォルトの名無しさん垢版2022/04/22(金) 12:15:37.42ID:IW9biBQV
>>697
そもそもgrepが律速なんだから効率とか野暮だけど、あえて言うなら

元のファイルがダンプしてしまえるならストレージは食うが終端にシークしてしまうのが最速だし、ストリーム処理なら初めの10行プリントする自明な処理の後、10行のバッファを保持して終端が見えるまでひたすら読みまくるしかアルゴリズムはないわけで

それはsed N;N;...でもなんでもいいが、timeするまでもなく10行保持して読み捨て専用マシーンとしてガリガリチューンされてるtailを使うのが最速に決まっとるがな
0701デフォルトの名無しさん垢版2022/04/22(金) 12:22:41.13ID:IW9biBQV
変な流れになってるのは>>688という爆弾に完全に食われてしまったからな…
俺にも挙動が予測不能過ぎて興味が尽きない
0702デフォルトの名無しさん垢版2022/04/22(金) 12:37:37.28ID:QL3esWpR
>>695
seq 10001 | tee >(tail -10000) >(head -10000) >/dev/null
を実行しても、headが前半、tailが後半と期待どおりに出力されるんで、問題ないんちゃう?
headは頭から行単位に出力、tailは終端に達してから出力、やと思うとそれでいい気もするし。

>>692は知らん!w
0703デフォルトの名無しさん垢版2022/04/22(金) 12:45:37.78ID:SxzvmxoM
並スペックのx86-64Debian/bash5/coreutils環境で問題のを検証

>>692
うちではseq 100だとheadが勝った、なおheadとtailを交換しても同じ

10000(適当)でも大体同じ結果が出る、そもそも再現性あるの?と思って十回くらい再実行してたら
1 2 3 4 5 6 7 99991 9992 9993 9994 9995 9996 9997 9998 9999 10000 8 9 10
という入り交じるケースを発見したw
0705デフォルトの名無しさん垢版2022/04/22(金) 13:21:40.45ID:4sYij9Dr
バックグラウンドの割り込み遅延やその時点での負荷が影響するだろうから、エントロピー源に出来るな
もっとも一様乱数に近付けるにはおま環固有の定数を探す必要はあるが

マウスグリグリで乱数吐く/dev/randomと原理的には同じもの
0706デフォルトの名無しさん垢版2022/04/22(金) 13:48:09.59ID:MIuZAVWA
そもそもteeから非同期に投げたプロセスが順序良く出力することを期待するのがおかしいわけで
何のコマンドでもいいが、それを暗喩する名前のheadとtailというチョイスがツボに嵌まって面白い
というか>>688は狙ってやってるだろ

pidやマウス座標とか拾って改善目指すとかは無粋
0707デフォルトの名無しさん垢版2022/04/22(金) 14:06:12.36ID:SxzvmxoM
字面とその挙動、足すことも引くことも躊躇われる簡潔さ
完成し尽くされてるよな
今スレのベストコマンド賞にノミネートしたい
0708デフォルトの名無しさん垢版2022/04/22(金) 14:37:33.47ID:E3Z2WeTR
ユーモア部門なw
プロセス置換がposixで無いのだけが惜しいが、一番面白いワンライナーなのは間違いない
0712デフォルトの名無しさん垢版2022/04/22(金) 19:07:59.33ID:t4x32peS
もうとっくに解決してるので…
爆弾落としてった誰かが悪い

>>687でいいと思うが、あえて添削するとすれば、まずコマンド置換は不要
grep pat file | { for i in {1..10}; do read line; echo "$line"; done; tail; }

再利用したいならパラメトライズが面倒なブレース展開を避けるべき(パラメータ展開より先)
{1..10} -> $(seq $n)

もちろんwhileでカウントしてもいい、どちらの版も適当なファイルで取り敢えず動作確認済
0719デフォルトの名無しさん垢版2022/04/25(月) 23:07:17.30ID:OWEpx0GO
>>717
あのさ、シェルスクリプトをちゃんと勉強しろよ!
「入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界」という本があるんだけど、これを読めば何もかもわかるよ。
0721デフォルトの名無しさん垢版2022/04/26(火) 09:41:05.59ID:abeO/U+d
[ がコマンドで、ゆえに直後にスペースが必要
というのは初心者が見落としやすいところではある
0722デフォルトの名無しさん垢版2022/04/26(火) 12:36:05.16ID:60BzfgWB
シェルスクリプトの基礎をすっとばして
いきなりコマンドの使いこなしから始めましょう
みたいなのは害悪だと思う
シェル芸から始めるんじゃなくて、シェルスクリプトを勉強すべき
0723デフォルトの名無しさん垢版2022/04/26(火) 12:54:52.42ID:uKDaCZCW
言い出したら切りがないけどコンピューターの仕組みからやるべき
0727デフォルトの名無しさん垢版2022/04/26(火) 19:24:30.73ID:hbZUgTG0
金の採掘もやっとくか…
0729デフォルトの名無しさん垢版2022/04/26(火) 19:32:36.15ID:G+JzaZJD
まずはマニュアルくらい一通り読まんとな
俺は座り無精なのでマニュアルだけ読んでマスターした気になってる言語の方が多いくらい()
0732デフォルトの名無しさん垢版2022/04/29(金) 00:34:04.74ID:gP3ffc3T
スレ違いだと思うけどまあ一応
:autocmd BufNewFile *.sh [コマンド]

put='#! /path/to/sh'
多分dieとかgetoptとかtrap含めたテンプレを用意して日付とかファイル名とかお前の名前とか置換
r /path/to/tmpl.sh | s/__DATE__/\=strftime('%Y-%m-%d')/

未テスト
0734デフォルトの名無しさん垢版2022/06/21(火) 19:32:07.61ID:0jGPid+s
スペースを含む複数のファイル名を一括でリネームしたいんですが、上手い方法はありますか?
スペース無しならfind+sed+xargsで行けるのですが
0735デフォルトの名無しさん垢版2022/06/21(火) 20:31:37.09ID:q62JFBwI
\x20で行けたりしないかな
0736デフォルトの名無しさん垢版2022/06/21(火) 20:45:32.09ID:eKSiaONm
findのオプションでprint0とかしたらいけないんだっけ?
0737デフォルトの名無しさん垢版2022/06/21(火) 21:06:17.83ID:EjbRTWsP
>>734
そういうのsed使って加工するとだいたい壊れるw
ファイル名を置換するシェルスクリプトを作れ
あとはそれをfind -execで呼び出せばいいだけ
0739デフォルトの名無しさん垢版2022/06/22(水) 19:28:36.54ID:EcTc17L7
Ruby で作ってみた

ファイル名に含まれる全ての半角空白を、アンダーバーへ変換する。
ただし、DryRun なので実際には変更されません。
ファイル名が変更された時に、既に同名のファイルが存在する場合は、エラーとする

require 'fileutils'
require 'set'

# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く
glob_pattern = "C:/Users/Owner/Documents/test/*"
target_dir = File.dirname( glob_pattern ) # ディレクトリパスだけを取り出す

# そのディレクトリ内の全てのファイル名だけを抜き出す
old_filenames = Dir.glob( glob_pattern ).map { |full_path| File.basename( full_path ) }
old_filenames_set = Set.new( old_filenames ) # エラー処理用に、set にも入れる

# ファイル名に含まれる全ての半角空白を、アンダーバーへ変換する
new_filenames = old_filenames.map do |filename|
new_fn = filename.tr( " ", "_" )
# ファイル名が変更された時に、既に同名のファイルが存在する場合は、エラー!
if new_fn != filename
raise "ファイル名 #{ filename } が重複します!" if old_filenames_set.include?( new_fn )
end

new_fn
end

次へ続く
0740739垢版2022/06/22(水) 19:29:18.14ID:EcTc17L7
前の続き

# ファイル名を変更する
old_filenames.zip( new_filenames ) do |old_filename, new_filename|
# 変換されなかったファイルは、処理しない
next if old_filename == new_filename

old_path = target_dir + "/" + old_filename
new_path = target_dir + "/" + new_filename

FileUtils::DryRun.move( old_path, new_path)
end
0741デフォルトの名無しさん垢版2022/06/22(水) 21:31:19.80ID:r+zxbhox
スペース含みの対処はレコード区切りを'\0'にすること
(普通だったら'\n'区切り)

find ... -print0 | sed -z 's/...//' | xargs -0 ...

renameが目的なら1レコードをsedで2レコードに分割して、
xargs -0 -n2 mv で受け取ることになるんじゃない?
パイプに流れてるものを見たけりゃxxdでも使えばいい
0742デフォルトの名無しさん垢版2022/06/22(水) 23:59:58.34ID:qmaAVV4a
なんだそれ
0745デフォルトの名無しさん垢版2022/06/24(金) 22:30:30.37ID:wjFt6G0b
手元のshellで気に入らない動作でもしたのか?
誰かが書いたコードがおかしい話か?
0746デフォルトの名無しさん垢版2022/06/24(金) 23:20:53.20ID:K5vj26OZ
ループに{}も含めたいのならバグじゃないし
含めたくないならバグかもしれない
知らんがな
0748デフォルトの名無しさん垢版2022/06/25(土) 01:42:22.54ID:+sGuzAtV
波括弧って文法上意味を持つ(フォークしないグルーピング)から含まれないのは正しい挙動だろう
0753デフォルトの名無しさん垢版2022/06/25(土) 19:49:57.18ID:zmRipdPc
予約語が特殊な意味を持つのは
コマンドの最初に使ったときだけ
わからんかねぇw
0758デフォルトの名無しさん垢版2022/06/27(月) 15:46:57.73ID:CskE0rDG
外出しの関数ファイルってどんな名前にしてる?
特に拡張子
0759デフォルトの名無しさん垢版2022/06/27(月) 16:49:42.17ID:qAroFeWq
関数が書いてあってsourceで読み込むファイル?
名前は何が聞きたいのか知らんけど拡張子は
POSIX準拠で作るときは.shで、bash用なら.bashかな
0760デフォルトの名無しさん垢版2022/06/27(月) 18:23:34.81ID:CskE0rDG
>>759
そそsourceで読み込むやつ
やっぱそんな感じだよね

前に参画してたプロジェクトでは.prfだったから最初?ってなった
ちなみに変数外出しするなら?
0762デフォルトの名無しさん垢版2022/06/28(火) 01:11:34.56ID:Dv09yGDf
コマンドとしては使えないスクリプトファイル、ということで、拡張子を別にしたい気持ちはわかる。
検索しやすくなるしな。
0763デフォルトの名無しさん垢版2022/06/28(火) 05:39:12.64ID:L08FVbEp
関数しか書いてないやつはコマンドとして使えないんだから
それと同じでいいやん
0764デフォルトの名無しさん垢版2022/06/28(火) 10:28:28.56ID:ucMrCo9H
>>762
なるほどそういう考えか
0765デフォルトの名無しさん垢版2022/07/01(金) 00:50:47.17ID:oYJ8x66X
独自拡張子は嫌われる
0766デフォルトの名無しさん垢版2022/07/02(土) 11:14:35.24ID:EoiiwDBr
bashというかシェル全般について質問です

シェル内で変数定義(例えばTEST="test")して
Java(jar)プログラムを呼び出してその中で環境変数(TEST)を
取得すると値"test"が得られます
シェル内の変数とは環境変数と同義なのでしょうか?
単なるスコープの違いでしょうか?
0768デフォルトの名無しさん垢版2022/07/02(土) 15:06:57.46ID:EoiiwDBr
>>767
語弊があったかもしれませんが
シェル内で変数定義とJavaプログラムの呼び出しをしています
具体的には以下のような感じです

・sample.bash
#!/bin/bash
TEST="test" # この変数が環境変数と同義?
/usr/bin/java -jar Sample.jar
exit 0

・Sample.jar (Sample.java)
public class Sample {
 public static void main(String[] args) {
  String str = System.getenv("TEST"); // 値"test"が取得可能
  System.out.println(str);
 }
}
0769デフォルトの名無しさん垢版2022/07/02(土) 15:46:05.19ID:5r3z96xh
そのシェル以外のどこかでexportされてる可能性もなくはない
0770デフォルトの名無しさん垢版2022/07/02(土) 15:52:50.74ID:UMJkSd0D
>>768
sample.bash を起動するシェルで unset TEST してから実行してみて
docker で試したけどちゃんと null が出力されたよ
0774デフォルトの名無しさん垢版2022/07/02(土) 18:48:20.54ID:s0/GJKKm
しかし普通はそんなのが定義されていたからって
だからなんだ?っていう話なんだよな
0775デフォルトの名無しさん垢版2022/07/12(火) 23:34:22.21ID:gA1pIjpV
引数解析にgetoptsってどう思う?
0776デフォルトの名無しさん垢版2022/07/13(水) 12:19:30.78ID:EtP8dxEe
Ruby では、コマンドライン引数の処理に、OptionParser を使って、

short/long option を定義していく
0778デフォルトの名無しさん垢版2022/07/13(水) 12:47:37.07ID:C1CGdRc+
>>776が見えない
0780デフォルトの名無しさん垢版2022/07/13(水) 14:41:02.34ID:7GbSF+de
見えないというのなら見えるようにしてあげよう

ルビーでは、コマンドライン引数の処理に、おぷしょんぱーさー を使って、

short/long option を定義していく
0784デフォルトの名無しさん垢版2022/07/13(水) 18:48:04.93ID:EtP8dxEe
Ruby のoptparse なら、
ruby ./a.rb -a -b1 --foo --bar x

require 'optparse'

# ARGV.replace %w(-a -b1 --foo --bar x)

opt = OptionParser.new
p params = opt.getopts( ARGV, "ab:", "foo", "bar:" )

#=> {"a"=>true, "b"=>"1", "foo"=>true, "bar"=>"x"}
0785デフォルトの名無しさん垢版2022/07/13(水) 19:41:24.35ID:8ZGfs65M
>>780も見えなくした
0786デフォルトの名無しさん垢版2022/07/14(木) 16:46:11.67ID:mBJkiOUt
>>783
分かった
ありがとう
0789デフォルトの名無しさん垢版2022/07/21(木) 12:16:57.01ID:T68Jlsts
realpathコマンドは、Windowsだと何に相当しますか?

シンボリックリンクとか仮想ドライブ経由の実ファイルを特定する方法は、Linuxだとちゃんとあるけど、Windowsはどうしてるんだろ?
0790デフォルトの名無しさん垢版2022/07/26(火) 20:15:56.25ID:Yo0JxkCi
trapコマンドなるもの知ったので試そうと以下のシェルを実行したんだが上手く行かない
どうしてだろう

<test.sh>
#!/bin/bash
sleep 15 && echo "15 seconds have passed"
trap 'echo SIGINT' SIGINT

$ ./test.sh

15秒経つ前にVSCodeからCtrl + Cしても音沙汰無し(念のためteratermからもやってみたけど同じ)

15秒待てばechoされるのは確認済み
最後に「trap -p」を追加してみるとちゃんとSIGINTが設定されてるのが出るんだけど
0791デフォルトの名無しさん垢版2022/07/26(火) 20:23:32.74ID:Yo0JxkCi
自己解決しました
trap~の行を先頭に持って行ったら上手く行きました
0793デフォルトの名無しさん垢版2022/07/27(水) 02:31:59.58ID:8I1dQN/H
トラップ一家物語って子どもの頃は怖かった
マリア?だっけが怒られるシーンとか苦手
0795デフォルトの名無しさん垢版2022/07/28(木) 20:48:38.50ID:oYIQQ6EM
MariaDBは新規に採用されることはもうないだろうな。
0796デフォルトの名無しさん垢版2022/08/20(土) 12:16:27.18ID:/HP/Kkeq
exec cmd1 | cmd2

cmd1 | exec cmd2 ってどっちが親のプロセスになるかってだけで同じだよね
どっちのほうがいいとかってあったりする?
0798デフォルトの名無しさん垢版2022/08/20(土) 14:20:29.69ID:yCCCo4Qv
>>797
安価間違ってますよ
0799デフォルトの名無しさん垢版2022/08/20(土) 14:21:03.89ID:kiVzxibA
>>789
自動補完しろ
0800デフォルトの名無しさん垢版2022/08/20(土) 15:34:56.76ID:l3DwVL0Z
800
0802デフォルトの名無しさん垢版2022/08/22(月) 23:52:48.15ID:4DKxAEVF
bashの変数展開って可読性低いかな
0803デフォルトの名無しさん垢版2022/08/23(火) 12:11:27.31ID:ZigpqJDA
PATH=$ADD_PATH:$PATH
でPATHにすでに$ADD_PATHが含まれてない場合にだけ追加するやり方ない?ループとか回さずにいい感じにやるやり方
0805デフォルトの名無しさん垢版2022/08/23(火) 13:32:35.69ID:IsFqNvj1
こんなのもあるのか
www.rapidee.com/en/command-line
0806デフォルトの名無しさん垢版2022/08/23(火) 16:25:42.99ID:QjLy6Z4J
>>803
パスの前後に:をつけてパスの前後に必ず:が付いた状態でgrepかけるのはダメ?
if ! grep -q ":${ADD_PATH}:" <<< ":${PATH}:" ; then
PATH="${ADD_PATH}:$PATH"
export PATH
fi
0807デフォルトの名無しさん垢版2022/08/24(水) 12:04:37.37ID:mIEON09S
[[ :$PATH: != *:$ADD_PATH:* ]] && PATH="$ADD_PATH${PATH:+:$PATH}"

[ "$PATH" != "$ADD_PATH" ] && [ "$PATH$PATH$PATH" = "${PATH#$ADD_PATH:}${PATH#*:$ADD_PATH:}${PATH%:$ADD_PATH}" ] && PATH="$ADD_PATH${PATH:+:$PATH}"
0808デフォルトの名無しさん垢版2022/08/24(水) 15:25:47.26ID:pB12lFr9
てrst
0809デフォルトの名無しさん垢版2022/08/24(水) 15:29:23.30ID:pB12lFr9
ほらよ。お前ら自分でコードもかけんのか?

prepend_path() {
case ":$PATH:" in
*:"$2":*) return 0
esac
PATH="$2${PATH:+:}$PATH"
}

prepend_path "$ADD_PATH"
0811デフォルトの名無しさん垢版2022/09/30(金) 13:44:24.20ID:Yhp7EPAh
シェルが一番楽でいい
大好き
0812デフォルトの名無しさん垢版2022/09/30(金) 20:48:28.54ID:lIBPtEW1
Twitterの#シェル芸とか、うんことか変な吹き出しとか
おっさん臭キツイんだけど、あれ何が楽しくてやってるの?
0813デフォルトの名無しさん垢版2022/09/30(金) 22:18:24.47ID:6qvEDMgz
シェル芸と言えば、USP 研究所の上田隆一。
シェルスクリプトを芸にまで高めた香具師

でも、上田の本を見たら、解答がRuby などのスクリプト言語でも書いてあるw
0814813垢版2022/09/30(金) 22:22:22.63ID:6qvEDMgz
シェル芸で、ここはRuby の1 Liner を使ってとか、

シェル芸には、Rubyなどのスクリプト言語の1 Liner も含むw
0815デフォルトの名無しさん垢版2022/09/30(金) 22:38:49.73ID:6fU78nEj
> シェルスクリプトを芸にまで高めた香具師

これが間違ってる
シェル芸=シェルスクリプト芸じゃないぞ
0816デフォルトの名無しさん垢版2022/10/01(土) 00:37:08.33ID:nJiCANZy
つか、シェル芸って、シェルスクリプトの機能ってほとんど使わんやん
パイプぐらいでしょ?
0817デフォルトの名無しさん垢版2022/10/01(土) 01:49:51.63ID:WNV5xseU
何を以てシェル芸というのか
0819デフォルトの名無しさん垢版2022/10/01(土) 02:14:51.81ID:WNV5xseU
>>818
ワンライナー縛りだったのか
0820デフォルトの名無しさん垢版2022/10/01(土) 03:05:59.90ID:r/3KV4QL
>>818
上田さんが書いたページですか?
0821デフォルトの名無しさん垢版2022/10/01(土) 03:56:20.81ID:nJiCANZy
>>820
> 上田さんが書いたページですか?
本人がwikipediaに書いたのかもねw

つか、本人のブログへのリンクあるじゃん
https://b.ueda.tech/?page=01434

> シェル芸の定義バージョン1.1
> マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、
> あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。
> あるいはそのときのコマンド入力のこと。
>
> 要は
> Unix系OSのシェル上でのワンライナーのことです。勝手に名前つけてすんません。

ソースコードを残さない時点でシェルスクリプトじゃないし、
これが定義ならシェルからワンライナーで実行するならperlとかも使っていい
POSIX原理主義とは真っ向から対立してる
0822813垢版2022/10/01(土) 09:15:00.12ID:WF3iEAg3
上田は、シェル芸の定義まで作っていたのかw

まあ、しゃーない。
シェル芸を生み出したのは上田だから
0823デフォルトの名無しさん垢版2022/10/01(土) 09:52:04.30ID:vUFg+rJu
シェル芸って昔からあるワンライナーの日本語訳みたいなもんでしょ?
上田が生み出したとは言えないのでは
0824デフォルトの名無しさん垢版2022/10/01(土) 10:26:42.87ID:SMOLsqD3
なんだ?上田ってやつはワンライナーを言い換えた程度で
wikipediaのページまで作ってるのかw
0825デフォルトの名無しさん垢版2022/10/01(土) 10:44:12.58ID:a2GTR0qK
その手のワンライナーがスイスイ書けるならそれでいいがワンライナーにするために考え込むぐらいなら普通に複数行使って書いた方が早いし使い回ししやすい
0828デフォルトの名無しさん垢版2022/10/01(土) 22:13:37.09ID:WF3iEAg3
シェル芸は、雑誌で連載していた人気企画だったのに終わってしまった

今でも、勉強会などでやっているのかも
0830デフォルトの名無しさん垢版2022/10/02(日) 00:38:08.91ID:WZvawmk5
ワンライナーはともかくシェル芸やってる人って
競技プログラミングやってみるみたいなもので
現実の問題を解くというより、問題のための問題を
解くって感じだから実用的じゃないよね
0831デフォルトの名無しさん垢版2022/10/02(日) 12:49:06.04ID:nQhJJvDz
15年位前まで仕事でシェルスクリプト触ってたけど
ワンライナーの人は難読化させてたように思うね
自身しかわからないようにして仕事がなくならないようにしてた
0832デフォルトの名無しさん垢版2022/10/02(日) 13:20:01.30ID:QRKSlI6k
最近はワンライナーもpythonで書いてるわ。
0834デフォルトの名無しさん垢版2022/10/03(月) 02:57:52.90ID:bidh+76+
Pythonの文法でワンライナーって可能なのか?
ワンライナーならPerlとRubyだろうな
一行でコードを書ける
0835デフォルトの名無しさん垢版2022/10/03(月) 03:17:23.26ID:VpzdjDDF
引数で入力テキスト取れるんだからそりゃ書けるけど、インデントと改行文字埋め込みが辛い
あとperlみたいにfeature全部盛りオプションがないのでボイラープレートが割と要る
0836デフォルトの名無しさん垢版2022/10/03(月) 16:27:05.78ID:M4csbtG9
awkとか使うと一行になっちゃう
0839デフォルトの名無しさん垢版2022/10/03(月) 18:10:34.89ID:pcuzjq2H
Ruby の1 liner では、
-r で、モジュールを読み込める。require

例えば、csv を使うのなら、-rcsv とする。
だから、awk はいらない
0841デフォルトの名無しさん垢版2022/10/04(火) 03:06:20.40ID:F9I3VOct
rubyを使うとかアホらしい
そのモジュールにバグとかあったらどうするんだ?

俺が作ったcsvライブラリを使え
awkで作った
0842デフォルトの名無しさん垢版2022/10/04(火) 03:08:24.97ID:F9I3VOct
俺が作ったcsvパーサーをインストールされば
rubyをインストールしないですむ
俺が作ったcsvパーサーはGitHubでスター68個もある
0843デフォルトの名無しさん垢版2022/10/04(火) 03:10:11.52ID:F9I3VOct
俺が作ったcsvパーサーなら、ファイルを適切なところにコピーするだけで動く
rubyのインストールは難しい。誰にでもできるような作業じゃない
0844デフォルトの名無しさん垢版2022/10/04(火) 03:13:47.12ID:F9I3VOct
俺が作ったcsvパーサーはコメント除いて200行ちょっとしかない
たった200行書くだけでrubyは不要になる
200書く方がインストールよりも簡単だ
0846デフォルトの名無しさん垢版2022/10/04(火) 06:08:41.35ID:d4cMYyPK
何かワロタw
0848デフォルトの名無しさん垢版2022/10/04(火) 15:36:06.28ID:VPNCWU/y
というと?
0849デフォルトの名無しさん垢版2022/10/04(火) 16:05:16.77ID:d0x64lde
Rubyのインストールが難しいとか言ってるやつの書いたCSVパーサーww

使ってるやつ絶対アホ
0850デフォルトの名無しさん垢版2022/10/04(火) 16:14:37.74ID:LlVt6c8r
ダブルクォーテーション内のコンマ改行、エスケープ文字、空白、空行、末尾コンマ、行ごとの列数ブレの扱いや、エンコード、読み込みバッファの使い方とかかしら
0851デフォルトの名無しさん垢版2022/10/04(火) 21:21:17.34ID:GpOlx84l
クォートがダブルクォーテーションとは限らないしそもそもクォートされてるとも限らない
0852デフォルトの名無しさん垢版2022/10/04(火) 23:27:34.84ID:CNGS9dK7
シェル芸では、CSV をAWK で書くけど、

ダブルクォーテーション内に、
ダブルクォーテーション、行区切り文字の改行、列区切り文字のカンマがあるとバグる

だから問題では、それらは存在しない事になっていて、現実的ではない。
シェル芸は、あくまでもパズル。頭の体操
0854デフォルトの名無しさん垢版2022/10/07(金) 21:40:47.14ID:/7BkWz35
おまえらこういうのがシェルゲイだよ
/bin/sh -c 'while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-32));date;tput rc;done &'
0855デフォルトの名無しさん垢版2022/10/08(土) 07:32:17.40ID:sJ7nSBE8
さすがに一行すぎるwww
0856デフォルトの名無しさん垢版2022/10/08(土) 08:58:04.16ID:ZJ2MUJ2n
シュル芸って一行ならなんでもいいのけ?
1000行ぐらいのシェルスクリプトだって
セミコロンでつなげば一行になると思うが?
0857デフォルトの名無しさん垢版2022/10/08(土) 17:52:45.45ID:sJ7nSBE8
ネタをネタとわからない人は・・・
0858デフォルトの名無しさん垢版2022/10/09(日) 10:39:58.10ID:CEIVYWT/
./自作便利コマンド.rb

こういうのもシェル芸になるのかな?w



./OSS便利コマンド

だって、これはシェル芸やろ?w
0859デフォルトの名無しさん垢版2022/10/09(日) 15:35:04.77ID:pTe7tmBB
見たやつにへぇーボタンを押させるかどうかよ すべってたり寒かったらスルーされるだけ
0861デフォルトの名無しさん垢版2022/10/09(日) 17:24:33.51ID:CEIVYWT/
>>860
定義に自作コマンドを使ってはならないなんて書いてないぞ
だから使っていいよねって話
0863デフォルトの名無しさん垢版2022/10/09(日) 17:52:14.19ID:CEIVYWT/
>>862
最初からそういえばいいだろ?
なんで最初から「いいよ」って返信しなかったの?
0866デフォルトの名無しさん垢版2022/10/09(日) 18:59:37.92ID:oIDn8Gmd
もめてんのか?
おっちゃんが仲裁してやろうか?
0868デフォルトの名無しさん垢版2022/10/10(月) 08:55:39.46ID:ASWlLsU8
道理にかなってるとかじゃなくて面白いかどうかなのに、
アスペにはわからない模様
0872デフォルトの名無しさん垢版2022/10/15(土) 20:43:57.71ID:aC7xlUxJ
POSIXに準拠したtarを作ればいいじゃん
0873デフォルトの名無しさん垢版2022/10/16(日) 00:36:11.22ID:EpE6LQff
POSIX準拠とかこだわってどうするんだろう?
絶対に完全オフライン環境でも使えなければならない理由があるなら別だが、そうでなければ無いものはダウンロードすればいいだけなのに
0874デフォルトの名無しさん垢版2022/10/16(日) 01:44:06.87ID:AdicRi1j
>>873
おろかものめ。Pythonやライブラリを使うとソフトウェアの持続性が短くなる
シェルスクリプトはメンテンスフリーだ。古いOSから最新OSにまで対応できる
ファイルをコピーするだけでいいからインストールが簡単だ

POSIXは1988年に規格化されてからほとんど変わらない
POSIXに準拠していないものは移植性が低い
POSIXに準拠していればLinuxでもMacでもいつでもどこでも動く製品を開発可能だ
これはシェルスクリプト以外では不可能だ
POSIXだけが25年経ってもメンテナンスせずに動き続けるソフトウェアを作れるのだ
0875デフォルトの名無しさん垢版2022/10/16(日) 02:26:07.88ID:JzUhNpEc
まあブーブーいうなよ あんたもどうせそのPOSIXが標準化に失敗したtarを使ってるんだろう?
0876デフォルトの名無しさん垢版2022/10/16(日) 22:42:44.89ID:ZGQtChBm
少なくとも、macOSはPOSIX準拠ってことになってるけど使えない機能あるけどな。
0877デフォルトの名無しさん垢版2022/10/17(月) 12:18:15.97ID:lr6vgl7q
>>874
> おろかものめ。Pythonやライブラリを使うとソフトウェアの持続性が短くなる
> シェルスクリプトはメンテンスフリーだ。

セキュリティホールあきっぱなしの /bin/sh 実装でもスクリプトが実行できるガバガバ運用ってだけでしょ。
メンテナンスせずに動き続けるって事こそが危険だから Python は下位バージョン切り捨ててるわけで。
0878デフォルトの名無しさん垢版2022/10/17(月) 20:48:54.25ID:gqwh4i+l
本当に何十年も使われることが想定されるものを作っているならいいけど、なんとなく「寿命長い方がいいよね」程度の理由でPOSIXに拘って結局暫くすれば使われなくなるなら結果的にかなり生産性悪い作業でしかない
0879デフォルトの名無しさん垢版2022/10/17(月) 21:48:02.26ID:kiowcDiZ
>>877 >>878
そうやって今まで使っていたアプリケーションが
OSをアップデートしたらいきなり動かなくなって
長い間システム停止して大損害が発生するわけだ
その責任をお前らは取れるのか?

シェルスクリプトで作っていれば何十年後でも動くし
ファイルコピーだけで別の環境で動く。何も修正する必要はない

シェルスクリプトの可搬性が低いとか言ってるやつは
どのOSでも動く書き方を知らんだけだ
POSIXがあるのだからシェルスクリプトの可搬性は高い
0881デフォルトの名無しさん垢版2022/10/17(月) 23:40:16.19ID:lr6vgl7q
>>879
OS アップデートで動かなくなる状況の場合はカーネル/libcがらみで dash も影響受ける。
OS じゃなくて言語・インタプリタのアップデートの場合も過去の失敗から java やら python は複数
バージョンインストールするようになってる。 /usr/bin/python3.6 とか入ってるだろ?

/bin/sh が POSIX 非互換なのか dash なのか bash なのかは非決定的なのにいつまでもシェバン
に /bin/sh って書く方がおかしい。

メンテナンス性の悪い POSIX 互換で書くよりシェバンに /bin/bash って書いてメンテナンス性良い/
簡潔なスクリプトを書くべき。 難読な POSIX 準拠のスクリプトを素人プログラマーが下手に
修正してエンバグするほうが余程リスクが高いわ。
0882デフォルトの名無しさん垢版2022/10/17(月) 23:58:11.53ID:HOU4mi8w
リスクを恐れてノーベルプライズを獲れるだろうか。
0884デフォルトの名無しさん垢版2022/10/19(水) 19:49:59.67ID:xl7PC10Z
いま作ってるシェルが糞コード過ぎて恥ずかしいからさっさとこの現場から離任したいわ
0886デフォルトの名無しさん垢版2022/10/21(金) 23:00:45.82ID:TEKOXySm
>>426が書いてるように、
bashですらスクリプトファイルの逐次read中にスクリプト実行までやるのは不思議だわ
0888デフォルトの名無しさん垢版2022/10/22(土) 01:01:08.46ID:w0vCAaPV
実行時にコード生成してそれを実行するなら
runtime_code_generator |bash
で済むしなあ

入出力を<>(rw)で開いて0&>1でウロボロス実行方式を閃いた
何でもいいから非同期バッファ(cat &とか)挟まないと自分が書きにやって来る(書いてるから来ない)のを待たされてデッドロックしそうだが
0891デフォルトの名無しさん垢版2022/10/24(月) 09:33:19.96ID:P2J4rO7b
パスワード生成
cat /dev/random | tr -dc '[:alnum:]' | fold -w 16 | grep '[[:digit:]]' | grep '[[:upper:]]' | grep '[[:lower:]]' | head -n 1
0893デフォルトの名無しさん垢版2022/10/31(月) 23:10:15.52ID:Sg749A95
"c:\test\e01"
の文字列をkshで書く際に
"c:\\test\\e01"
とすると"c:\test□01"と化けてしまうのですが、
どう記載したら良いでしょうか。
0894デフォルトの名無しさん垢版2022/10/31(月) 23:54:05.96ID:8d/Em0+h
そもそもコマンドは何?勝手にc風エスケープ受け付けるコマンドと仮定するけど

\tにはちゃんと\効いてるのに、よりマイナーな\eをesc文字と解釈するのが気持ち悪いな

とりあえず'(シングルクオート)でそのまま囲めば?
0895デフォルトの名無しさん垢版2022/11/01(火) 00:00:32.67ID:XWm3usXf
初歩的過ぎ、あるいはkshでは違ったらごめんだけど

"\\"はコマンド関係無しにシェルが\と解釈する
後はコマンドが解釈する

という前提はok?
0896デフォルトの名無しさん垢版2022/11/05(土) 13:54:01.79ID:tvTqkbo5
"#!"機能の有無の検出って、シェルでどう書くんだっけ?
0899デフォルトの名無しさん垢版2022/11/05(土) 14:14:53.38ID:0pCmU1l8
>>896
実際に呼んでみれば?

echo '#! /usr/bin/echo true' >hash-bang-p
chmod u+x hash-bang-p

if ./hash-bang-p |col1; then
# assume implicit invocation available.
else
# don't rely on the mechanism,
# explicitly specify interpreter.
fi

的な感じで
0900デフォルトの名無しさん垢版2022/11/05(土) 14:20:51.30ID:0pCmU1l8
ごめんcol1じゃダメそうだわ
機構が有効なら./hash-bang-pは文字列を返して、そうでなければ返さない(例:sh ./hash-bang-p)
事に注意してよしなに
0901896垢版2022/11/05(土) 14:29:19.32ID:l9nmx+fu
>>897
SVR2とかは>>898みたいに書いても、単にコメントとして処理されてたんです
(この例だとperlは実行されない)

>>899
やぱし呼んでみるしかないか…
0903デフォルトの名無しさん垢版2022/11/05(土) 14:43:53.71ID:0pCmU1l8
>>901
#!機構で呼んでくれないけど、#!指定のインタプリタを呼びたいケース
例えば実装スクリプト言語が不明/システムにより異なる場合等
とりあえずパースすれば?

`echo "$(head -1 unknown-script)" |tr -d '!'#`

的な感じで
汚ないというのは、まあ容赦してくれ
0904デフォルトの名無しさん垢版2022/11/05(土) 14:45:39.00ID:0pCmU1l8
伝統的にスクリプト実装だけど、効率のためバイナリに置き換えられてる場合も多々あるので、fileの結果を見た方がいいかも
0905デフォルトの名無しさん垢版2022/11/05(土) 14:52:27.83ID:0pCmU1l8
分かりにくいと思うので補足>>903

例えばunknown-scriptが先の./hash-bang-pなら
中のコマンド置換は文字列
/usr/bin/echo true
を返す

外のコマンド置換でこれがコマンドとして実行され
true
が返る(はず)
0906デフォルトの名無しさん垢版2022/11/05(土) 14:55:56.67ID:0q4aURph
System V Release 2は1984年4月にリリースされたって書いてあるんだが
38年前かー。ファミコンのパックマンの発売年じゃん。
初代スーパーマリオの一年前のUNIX
そんなの使ってるなんてなんか可哀想w
0908896垢版2022/11/05(土) 14:58:35.52ID:W/fi7cAS
>>902
そういやperl4のConfigureって判別してたよなって思い出して、
っぃ…
0910デフォルトの名無しさん垢版2022/11/05(土) 15:15:49.65ID:CaYWlfee
単に$?を見るのはダメだったの?
本質はOSがshebangをサポートしてるかどうかの判定だから、やってみて戻り値見る行為以外ないんじゃないかな
>>903みたいのはzshが内部でexecve()の失敗後にやってるけど、判定が主題ならそのconfigureのやりかたを見てみたいな
0911デフォルトの名無しさん垢版2022/11/05(土) 15:18:31.87ID:0pCmU1l8
>>907
そうか、というか仮に動いても正しく動く保証は全く無いな…
長さ制限を除いても、#!機構のパースは一般にシェル言語と全く関係がないので(特に引数やクオート)

例えばlinuxの#!機構は引数は一つまでなので
#! /usr/bin/env -Scommand\_arg1\_arg2
みたいなものが書かれる
perl等も(独自の)似たようなワークアラウンド機構を持ってたはず

そのままシェル言語として通用する文字列が得られるのは
#! /path/to/command alnumonly
くらいな気がする
0912デフォルトの名無しさん垢版2022/11/05(土) 15:24:38.61ID:0q4aURph
その頃のUNIXだったら/bin/shじゃなくて/usr/bin/shとかも
考慮しないといけないのでは?
0913デフォルトの名無しさん垢版2022/11/05(土) 15:40:46.08ID:EHQev3W6
>>912
そこまでワークアラウンドを積み重ねるくらいなら、もう潔く決め打ちで"分かりやすく"失敗して、ユーザーに適宜直してもらうべきだな

自分で言うのもアレだけど、>>903にSVR改修、パスサーチ、言語毎の#!機構用ワークアラウンドに対するワークアラウンド…
を加えていけば、一体どんなモンスターになるやら
0915デフォルトの名無しさん垢版2022/11/05(土) 17:48:14.73ID:/GinkP0r
変な工夫を凝らして変死するのが最も厄介

>>899
必要かどうかはさておき少しだけ読みやすく
(hash-bang-p)
#!/usr/bin/true
false # or exit 1

if ./hash-bang-p; then
...
0916896垢版2022/11/05(土) 21:40:31.60ID:/vhGZAk/
>>910
perl5のConfigure出てきた
github.com/Perl/perl5/blob/blead/Configure
これのsharpbangって変数のあたり

でも、これ自体はmetaconfigが自動生成したやつだしな…
0917896垢版2022/11/05(土) 22:42:53.63ID:/vhGZAk/
>>899
-P Convention………lisperの『味』だぜ……
0919896垢版2022/11/06(日) 16:23:58.52ID:6IpVpf3a
UNIX板のシェルスクリプトスレの方がいいのだろうか…

>>908
レトロゲームをやりこむのに近い行為なのかもです
0922デフォルトの名無しさん垢版2022/11/10(木) 16:24:36.94ID:klH1mu/P
UNIX板は過疎板
0925デフォルトの名無しさん垢版2022/11/10(木) 19:50:54.97ID:eyva6wLj
>>924
あとサーバー系もUNIXは終わってるよね
ハードウェアを作っているところが
ドライバを非公開にして、ハードウェアを
販売したいってところでしか使われてない
0928デフォルトの名無しさん垢版2022/11/11(金) 12:25:02.65ID:dkXTOyUr
そのページはWebサーバ限定で、しかもUNIXは80.3%使用されてるって書いてあるけど…

仮にlinuxとBSDを抜いたとしても、
0.803×0.533=約40%は使われてる計算
0932デフォルトの名無しさん垢版2022/11/11(金) 22:25:10.60ID:aBiT4hkd
どっちもどっち
unknownはlinux含むunix
linuxを除くunixがそこに何%含まれてるかは分からない
だからunixのシェアが0.1%とも40%ととも言えない
0934デフォルトの名無しさん垢版2022/11/11(金) 23:15:32.87ID:yV2t16iO
基盤なunixは変わらず生き続ける
linuxは傍流でしかない、仕様策定上は。bashismで見られるようにw
linux使ってるだけのlinux中だろな。中学生な
0935デフォルトの名無しさん垢版2022/11/12(土) 00:47:02.31ID:Cj/ueztB
>>934
分かった分かった。

Linuxは生き残る
死ぬのはBSD UnixとSystemV Unix

このように言えってことだろ
分かってるって
0937デフォルトの名無しさん垢版2022/11/12(土) 19:15:00.71ID:2bWZf5Rs
あるディレクトリの下にサブディレクトリがいくつかあって、それぞれのサブディレクトリの中にはファイルがいくつかずつある
このサブディレクトリ群内のファイルを対象に作成日時が新しいものから順に任意の個数を選んでサブディレクトリ名を含んだパス名を出力する場合どう書く?
0942デフォルトの名無しさん垢版2022/12/15(木) 20:10:29.53ID:xAICKfjX
bashの実行中上書き動作ってどういう時に役立つの?
0944デフォルトの名無しさん垢版2022/12/15(木) 21:57:10.51ID:RzHoZPr/
超Geekぐらいだろな、役立つように使おうとするのは
機能としてではなく限られたメモリ上でどうするかでそうなったんじゃね
>>943
バイナリの正当な(?)実行ファイルもそうなのか?
あり得ないけど=今時のUnix系OSはそうはならない
0945デフォルトの名無しさん垢版2022/12/15(木) 22:14:44.89ID:a9LNvh7S
UNIX/Linuxにはアドバイザリロックしかないんだから
実行中にファイルは書き換えられる
バイナリ実行ファイルは、スクリプト言語とは違って
最初にメモリに全部読み込むってだけ
0946デフォルトの名無しさん垢版2022/12/15(木) 23:02:40.00ID:DSr8QAEc
そもそも、シェルやしな。
インタラクティブが前提なら必要なとこまでしか読んどらんやろから、自然とそうなるんちゃうか。
0947デフォルトの名無しさん垢版2022/12/15(木) 23:11:24.42ID:a9LNvh7S
インタプリタっていうのは元々そういうもんだと思うけどね
一行ごとに解釈するものなんだから、必要ないところまで読み込む必要がない

最近のスクリプト言語は最初にファイル全体を解釈して
内部的にバイナリにしているような気がするけど
それもファイル単位で動的にファイルを読み込むこともあるし
0948デフォルトの名無しさん垢版2022/12/15(木) 23:16:12.82ID:5ZR90K1l
昨年末にHP(が作成したスクリプト)が京大のスパコンデータを吹き飛ばした事故があったけど、あれも原因は「実行中のシェルスクリプト書き換え」だったはず
0950デフォルトの名無しさん垢版2022/12/16(金) 09:17:10.65ID:OmUfbGxN
>>947
opengroupはシェルスクリプトのコンパイルとか静的解析とか、なにやら不穏な事を考えているよう
One justification for ignoring the contents of IFS upon entry to the script, beyond security considerations, is to assist possible future shell compilers. Allowing IFS to be imported from the environment prevents many optimizations that might otherwise be performed via dataflow analysis of the script itself.
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html

寡聞だが珍妙な事やってるシェルなんて知らないし、シェルスクリプトなんてロートルなのがむしろ魅力なのにな

ちなみに俺はexitの後に>>"$0"でデバッグ中のログ取りしてる、別にログファイル作るのめんどいしバッファ再読み込みでエディタにすぐフィードバックが得られる

他のビルトインの項を見ても珍妙な展望(?)が見られて面白い、誰が望むんだこれ
It is anticipated that a future implementation could take advantage of this and provide something like:

outofloop: for i in a b c d e
do
for j in 0 1 2 3 4 5 6 7 8 9
do
if test -r "${i}${j}"
then break outofloop
fi
done
done

and that this might be standardized after implementation experience is achieved.

実装に先走って舵取りまでやりたいのかこいつら、傲慢もいいとこ
0951デフォルトの名無しさん垢版2022/12/16(金) 09:26:55.18ID:OmUfbGxN
exitやexecの先まで読まれるとtclやperlのように頭だけシェルスクリプトとして読まれて、読まれない部分にコードを記述するインタプリタや、到達しない部分をデータ置き場として使ってるスクリプトが困るような

まあ展望されている実装が十分賢くて、そこでシンタックスエラー出さないなら問題無いんだけど
0953デフォルトの名無しさん垢版2022/12/16(金) 10:43:52.39ID:IL6/baQf
>>950
何言ってるの? opengroupはシェル開発者がやろうと思っていることを
妨げないようにしているだけ

シェルスクリプトのコンパイルであればBourne Shellの開発者がやろうとしたことだし
Korn Shellにはずっと前からシェルスクリプトのコンパイラがある

お前の意見を押し付けるな
傲慢はお前だろ
0954デフォルトの名無しさん垢版2022/12/16(金) 10:48:02.96ID:IL6/baQf
>>950
誰が望むんだって、それただのラベルを使ったループの脱出じゃん
そういった拡張シェルを作りたい人もいるだろうし
お前は、将来の目をつもうとしてるのか?
シェルが改良されたら困ることでもあるのか?

まああるんだろうな。
新しいシェルを勉強したくない
0955デフォルトの名無しさん垢版2022/12/16(金) 10:53:44.58ID:IL6/baQf
> ちなみに俺はexitの後に>>"$0"でデバッグ中のログ取りしてる、別にログファイル作るのめんどいしバッファ再読み込みでエディタにすぐフィードバックが得られる

珍妙な事やってるな(笑)
0957デフォルトの名無しさん垢版2022/12/16(金) 11:00:38.08ID:IL6/baQf
>>951
単純にシェルスクリプトにシェルスクリプトとして解析できないものを埋め込んだら
コンパイルできないってだけだろ

頭固いよ(笑)
なんでシェルスクリプトのコンパイラは
どんなシェルスクリプトにも対応できなきゃ駄目だって
思っちゃうの?

【注意】以下のようなコードを書いたらコンパイルできません

って注意書きを書くだけでいいんだよ?
もっと柔軟な頭を作ろうね(笑)
0958デフォルトの名無しさん垢版2022/12/16(金) 11:01:23.90ID:Z4pvnD7F
インタプリタを軽くした方が筋がいいと思うわ
dashもなだかんだでコマンドライン編集や規格に従いたくて対話機能落とせてないし
どうせスクリプティングにしか使われないんだから、規格なんて無視すればいいのにと思う
0959デフォルトの名無しさん垢版2022/12/16(金) 11:06:09.35ID:IL6/baQf
機能を削減したら互換性がなくなるだろ
規格準拠じゃなくて、互換性のためにやってる
0960デフォルトの名無しさん垢版2022/12/16(金) 12:14:08.72ID:uGaF/TrQ
>>950
vi編集モードの指定がやけに細かいな
dashはemacsもヒストリもサポートしてるしむしろ対話シェルとして十分使える方で、普段対話使いしてる人もまあ居るかも

シェルスクリプトエンジンとしては、ttyに見せかけてvi/emacs風キーバインドを送って間接的にコマンドバッファ弄ったり、ヒストリ検索活用するシェルスクリプトが多いなら互換性の為に要るけど、要るかね?

対話用途の人も少なからず居るだろうからdashとしては出せなくても、名前を変えてシェルスクリプトエンジンとしてもっと特化した版があれば嬉しい
0961デフォルトの名無しさん垢版2022/12/16(金) 16:12:38.11ID:nGRI2Vf+
シェルスクリプトなんてコンパイルしたところで外部呼び出しだらけだし大して速くもならんでしょ

恩恵あるのはビルトインだけでループぐるぐる回すベンチくらい
0962デフォルトの名無しさん垢版2022/12/16(金) 16:15:48.57ID:IL6/baQf
>>960
> vi編集モードの指定がやけに細かいな
もしかしてPOSIXが仕様を決めたから
dashはその通りに作ってるとか思ってる?

vi編集モードとかemacsとか、それを最初にやったのはkshなの
dashやbashや他のシェルはそれを真似しただけ
POSIXはkshやdashやbashで移植性があるものを文書化しただけなの

> 対話用途の人も少なからず居るだろうからdashとしては出せなくても、
> 名前を変えてシェルスクリプトエンジンとしてもっと特化した版があれば嬉しい

自分で作ればいいじゃん?POSIXに準拠してないシェルを作ってもいいんだよ。
dashはPOSIXに準拠するという方針なだけ

機能を減らすことで何が嬉しいのか知らんけど/bin/shとしては使えなくなるだろうね。
別にbashをインストールしなきゃ対話的に使えないOSになってしまう
0963デフォルトの名無しさん垢版2022/12/16(金) 16:18:55.94ID:IL6/baQf
>>961
×シェルスクリプトなんてコンパイルしたところで外部呼び出しだらけだし大して速くもならんでしょ
○外部呼び出しだらけのシェルスクリプトはコンパイルしたところで速くならない

他の言語のようにビルトインだけで作ればいいんだよ
作れるわけがない?

作れない理由を潰せば作れるよね?
シェルの将来としてそのようなシェルがあってもいい
0964デフォルトの名無しさん垢版2022/12/16(金) 16:53:39.13ID:OmUfbGxN
>>961
それを言ってはおしまいだけど、IFS決め打ちって文脈からパースについて楽できないかって話ね

しかし複合文は先読みでエラー出せることから分かるように、環境の更新や副作用起こす展開をしないループなら既に手抜きは可

長大なベタ書きならIFS決め打ちで結構削れるだろうが、そんなケチくさい努力に見合うとは思わない
0966デフォルトの名無しさん垢版2022/12/16(金) 17:23:00.10ID:0LHDM9/j
まああれだね
「POSIXが変なことを考えていて、コンパイラとかを作ろうとしてる」
と勘違いしているアホが居る

POSIXがどういうものかを理解していれば
「POSIXはコンパイラを作ろうとしているシェルがあることを知っていて
そういったシェルを将来作れるように考慮している」
が正しいとわかる
0967デフォルトの名無しさん垢版2022/12/16(金) 23:21:48.19ID:KwA6ycaA
じゃあ後追いでええのにな。
様子や実装具合を見ながら。

どうせ普及せんのやろし。w
0968デフォルトの名無しさん垢版2022/12/16(金) 23:35:49.94ID:Out/cb9o
>>967
だから後追いじゃん?
POSIXが先に作ってる仕様なんてないぞ
どこにPOSIXがコンパイラの仕様を作ってる?
よーくみたまえよ
0969デフォルトの名無しさん垢版2022/12/17(土) 13:59:03.04ID:yWXMz5Ex
一部だけ認めるのでもまだ早い。
大半が実装してから共通項を整理するくらいでいい。
0970デフォルトの名無しさん垢版2022/12/17(土) 14:13:00.20ID:zTx/vduP
>>969
やっぱり理解が追いついてないか(苦笑)

1. シェルスクリプト用のコンパイラを作りました
2. この時点でPOSIX準拠になっていないといけない
3. 大半が実装してから共通項を整理する

大半が実装するまでの間、POSIX違反になっちゃいけないのよ
意味わかる?POSIX違反なコンパイラを作るな!って言われるでしょ

POSIXが正しいシェル間違ったシェルを決めるのは傲慢
POSIXは決まった以外ならどんなシェルでも許さなきゃいけない
0972デフォルトの名無しさん垢版2022/12/17(土) 14:23:48.31ID:zTx/vduP
「大半が実装するまでPOSIXでは認めない」
これが傲慢な考えだってわからないのは本当にヤバイよ
POSIXがルールになってるじゃん

「大半が実装しなくてもPOSIXはそれを禁止することはない」
0973デフォルトの名無しさん垢版2022/12/17(土) 15:41:00.83ID:fCc6f5AR
>>950
例にしてもラベルの位置が先頭なのは思慮が足りなさすぎるな、予約語認識のセマンティクスとBNFに手を入れることになる
仮にねじ込むとすれば、inの部分で認識される
新予約語に続けてラベル名
0974デフォルトの名無しさん垢版2022/12/17(土) 15:55:58.46ID:3o3z3wxM
for x of outerloop [in word+]
的な感じか
ofは適当だけど、既に予約されてて意味の通るトークンが流用できれば望ましい
0975デフォルトの名無しさん垢版2022/12/17(土) 16:24:44.82ID:dohNO5X8
>>973
それ例じゃないからw
あんたこれPOSIXの提案だって思ってるでしょ?

こんな事も考えられるってことでだけだよ
そんなことに突っ込んでも意味ない
0976デフォルトの名無しさん垢版2022/12/17(土) 16:25:41.46ID:dohNO5X8
どういう文法にするかはシェルを作っている人たちが考えることであって
「POSIXは仕様を考えません」ってスタンスは明確になっている
0977デフォルトの名無しさん垢版2022/12/17(土) 16:25:59.84ID:nev2pk2m
まだ試してないけどfor x ofの時点でシンタックスエラー吐くのが普通だろうし、自由に選べるはず
C-style((..))のような拡張とも被らない
0981デフォルトの名無しさん垢版2022/12/18(日) 11:36:21.55ID:X5nUMPIw
>>973
forに足すなら浮いてる終端記号
in : In
を拡張するのが確かにスマートなんだけど
言語全体で見るとwhile/untilに使えないのが不自然

for_clause : For name do_group
| For name sequential_sep do_group
| For name linebreak in sequential_sep do_group
| For name linebreak in wordlist sequential_sep do_group
;
while_clause : While compound_list do_group
;
until_clause : Until compound_list do_group
;
do_group : Do compound_list Done
;

do_groupに足したいところだが、compound_listが何でもアリだから曖昧になる、末尾:は非コマンド名と予約しても現状通るし、do : ; done すらイディオム、もちろん今のうちから予約しておくのは良い事
ただし意味論的にキモい事になる(label:がwhile行とズレる)
while ...
do label:
...
done
ので、ラベルのようなあっても無くても困らないものでなく、もっと重要な拡張の為に取っておくべき
0983デフォルトの名無しさん垢版2022/12/18(日) 15:19:58.34ID:dtHdvs65
コマンドがファイルでありえる限りヌル文字と/以外なんでもありだし、本当に任意コマンドを受け取って呼ぶならcommand, type, envとかで全部問い合わせるか、クォートする必要があるな

ところで任意文字列のコマンドが既にダメなのは今更な事に気付いた、例えば
✗com=mand arg1 arg2…
✔\com=mand arg1 arg2...

これを流用して意味を為さない
=label
なんてどうかと思ったが、bash/dashはcommand not found返しやがる
0984デフォルトの名無しさん垢版2022/12/18(日) 15:31:36.28ID:dtHdvs65
不用心にパス区切へ使われがちな:はなるべく避けてるけど、名前空間の表現なんかでpkg:nameくらいは使いたい
末尾:という制限付きならまあ

とりあえずbashは関数も実行ファイルも普通に作れるしガン無視の模用、実効性は疑問
0986デフォルトの名無しさん垢版2022/12/18(日) 16:06:25.57ID:ZsJ4rXOo
>>983
=は他のコンテキストでクオートする必要がないところが特異

任意文字がダメなのはコントロールオペレータやメタ文字、予約語もそう
当たり前だから忘れがちだけど、空白>|($&cを含んだコマンドを呼ぶならクオートする
0987デフォルトの名無しさん垢版2022/12/18(日) 16:48:20.92ID:X5nUMPIw
>>983
面白い挙動見つけたな
名前を受け取ってevalし、空でなければ普通に環境設定、空ならデフォルト動作として=cmdが呼ばれるとか
色々遊べそう

禍根はこうして産まれるんだなって
0988デフォルトの名無しさん垢版2022/12/18(日) 17:18:29.27ID:X5nUMPIw
一応opengroupのShell Command Languageには
The words that are recognized as variable assignments or redirections according to Shell Grammar Rules are saved for processing in steps 3 and 4.
と記載があるので、variable assignmentとして認識できないなら、コマンドとして検索すると間接的に示唆してるな

もちろん期待すべきではないが
0989デフォルトの名無しさん垢版2022/12/18(日) 17:34:17.53ID:hzU9uYVT
名前が空になるのは大抵eval "$var=$val"のようなコードでのバリデーション不足だから、エラーにしてくれれば親切なのに
残念
0990デフォルトの名無しさん垢版2022/12/18(日) 18:33:19.40ID:KWJCN7PT
挙動は揃ってるっぽいな
こんな時の為の明示的なunspecified
汚いから連想配列使えって?標準を示してくれればな
0991デフォルトの名無しさん垢版2022/12/18(日) 19:25:00.97ID:X5nUMPIw
親切にエラーを投げても構わないよ、って意図はしばしば察せられるね
正直とても分かりにくいが

変数はダメ文字多いけど、頑張るならx$VARとか
0992デフォルトの名無しさん垢版2022/12/18(日) 21:30:49.34ID:TnNkrrc4
>>989-990
それがBourne Shellの動作だからね
POSIXはそれを明確化しただけ

さっきからずっとPOSIXに文句を言っているようだが
POSIXにごちゃごちゃ言うようなないようじゃないよ

そんなの意味ないからbashやkshの開発者に
変更してくれって言わないとだめ
0993デフォルトの名無しさん垢版2022/12/18(日) 21:32:32.95ID:TnNkrrc4
>>991
> 変数はダメ文字多いけど、頑張るならx$VARとか
え?それで何が防げると思ってるの?
少しよく考えた方がいい
無意味な話をしてる。
0996デフォルトの名無しさん垢版2022/12/19(月) 00:58:54.84ID:DF8VTccp
>>992
互換性を保つ必要があるわけだから
ここでごちゃごちゃ言ってもどうしようもないよね
POSIXに色々書いてあったとしてもそれは
後からでも変更できるので気にする必要はない
0997デフォルトの名無しさん垢版2022/12/19(月) 02:05:36.38ID:8Bk5E6e1
ここに居る人は多かれ少なかれ利害関係者なわけだけど、その意識が欠けてる感じがする

俺は物言うエンドユーザー(いわゆるクレーマー)だけど
ニュースグループ、メーリス、バグレポートに直接クレーム付けるのが憚られるインフォーマルな話題やネタは大体ここから拾ってたりする
おまえらエッジケース見付けるのうまいしな

少なくともchetは丁寧に返信してくれるよ、他は知らん
1000デフォルトの名無しさん垢版2022/12/19(月) 02:21:06.52ID:sparn4DJ
まあちゃんと日本語話せるようになれよw
お前の日本語は意味不明で誰も理解できんからwww
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 439日 3時間 31分 36秒
10021002垢版Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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