シェルスクリプト総合 その37
レス数が1000を超えています。これ以上書き込みはできません。
シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
・「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/ ・特記なき場合、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ページや各種リンクを見ましょう
・ワイルドカード・パターンは正規表現ではありません。正規表現の話題は正規表現スレへ
・シェル芸とシェルスクリプトは全く異なります
・シェルスクリプトのことをシェルってゆうな つーか真偽値の問題じゃなくて
シェルスクリプトのifが終了ステータスを判断するコマンドってだけだろ あとシェル関数が返すのも終了ステータス
戻り値じゃない、そもそも終了ステータスしか返せないだろ
returnだからって他の言語のretruntを同じだと思うなよ >>6
だから真偽値の問題でしょw
お前、いい加減自分で何言ってるかわかってないだろw
それを言ったらC言語のifだって値を判断するだけのコマンド(文)って
なっちゃうだろwww
だれかがboolean型持ち出したから、混乱してんのかもしれないけど、
昔のC言語にはそんな型ねーからな?w 結局、Cでも(その他でも)シェルスクリプトでさえも、
ifってのは式の値を真偽に判断するものなんだよ。 だから、シェルスクリプトが他と違って特殊なのは、
式の値を0の場合を真と判断するところ、だけだよ。
それがexit statusであるかとかは全く関係がない。
要点はそこだけ。 >>ID:FcrICImt
本当に、前スレ>>984で言われた通りだな
if command; then
で、commandのとこにコマンドを書いたことないのか?
プログラミングにおいて、問題なく実行できたら別にどうとかはないが、失敗した時には原因が欲しいのは当然
コマンドの実行においても同じ。だから、成功できた場合は 0 で、それ以外の値は失敗になるのも当然。エラーの場合のExit Statusの値を規定できてなかった/してなかったからから「含み」を持たせてるだけになってるが
(よくわからんが、JCLとやらも同じそう)
>シェルスクリプトで、0がノーエラーでなければいけない理由はif文の条件式の判定が
>特殊だから。
逆だよ、上に書いてある通り、また、前スレ>>936のK&Rが言っている通り、0 が正常(お前の言う「真」)が先だよ
シェルスクリプトがコマンドを実行するためのものなんだから、成功=0(=お前の言う「真」)とするのも独特でもなんでもないな。他の言語と比べると独特と見えるのかもだが
command && command
とか、常識的に見えるだろ?上手く整合性があるようにできてるんだよ
つづく つづき
真偽に拘りたい真偽でしか理解できないなら、
他の言語は 「評価式の結果 != 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からのにわかか?
何かまだ言い張ってるなあ あ、あとついでに言っとくと、終了コードを判断するしかないのは、シェルスクリプト
はそれ自体がそもそも計算ができないからw
そうならざるを得ないのは、この点にかかるw ID:h64P2lE5はそもそもプログラミング言語というものを理解できてないんだなw
いや、プログラミングが理解できてないのか?w
あと日本語も多分理解できてないんだろうなw
で、結局、ID:h64P2lE5は何が言いたいんだ?w
もうさっぱり分からんよw え?まさか、>>10を否定しているの?w
シェルスクリプト以外のプログラミング言語を少しは勉強したら?w
つかシェルスクリプトも書けそうな気がしねーけどな、ID:h64P2lE5はw >>15
お前にわかりやすいように書いてやったのにw
全く理解できないんだな。もしくは認めたくないからのか?その何の内容もないただの無意味な誹謗wなのだけは >>16
お前の根本的なプログラミング/プログラミング言語の誤った理解だよ、否定してるのは
よく「日本語も多分理解できてないんだろうな」とか言えるな >>17
だから、結局何が言いたいんだよw
お前の文章は支離滅裂で関係ないところに
あっちこっち飛ぶから、ものすごくわかりにくいよw
まずは、>>16に答えてくれやw >プログラミング言語というものを理解できてないんだなw
>いや、プログラミングが理解できてないのか?w
>あと日本語も多分理解できてないんだろうなw
>シェルスクリプト以外のプログラミング言語を少しは勉強したら
>つかシェルスクリプトも書けそうな気がしねーけどな
>お前の文章は支離滅裂で関係ないところにあっちこっち飛ぶから
すげえな、改めて見ると。この異常さは何か察してしまうな >>18
「根本的なプログラミング/プログラミング言語の誤った理解」をしているのはお前だよw
例えば、Cでさ、
if (0) {printf("true");}else {printf("false")}
として実行したら何が表示されると思う?w
trueが表示されると思ってる?w >>21
>>12で既に書いてるんだけどな
そんな初心者的な問いかけををして...可哀想に
俺が初心者にも劣ると?馬鹿にしてるつもりなんだろうが、そんなこと平気で書けるお前の程度が知れるだけ
御愁傷様です >>21
まあ言わずもがなだろうけど、
同様のコードで、trueが表示される言語を
俺はシェルスクリプト以外に知らないわw
他ある?w >>22
初心者的な問いかけされてるのは、
お前がそう疑われてもしょうがない言動を
してるからしょw甘んじるよりしかたなかろうw
で、御託はいいから答えなよ。初心者じゃないつもりならw >>25
逃げるんだったら黙って逃げろ。
見苦しい >>26
>俺が初心者にも劣ると?馬鹿にしてるつもりなんだろうが、そんなこと平気で書けるお前の程度が知れるだけ
本当に読まないな、お前は >>27
自分は見苦しくないと思ってるのか...マジもんかよ
お前の行動なんてある意味もう見透かされてるんだけど、それにも気づかないしなあ、お前は >>28
自分の発言の引用?w
お前こそ読めよw
答えろよw
そもそも==ってのは「比較演算子」であって、 あーあ、ミスってしまったw
そもそも==ってのは比較演算子であって、値を算出するものだ、ってのは理解してるかな?w
ま、読まないし、聞かないし、基礎もだめ、なのを相手にしても無益か。
ID:h64P2lE5
は結局、核心を突かれた質問をされると相手を罵倒して逃げるだけのクズだということでw >>30
>>11に既に書いてるのに、理解できてないと思えるお前の頭の七不思議 >>31
そんなことも平気で言えるんだからなあ...つくづく程度が知れる
それも>>11に書いてることだぞ >>32,34
>>11 でなくて >>12
読まない D:h64P2lE5 が悪いw
いや、すまん >>34
お前さ、本当に俺の書いてあること読めてる?理解できる?
お前のようなやつを「おさとが知れる」っていうんだぞ?w
ボキャも貧弱で、おまえの日本語能力すらも程度が知れるんだがw
だからさ、結局、何が言いたいの?w
シェルスクリプトの真偽判定は特殊ではない、
Cと同じだ、と言いたいの?w
で、それは違うよ、って言ってるんだけど、まだ分からない?
日本語が理解できないの?w あと、なんで、そんなに自分の発言引用したがるの?ID:h64P2lE5
自作自演してるの?w >>35
あ...
>読まない D:h64P2lE5 が悪いw
何やねん、俺
>>11の冒頭でも書いてるけど、
value = 何か
if (value != 0)
...
ってあるだろ?なんか知らんアホな問いかけに当てはめると、
if (0 != 0)
...
になるわけだよ、!= 0 が暗黙的を明示しての表記
で、0 != 0 は純粋な二値Booleanになるわけだよ。もちろん false のな
そういうこと言ってるのに理解できないんだからなあ...
多分これも理解できないとか言い出すだろうけど
>>37
既に書いてることをアホのようにそれが無いようにお前が聞くからだな >>38
!=
ってのが比較演算子であって、計算をしている、ってのは理解できる?
「0 != 0 は純粋な二値Booleanになる」
ここが判ってないな、と思うわw
プログラミング言語ってのはそれをBooleanにしてるわけじゃないんだよw
「0かそれ以外」に分けてるだけなんだよw
(アセンブラを分かれば、こんなことは自明なんだけどねw)
概念的にbooleanと言ってるかもしれないけど、それは単に概念的な話であって、
実際とは違う。
ま、比較演算子については1か0かしか返さないよ。
でも、それは比較演算子だから、であって、例えば、算術演算子使って
if ( 1+1 ) {..}
でも成立するってのはわかってる?w >>39
んー...
誤 >>11の冒頭でも書いてるけど、
正 >>12の冒頭でも書いてるけど、
な。すまん
>>36
11に既に書いてる
わかりづらいのはあるかもだがw、もう根本的にはお前の理解不足(知見の無ささによる)としか思えんから、頑張って読んでね
>>39
「計算」をした結果が、純粋な二値Booleanになるんだけど?
自分で「比較演算子については1か0かしか返さないよ」って書いてるくせに何を言ってるの?
だから暗黙的に != 0 がされてると「思え」と言ってるんだが、まだわからんのだが
if ( (1+1) != 0 ) {..}
ってことがわからないんだな...知識が無さすぎだろう >>40
>「計算」をした結果が、純粋な二値Booleanになるんだけど?
だから、そこが判ってないだろw
「二値Booleanになる」のではなくて、「二値Booleanとして判断する」だけ。
だから、「思え」とかいうお前の独善的な命令なんか知ったことじゃないん
だってw
> if ( (1+1) != 0 ) {..}
> ってことがわからないんだな...知識が無さすぎだろう
だから、お前がそう理解したい、って言うんなら、それは間違いではない、とは言ってやるよw
でも、それは「正しい」わけじゃないし、「唯一の間違いじゃない解」でもないんだよ。
頭悪すぎだよ、お前。
あとさ、本当に俺の書いたことをお前は読んだの?俺の言いたいことはちゃんと書いてあるし、
理解できるのなら、お前は俺に対して行った数々の暴言を詫びるべきじゃないかな。 ID:FcrICImtはなんかいうたびにアホが漏れとるな。w
そんなんでイキっとったらアカンで!
相手にしてもらえるのはここだけなんやし。
ほかやったら完全スルーやで。 ID:4emiI4KE
本当にボキャないな、お前w
日本語をまず勉強しようなw >>41
ごまかしか?
>!=
>ってのが比較演算子であって、計算をしている、ってのは理解できる
>「0 != 0 は純粋な二値Booleanになる」
...
>ま、比較演算子については1か0かしか返さないよ
に対してだぞ。「1か0かしか」は明らかに 純粋な二値Boolean だろうが、何を言ってるのか
お前は一般的な話で、
if true
next sentence
というようなこと言っただろう?そんなに真偽(true/false)に拘りたければの話だぞ
なら>>12って話で、他の言語もシェルスクリプトも暗黙的にやってると思えばそれにも合うって話なのに、つくづくお前は自己都合だな
まさか暗黙的ってことがわからないとかあるのか?>>39のあたりから薄々感じてるけどw >>44
> に対してだぞ。「1か0かしか」は明らかに 純粋な二値Boolean だろうが、何を言ってるのか
まだわかんないの?w
1も0もBooleanじゃないよwここで言ったのはまさに数としての1と0なんでねw
「Booleanとして判断するなら」、1はtrueで0はfalseと「解釈できる」だけの話だよ?w
真偽に拘りたければ、の下りは一体何を言ってるのか分からんよw
せめて、俺の具体的な言葉を使ってもらえんかね?
あと「暗黙的」なんて話はそもそもした覚えがないしなぜそのような言葉がここで
突拍子もなく出てくるのか分からんよw >>45
>1も0もBooleanじゃないよw
知識が貧弱すぎて話にならないな
Booleanって言語での「型」だけだと思ってるんだろうな
1/0 (別に他の何かでもいいけど) 2値で真偽を表すのはBooleanなんだけど、それを知らないというのはわかった
自分で1が真だとも言ってる風なくせに
>>12 が全く読めてないのはわかった。「暗黙的」という意味がわからなかったというのもわかった
何かまた誤魔化してるようだけどな(誤魔化してるというかまだわかってない故にかもしれんけどw)
場合によっては真偽を言い、場合によっては言語特有のことをいい、ベース知識がないからフラフラしてんだよ、お前は
いや、単に何かいい負けたくないwだけか?w あ、あとさあ、
プログラミング言語の話をしてるときに、JCLを持ち出すってのはどうかな、と思うわ。
そもそもJCLって規格があったりする言語でもないだろうし(あんの?w大型は
ほとんど使ったことないから知らんけどw)
ID:h64P2lE5はプログラミング言語をCとシェルスクリプトくらいしか知らない、って読めるけど。 >>47
歴史的なことだよ、よく知らんけど
コマンド(小さなプログラムの)の実行と制御という点ではシェルスクリプトは近しいだろう
>ID:h64P2lE5はプログラミング言語をCとシェルスクリプトくらいしか知らない、って読めるけど。
また、言い出してるw >>46
知識が貧弱なのはお前だろw
で、なに、俺の書いた表現が間違ってると、
お前は強弁するわけね?w
解釈って言葉の意味は分かる?
じゃあさ、余計な御託は要らないから、俺の書いた文章のどこがどう
間違ってるか具体的に指摘してもらえるかね?
俺はお前がどう間違ってるか、具体的に指摘したよな。
それに対してお前は「知識が貧弱」だの、型だけだの、全然筋違いの「文句」を
並べただけだよな?(こういうのが「御託」ね?w)
あと凄く勘違いしているようだが、そもそも俺の書きこみに喧嘩売るような真似を
したのはお前の方だからな? >>48
>>48
あ、そw
ああ、そりゃ似てるねえw
コップとたらいが似てる程度にはねw
で、アセンブラは書いたことあるかい?w >>49
また、まだ、めんどくさいことを言い始めてる
>>11,12で言い尽くしてる
お前の無知さからくる書いてること理解できないで(、また誤魔化しでw)、>>11,12に対して「お前が」わけわからんこと喚いているんだよ
「具体的」とやらもそれに対して「具体的」に返してるんだが、それに対してまた理解できないで(、また誤魔化しでw)ごちゃごちゃ言ってるくせによくいうよ >>50
書いたことはあるな
今は読める程度だけどな
何で高級言語wで0か0以外かって話/自慢(w?)したいのか?
またしょうもない質問するなあ >>51
めんどくさいのはこっちだよw
何も間違ったことなど一つも書いちゃいないのに、
なんか、チンピラみたいなID:h64P2ltE5に因縁つけられて
絡まれて。
結局、また核心突かれると罵倒くりかえして逃げるんだねw
で、解釈って言葉の意味は分かるの?w
どうして指摘されたことにきちんと返さないの?w
これじゃ議論どころか会話にもならんよw >>52
高級言語で?w
じゃあ、聞くけど、ここでCは高級言語なの?w >>52
まさか、0か0以外かなんてことを理解している程度で自慢になるなんて思いもしなかったわw >>53
>>20の例みたいなこと書いておいてよく人のことをチンピラとか言ってるな
>>20の例みたいなこと書いてよく人のことを「また核心突かれると罵倒くりかえして」
そして>>54のようなレスを書くとw
つくづくお前ってやつわwww笑えすぎだろう >>43
ちゃんと書いてやっても、どうせおまえは読めないやん?w
中途半端なCとアセンブリの知識を、シェルスクリプトにムリヤリ適用すんのはアホすぎやぞ! >>55
アセンブリとか急に言い出したからな
自分でわけわからんこと急に言い出しておいて、思いついたように俺が言ったフレーズを真似てるようなこと言って...としか思えんぞ。しかもお前だからなw >>57
>ちゃんと書いてやっても、どうせおまえは読めないやん?
そう思う俺以外のが居て嬉しいぞww >>58
俺がお前と似たフレーズを使うのは、お前に
わかるようにわざわざ似せてるからだよw
そんなこともわからないのかよw
>>57
だから、できるならやってみせろよw
おまえが何書いたっていうんだwスネオみたいなやつだなw >>8
お前本当にわかってないのかw
C言語のifは真偽値を判断するもので
シェルスクリプトのifは終了ステータスを判断するものなの
C言語のreturnは戻り値を返すもので
シェルスクリプトのreturnは終了ステータスを返すものなの
C言語でもmain(コマンド)のreturnは正常時に0を返さないのいけないの
シェルスクリプトはすべての関数がコマンドと同じ扱いだから正常時に0を返すの
理解できたか? >>60
また誤魔化しだな
マジでそうだったのかww
お前が無能としか思えんけどな。そして可哀想にとしか思えんけどな >>61
お前本当にわかってないのかw
C言語のreturnの戻り値ってのはifで判断されることは
理解してないの?w
一体、何を理解しろ、と?w >>62
ごまかしてんのはお前でしょw
逃げて罵倒するだけしかしてないお前のようなのを
無能、と呼ぶんじゃないかなあ?w >>64
お前はすげえなああ
>逃げて罵倒するだけしかしてない
自分ではしてないつもりらしいww
すげえよお前www大笑いさせる才能あるぞw >>65
俺がどこで逃げてんの?w
馬鹿も休み休み言えよw >>66
マジか...www
そりゃそうだないい負けたくないんだろ?www故にそんなこと言えてしまうとしか思えん
天才的爆笑王の称号をあげたいw >>67
マジか...www
そりゃそうだないい負けたくないんだろ?www故にそんなこと言えてしまうとしか思えん
天才的爆笑王の称号をあげたいw まあ、馬鹿を相手にしても不毛だから、ほっとくとして。
結局、俺が言いたかったのは>>10だけね。
(ID:h64P2lE5にはどうせ聞いても無駄だからほっといて)、
なんか異議あるかい?w >>70
>>11,12と既に書いてるw
まあ、結局読めないんだからなあ
読んでくれてると思うお前以外は、たぶん
少なくともお二人から何か言われては居ないからなw >>71
そう書くんだろうと思ったからお前には聞かない
って言ってんだろ。日本語読めないのか、お前は。 >>72
www
お前はつくづくwww
さすが天才的爆笑王、期待を裏切らない >>73
本当に日本語が読めないんだねw
どうしても構ってもらえないといやなのかw
君も>>10が正しい、と認めてるって解釈していいかい?w
間違っている、というのなら、まずは、簡潔にどこそこがおかしい、
と書いてくれる?w >>74
日本語読めない=俺の言う通りにしない/ならない
でしかないくせにwwwさすが天才的爆笑王
>>11,12で否定してるんだが。そもそも>>10はモロ馬鹿なことを言ってるんだけど
>それがexit statusであるかとかは全く関係がない
>>11,12でその間違いを指摘してるんだけど、読めない読まないんだからなあ >>75
>>10に関しては関係がないなw
別にそれに縛られなきゃならない理由はないだろw
ただ単にその方が都合がいいから、そうしてるだけだからなw
それを持って、>>10を間違いと言うのなら、そりゃお前の思考方法
が間違ってるよw ID:h64P2lE5は日本語がじゃなくて、考えるのが苦手なんだねw
よくわかったよw >>76
「それに縛られる」の「それ」ってなに?
exit status のこと?だったら縛られる、というか前提にするに決まってる
シェルスクリプトおよびCがどういう経緯で作られたのか知らんのか
(JCLもその流れのうちに入るだろうという話なんだが、わかってなさげだしな) >>77
また出たよww
よく言うよwwww大笑いさせすぎ。さすがだぜ天才的爆笑王 >>70
「式」でイキんな!ってゆうたやろ!
何回言わすんや!
アホなん?
>>60
前スレからずぅっと教えたってんのに。。。
アホなん? >>63
> 一体、何を理解しろ、と?w
C言語のreturnじゃなくて
シェルスクリプトのreturnを理解しろと言ってる >>78
前提にするのが決まっていようがなんだろうが、そうでなきゃならん理由はないだろw
そして、0を真とするのがプログラミング言語として特殊なことも間違いないなw
それとも0を真とするのは多数派である、と強弁するのか?w
そして、Cは0は偽だよw >>81
そこに反応するんじゃなくて、指摘されたところに
ちゃんと返したら?w
一体なんなんだろうねえ、この連中はw >>78
> シェルスクリプトおよびCがどういう経緯で作られたのか知らんのか
シェルスクリプトはC言語から置き換えるために作られた
Unix哲学にはシェルスクリプトの方が移植性が高いとい書いてる
C言語は移植性がないから使い物にならない
Unix哲学ではシェルスクリプトをC言語に書き直すなって書いてある
つまりC言語からシェルスクリプトに書き直すために作られたものだ
シェルスクリプトはどこでも動く!シェルスクリプトで何でも出来る!
POSIX原理主義を信仰せよ! >>82
>前提にするのが決まっていようがなんだろうが、そうでなきゃならん理由はないだろ
むちゃくちゃ言い出しましたーーーwww
あれか?シェルスクリプトってUnixが出る前から何らかの構想があったとでも思い込んでるのかな??
>そして、0を真とするのがプログラミング言語として特殊なことも間違いないなw
だーかーらーーー、真偽に(それもその値に)拘るなら、暗黙的に == 0 が付いてると思えばいいだろw
やっぱりすごいな天才的爆笑王 >>83
>この連中はw
自分一人が正しいとそこまで言い張るのか
wwwwwww すごすぎだな天才的爆笑王は。それ以上の称号をあげたいくらい >>85
だーかーらーーー、w
==0が付いていると思えばいいとか知ったことじゃないんだよw
お前がそう思いたければ思えよw勝手にしろよw
シェルスクリプトが0を真とする、というところで他と違う=特殊だと
指摘しただけだw
そもそも、なんだって、お前は俺の先生かなんかみたいにになろうとしてんの?w
いくらなんでも、その思考力じゃ自惚れが過ぎない?w >>87
お前が「言い張って」「拘ってる」ことに対してなのに
本当にお前ってやつはw「知ったことじゃない」だってwww
>お前は俺の先生かなんかみたいにになろうとしてんの?
>いくらなんでも、その思考力じゃ自惚れが過ぎない?w
wwww 妄想すげーーーーーwwwww
マジですげえなああ、本当にww
ちょっと笑い疲れたぞw
大笑いできるけど、ここまで無知を拗らせてこうなるとある意味怖い面もあるな
大笑いから一息ついて、遠目で考えてみるとww >>87
いや、だから0は真じゃなくて偽なんだが?
証拠
if (( 0 )); then
echo 真
else
echo 偽
fi
偽 コピペしやすいように一行にしてやる
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
真 >>89
標準的な話だから
その「オレオレ」はそうなんだろ >>91
オレオレって何?
殆どのシェルがこういう動きをするんだが? >>88
お前は本当につまらんね。
結局、核心をつかれるとまた罵倒して逃げるだけ。
なんだか九官鳥かなんかと会話している気がしてきたわ。
で、じゃ、いいよな。
シェルスクリプトは真偽の判定において、0を真とする、という点に
おいて特殊である。
これは真である、ということで。 >>94
また「核心をつかれると」だって
何言ってるんだかwそれこそ自惚れだぞwwwmまあ、目も当てられない自惚れすぎは>>83の最後とかも明らかで、無自覚なんだろうけど
馬鹿馬鹿しい、また、何をまた変なことを急にって話でしかないからなんだが
さすがだな本当にw >>89
え?w
それはちょっと汚なくないかね?w
それはbashの拡張だろうw
シェルスクリプトと言ってるのに、それはずるいw
ま、面白い反論ではあるとは思うよw
>>90みたいなことをやらなければ、もうすこし相手してもいいんだけどね。 >>95
すまん、>>2の方だった
それも読んでだったら、そういう「オレオレ」でしかな >>97
> それはbashの拡張だろうw
ちがう、kshの拡張
ほとんどシェルはkshをパクってるからほとんどのシェルで動く
これがシェルスクリプトの仕様と言っても過言じゃないよ >>99
kshかwまだIBMは使ってんだろうなあw
ま、それはそれとしても、
過言じゃない、と言っても、それを
シェルスクリプトの仕様だ、と強弁するのは
おかしいだろw >>99
言うなら 次世代シェルスクリプト だな。もちろん未だにそんなのない
if command;
の話をしてるんだから、関係ないよ
この形式は後も残るし、その拡張とは別の話をしてるんだし 結局、lD:h64P2lE5人の発言にただケチをつけて大物ぶりたがるだけの
ネットチンピラだった、ということでいいよな?w じゃあ (( 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
真
あれれー?全部真じゃねーか。
どう説明してくれるのかな? >>102
「ケチをつけて」だってww
「大物ぶりたがる」だってwwwww
お前の勝手な受け取りでしかないな
もう、本当に、お前はwwwwwww やっぱりもっと上の称号を上げたいとは思ってしまう >>104
だって、お前、結局、一つも俺の発言の間違いを
指摘できなかったじゃんw
それは客観的な事実でしょw >>103
testコマンドの結果(testコマンドが終わるときのExit Statusの値)でしかない
testコマンドに何故なのか書いてあるだろう
シェルスクリプトの話ではない=シェルはそれに関係してないよ >>105
さすがwwwwすげえええwwww
まだそんなこと「言い張る」のなww
客観的な事実wwwwwwwww
すげえなあ、本当に、マジでマジで >>107
なに、とうとう宗旨替え?w
こっそりと紛れようと?w
ま、なんつーか、もうすこし謙虚さをみにつけなさい。
そうしたら、コンピュータやプログラミング言語も理解
できるようになるよw >>103,107
string True if string is not the null string.
これだな
>あれれー?全部真じゃねーか。
>どう説明してくれるのかな?
わかったならもう出る必要ないぞ >>106
やりなおしじゃねーよ。
重要なことだろ
お前が言ってる真とか偽の話は、testコマンドの話であって
シェルスクリプトと関係ねーんだよ
if [ 0 ]; then echo 真; else echo 偽; fi
真
if [ 1 ]; then echo 真; else echo 偽; fi
真
両方が真になる理由を言ってみろ
testコマンドの仕様じゃねーか >>109
またイミフなことを言い出すwww
妄想しすぎだぞw >>110
それはシェルスクリプトじゃなくて
testコマンドの仕様です 一方こっちはPOSIXシェルじゃないってだけで
シェルスクリプト仕様なんだわ
if (( 0 )); then echo 真; else echo 偽; fi
偽
if (( 1 )); then echo 真; else echo 偽; fi
真
((コマンドなんてないからな >>111
シェルスクリプトの仕様の話であって、
testコマンドの仕様の話じゃないよ。
そんなこともわかんねーの?
つまんないやつ。
じゃあ、もういいから出てくんなよ。 >>111
お前もどうだかと思うがw、ヤツはもっとだぞ
どうすんの?やめといたほうがいいと思うぞw 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
真 >>113
やっぱりお前もだなあ、>>107と言ってるのに、そのレスは無いな
>>114とかID:FcrICImtとその思考/レス態度が似すぎw >>117
>>107のtestをexprに置き換えておしまいw >>118
無礼だなあw
態度と思考はお前が最悪だろうにw
謙虚に、と言っただろ?w
そういうことやってるとまた間違えて恥を晒すことになるぞ?w >>120
>>106とか新人wに返してるくせに
よく言うよw本当にお前ってやつはwwww >>119
何がいいたいのか知らんが、testは0も1も真、空文字は偽 >>122
test の 0 も 1 も文字でしかないからな、そういう「testコマンド[の]」
exprもtestを置き換えれば同じ話 >>123
ほら、言ったそばからこれだよ…
謙虚に、っていったろ?
exprの終了コードは特殊なんだよ。
わからないことはわからないとまず認めること。
テキトーこいてごまかそうなんて一番ダメだ。 >>125
「特殊」=「exprコマンド[の]」
本当にお前は読めないやつだな
何が「謙虚に」だよ、お前こそ謙虚に読みやがれよw >>126
まちがったことにすらも気付いてないのかw
もうつける薬もないなw >>127
お前こそお前が言った「ケチつけて」でばっかというのが気づかないんだなあ
>>11,12をちゃんと謙虚に読めよw
その流れのうちの話でしかないからな
それも読まない/読めないくてだからなあ、言っても「全く」わからないんだろうけど >>124
見る価値はないぞ
俺共々アポーンでどうぞw >>128
だからちゃんと自分のレスを読み返してねw
間違ってるぞw
testとexprの終了コードは同じじゃないぞw
もう面倒だから、これ以上の指摘もしないけど。
つか、このスレこんな自称「プロ」みたいのが常駐してんの?w
うへぇw >>130
...すんげー読めなさぶりを発揮してくれちゃってもうwwwww
本当にお前はwww
誰も評価が同じとは言ってない。そこかよwww
exprだろうがtestだろうがコマンド[の](独自とか独特とか何でもいいけどそんなん)でしかないと読めると思ったんだがなあ
[の]の後に何が続くかも読めないのか...何が続くと思ったのだろう?いや続くとは思わなかったのか??不思議だなあ
(
日本語日本語とお前は言ってるが、日本語小説読めないぞそんなんじゃ。読まない読めないのか?) >>131
うん、少しわかったw君は日本語が書けないんだね?w
日本語ができないのかwまずそこから勉強しようねw >>132
お前にもわかるような教科書や参考書のような日本語は面倒で書くわけがないわな
お前が望んでるのはそんなのだなw >>133
なるほどね。
だから、俺の書いてあることがよくわからなくて、
いちゃもんつけて絡んできたわけか。
最低だな。まさにネットチンピラだねw >>134
wwwwww
何で「だから〜」になるやねんwwwww
さすがだなあ
お前が読めない読まないくせに。俺だけじゃないらしいぞお前のそういう評価はw
それを踏まえての>>133なんだが、何故その理解になるんだか、七不思議
まあ、それもお前は自分の言ってることが正しいとお前だけ言い張るからだろうけど >>134
華麗にスルーされたけどさ、
前スレ>>989なんて言ってるけど、確かにWindows APIはBooleanで返すのが多い
だがそれはWindows APIの文化でしかない、シェルスクリプトの本家wであるUnixで何か書いたことがあるなら文化が違うとわかりそうなもんだが、なぜかWindows APIのが全てと言ってそうな前スレ>>989
WSLからのにわかか?
って、合ってる?w
あと、宮城県に住んでいたりする?w
日付も変わるし、>>11,12以降何も意味あることないからw(互いになww)、もう締めようかと
で、>>12での俺の疑問と、後はなんかソレっぽい(まあ、無いと思うけど)確認したいんだけどw とうとう変なゲスの勘繰りまで始めた…w
いや、読めんよ、これはw本当にw
もしかして、頭がおかしいのだろうかね… >>137
「ゲスの勘ぐり」wwww
散々してる、お前が言うなーーーーーーーwwwww
すげえなあ
ちゃんと理由書いてるからな、最初のは
後のは特定w有名人に似すすぎてな、その自己完結して他の人の指摘を聞き入れない頑固さ自己防衛意識wだけなのは え?俺がゲスの勘繰り?
一体なんのことだよw
完全に狂人だなw さすがにID:h64P2lE5みたいなのと会話するのはちょっと神ならぬ我が身では無理、
だな。
犬に噛まれたと思って諦めるよ >>139
すげえよww(マジ似すぎwwww)
俺に対して「こうじゃないか」とお前は散々言っているんだがな、根拠全くなく(=外れてるから)
いや、お前のは「こうだ」と決めつけてるけどな。俺はお伺いしてるんだから謙虚wwだろう?w >>140
だから、その独善っぷりがなあ、似すぎなんだよwww YESかNOで済む話なのに、何で答えるのに拘るのか
別にNOでもそれ以上突っ込むことは無いのに
まあ、なんかわけわからんプライドからだったりするんだろうな
NOすら貰えなくて残念だったわ
じゃあ、また会おうw >>135
> 俺だけじゃないらしいぞお前のそういう評価はw
なにいうてんねん、イキりをイジりはじめたんはワイのが先やろ?w
前スレ>>984もワイやし、前スレ>>897からの付き合いや!
て、あれ?
もう終わったん? >>144
>なにいうてんねん、イキりをイジりはじめたんはワイのが先やろ?w
w 先かもしれないなあ、いや先だろな
別に俺が言い始めたとは言ってないから勘弁してくれw
>前スレ>>984もワイやし
あ...>>989 の間違いだった(趣旨がトンチンカンの>>982のに「まあ、これなんだよね(笑)」と同意してる)
誠にすまんことです
繰り返したぶん、 ID:FcrICImt にもすまん >>145
なんか居たなw
赤の他人が悪絡みwのネタになるとでも思ってだろうとスルー >>147,144
>あ...>>989 の間違いだった(趣旨がトンチンカンの>>982のに「まあ、これなんだよね(笑)」と同意してる)
>誠にすまんことです
>繰り返したぶん、 ID:FcrICImt にもすまん
あ...>>12,136 で間違ってるのかと思った。間違ってないな、勘違いだった、どうかここは無かったことに
>前スレ>>984もワイやし
あくまでも「なにいうてんねん、イキりをイジりはじめたんはワイのが先やろ?w」の拘りかっw勘弁してくれ、そのノリは一瞥にはわからんw レスバ乙。
最後に俺がまとめてやんよ。
終了ステータス0を真と見なすのはifコマンドの仕様です。
これでスッキリするな。 >>150
while
until
&&
||
も まだやってたのか
>シェルスクリプトだけじゃなくてC言語も成功は0を返さないとだめだって言ってんだろ
仕様書嫁 >>10
判ってる人間は「負論理」で済むはずなんだよな
結局「仕様書嫁」としか言い様が無い
1が真でも
0が真でも
どっちでも良いんだよ >>12
Windows API は Boolean を返す関数が 0/1 以外に負の数を返したり普通にあるからな どっちもどっち
ここまでコミュ力低いやつらはリアルで見たことないわ
運がいいのかこいつらがよほど特殊なのか >>150
それやと、また真偽バカを召喚しちゃうやろ!w
if節の終了ステータスが0のときにthen節を、そうでないときにelse節を実行する、と実際の挙動のみをいえばよい。 >>154
正論理負論理は、2値の場合に使う考えかた。
整数についてはふつう言わない。
知ってる理屈をほかにムリヤリ適用すな! >>156
そういうのは初期の残念APIだから。。。
許してやろうや。。。 >>159
FORTRANの時代から算術IFというのがあった
分岐節が3つあって負、0、正の場合分け >>160
残念じゃなくてadhocなtype liftingなだけだ
Cのポインタ返す関数がNULL返すのと同じ考え方 >>161
知らんがな。関係あらへん。w
まあ、分岐の話をするんなら、CPUからやな。
ゼロフラグとキャリーフラグで3分岐できるもんやし。 >>162
理解力ないんか。。。
中盤以降は、そういうAPIはないやろ。
タイプセーフも強まっていったから、昔の挙げ足はええやろ、というとるんや。 >>165
すでに終わってるのに無理に絡むおまえのがキモいぞ シェルスクリプト使いにとってキモいは褒め言葉。
つか何でposixに終了ステータス0はtrue、1はfalseって書いてあんのに揉めてるの? >>167
どこに書いてあるかを言わないからだろ
お前が揉める原因なんだよ
いい加減嘘ついてあらすのはやめろ 127 や 126、1 から 125 にとは書いてるから >>167は明らかに嘘だな >>168
終了ステータスは、
trueは0、falseは1は正しいが
0はtrue、1はfalseは正しくない
というのがわからない残念な人なんだろう このようにどこに書いてあるのかを言えという
当たり前の質問にも答えられないわけですよ(笑) >>171
えと、本気で理解できないんだが詳しく教えてもらえないでしょうか。 >>173
その本のどこに書いてあるかを聞いてるんだが
理解してないの? いや、>>171はたしかにおかしいな。w
反対や。
0はtrue、1はfalse(と評価されること)は正しいが、
trueは0、falseは1(の値をあらわすこと)は正しくない。 >>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
理解しました。 >>178
testコマンドの部分は
引数で渡された式が真ならtestコマンドは0を返す(以下略
と書いてあるだけじゃん
真というのはtestコマンドのテスト式内の話 >>171
>trueは0、falseは1は正しい
>0はtrue、1はfalseは正しくない
ここだけ読むとイミフ >>171
>>177
どちらも可笑しい
仕様書に描いてあることが正しいのであって
おまえの意見はどうでもいい >>177
ture/false コマンドに(Exit Status) 0 および1を返すと書いてある
testコマンドに評価としてtrueとは書いてあるが、それは評価としてでその値が1なのか0なのかというのではないという理解だけど
POSIXに書いてあるという話なら ぱっと流れを見てきただけだが、
[]/test コマンドの評価が真で0を返すってところからはじまって、
他のコマンドの返り値もこれにならって処理成功で0を返すようになったというだけじゃないの?
これをもって終了ステータス0が真を意味するってわけじゃないよねぇ
日本語と英語で、否定文に対する同意にyes/noが反対になるのと似てると思う
前者は否定文それ自体、後者は事象全体について、それぞれ評価してるよね >>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(の値をあらわすこと)は正しくない」と同じ意味だわな >>183
>[]/test コマンドの評価が真で0を返すってところからはじまって、
>他のコマンドの返り値もこれにならって処理成功で0を返すようになったというだけじゃないの?
Unixで動くプログラムはExit Statusが問題なければ 0、問題あればそれ以外というとこからはじまってかな。testコマンドもそれに合わせてのような
Unixを作る上でのOSのUnixとしてのExit Statusとはどういうものかというのは最も先に考えるだろうから、そこからはじまってかな いまでも 0〜255 なんですか
256 以上とか
0 未満とか
ありえないんですか? 8ビットいっぱいでの値(=unsigned char)となってるね、POSIXでは
int main( ... ) だから、失敗なんぞで -1 をreturn できる(エラーにはならない)が、255になったりするねえ ん?まさか、trueコマンドとfalseコマンドを
真偽値のtrue/falseのことだって勘違いしてる?
いやそんなアホはいないよねw
終了ステータスは数値であって
true/falseじゃないよ
はっきりした ただの独りよがり、マウントだけは取りたがり
まあわかったようなのでいいけど >>183
終了ステータスは昔から0が正常終了、それ以外が異常終了という意味
シェルスクリプトのifは正常終了の場合にthenの中身を実行する
それだけの話なのに真とか偽とか、trueとかfalseとか
言ってるやつがいるだけ
trueコマンドは正常終了を返す
fasleコマンドは異常終了を返す
ifは正常終了か異常終了かで処理を分岐させるもので
真か偽かで処理を分岐させるものではない なにか必死感
>>175なんて平気で偉そうに自分で調べる探すことはできないくせに
まあこれ以上イジルのは止めようw 誰とは言わんがw某君は自分で調べることも探すこともできないは明らかだが、
そこからくる無知がコンプレックスからなんだろうなその常時上から目線すぐに誤魔化す癖なのは
と思われるw >>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が使われている。
あなたの言いたい事は分かる、というかみんなわかってる。ただ、昔からの習慣をぶった切って何が得なのか分からない。 「条件が真」というのは真偽値とは別の話だよ
条件とセットになってないといけない
何が真かどうかは条件文つまりコマンドによって変わる
値だけをみて真かどうかなんてわからない 例えばexprという条件文は、1(0以外)が真で、0が偽
testという条件文は、文字列の長さがあれば真で、空文字なら偽
だからtestの場合は0も1も真だし、testの演算子を使えば、それに応じて結果も変わる
どの値が真か偽かなんてわからない
少なくともexprでは0は偽 >>195-196
つまりスクリプトの文脈や使うコマンドに依存するって事ですよね。それは誰でも知っている。
全てに共通では無いからと言ってif文の話の時ですらtrue falseと言う言い方、表現を認めないと言うのはそれこそ文脈無視。何でそこまでtrue falseを否定するの? >>190で完全におわってるんだけど何が不満なんだよw >>197
お前がレスしてくるから、返してるだけやで
何が不満なんだよ?
俺も聞きたいわw >ifは正常終了か異常終了かで処理を分岐させるもので
>真か偽かで処理を分岐させるものではない
そこが普通のプログラミング言語と違うから
混乱することあるよねって話だったんじゃ? >>200
混乱するよな、だったら、そうやな、で終わってた。
ところが、混乱した頭でムリヤリ合理化して、シェルスクリプトとC言語に真偽を融合した大統一理論wを主張されたら、そりゃあ黙ってはおれん。
いや、スルーしてもええんやけど、イジったらおもろいやん? >>184
コマンドの話やったらちゃんと「trueコマンド」って書かんと。
真偽値の話もあるところに単独で「true」とあったら、かならずしもコマンドのことやとは思わんやろ。。。
>>188
誤解のない文章を書けるようになれよ?
クソ文を読めない人間の悪口なんか言わんと。 >>202
元々に合わせてのなんだけどな
基本的に元のレスに合わせる感じ、なんか断定的に書いてたりしたら、ひとりごちでわかったように書いてたらw
(true/falseってコマンドが真っ先にじゃね?wともあってなあ。シェルスクリプトでtrue/false書くのはコマンドのだし) >真っ先にじゃね?wともあってなあ
真っ先にじゃね?wともあってなあ、「わかるだろ」と親切心w皆無(何故かは書いた通りw)なこともあり
てことね >>206
ごめんなさい、fi です。
whileの説明も書き写していたけど長いと思って削除したんですが、その時のミスです。 >>200
Ifに関しては普通のプログラムも真かそれ以外かだと思うけど。 >>208
失礼、プログラムじゃなくてプログラミング言語 >>208
>真かそれ以外か
そこに疑問を持った方がいいぞ。真か偽かと書けない時点で >>208
何が真/偽と評価されるかの話に、抽象化された一般論で割り込むな。 >>208
普通のプログラム言語は式が真かそれ以外と評価される
シェルスクリプトはコマンドの実行結果が真かそれ以外と評価される
例えば C言語で if (foo(0)) { ... } とあったとき、
0は真だと思うかね?偽だと思うかね?
それと同じことだよ Mb
>プログラミング言語どころかコンピュータのことすら
理解していない奴が荒らしにきているわけだ。
初心者はもちろん歓迎するのだが、
邪魔する奴は全力でツブす
という、怖ろしい連中がいることを肝に銘じてほしい。」 ! [ -n 'これ?' ]
[ ! -n 'それともこれ?' ] 好きにだな
シェルがやる(汎用)のかコマンドがやる(独自)のかの違い
得られるのは同じ >>220
論理反転できるコマンドなんかあるんか?
gitコマンドとかで shでmain関数を定義して
ループ内で main & すればサブプロセスで動いてくれてechoしたときの出力も全部表示されるやん?
powershellで同じことしたいのにできひんねんけど誰か教えてくれ >>223
Win32コンソールAPIの制限じゃなかったかな
WindowsのAPIのスレで聞くといいと思う cshの書籍って何がおすすめですか。
すごく初心者です。 初心者は、cshなんか使わないほうが?
BashかPerlのほうが! すごく初心者はいきなりcshとかやらずに
コンピュータの仕組みを理解するのが先だと思う ありがとうございます。
linuxは業務で触っていて
基本的なコマンドは知っています。
苦手ではありますが。
ハード屋なのですが
c言語、matlab、vba辺りの
コードは書いていました。
会社のメンバーが
cshで実行するスクリプトを
多用していて理解したり
自分で書いたりする必要が
発生しました。 >>229
メンバーに、Cshからの離脱を提案するべき!w >>232
まさにそれ
>>229
そいつのオナニーをやめさせるべき cshスクリプトの中からbashを呼び出せば問題解決だよ! >>230
まさに20代の時にcsh多用してた
今じゃ csh ってまだあったの?という感じだが 40代だけど、Solarisでtcshがログインシェルだったなあ
作業手順書作って、承認受けてから変更作業するタイプのしごとしてて、
ワンライナースクリプトをcshrcに書いてた記憶がある。
帰ったらその頃の資料探してみる
独立したshell scriptを書くには向かないのは同意 Bsh系も、testコマンドのオプション扱いじゃなく、
直感的な == < > <= >= != を使いたいと思うことがある
普段他の言語を書いてて、たまにshを使おうとするといつも一瞬考えてしまう
Bashだと = のかわりに == が使えるけど、後は駄目だもんな
= もスペースのあるなしで代入と区別するなんてこと忘れてて悩むことしばし >>277
コマンドを使わずにシェルの文法を使えばいいだけ
if ((0<10)); then
echo ok
fi >>236
使ってた本は
技術評論社のThe UNIX Surper Text 上
で、
第29章 csh プログラミング
だと思う。
ほかはmanとwebの情報でやってたはず。
csh系はたとえシングルクォートの中でも!はエスケープしないといけないのが注意点かな。
変数の中に入れるときにエスケープはいつでも必須で、
それを使うときにヒストリ置換するならそのままつかい、ヒストリ置換せずに使うなら再度エスケープがいる。
あとは慣れだと思う。
リダイレクト関連はcshだと実現できないことがあったはずで、
それはcshからperl呼んで実質perlスクリプトになってたはず。 >>240
それで思い出したけどcshでシングルクォートだかダブルクォートだか
変数に入れることって出来る?
前に挑戦して挫折したことがあるんだが >>241
シングルクォートを入れたければ、ダブルクォートでくくる。
ダブルクォートを入れたければシングルクォートでくくる。
set hensu="single ' double "'"'" hogehoge"
古いbshもこの方式が必要だったはず。 あれ?できるね?なにで引っかかったんだっけか?
改行文字だったかな?
入れること自体はできるけど、それを使おうとすると
Unmatchedが表示されない?
改行+クォートの場合だけ?
どうも仕様がよくわからん 昔に何故cshでshell scriptを書くべきでないかという英語文書があって日本語訳もあった
調べたい人は自分で調べてくれ cshの問題点
> 4. クオート
> csh ではまともにクオートをすることができません。
これか
> 改行をクオートするためにはバックスラッシュを使う必要があり、文字列に含
> めるのは本当に難しいことです。
難しいのか不可能なのかはっきりしてほしいな
不可能なんじゃないのか? えー。うそー。そんなの簡単じゃん。
% set s = "abc\
def"
% echo "$s"
Unmatched ".
ひでぶっ 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
って感じで使ってた 例の大学で教授やってるやつ、どうどう利用規約違反してたことを
宣言しててこいつやばくね?わかってないのかね?
リッチー大佐の中の人
https://twitter.com/col_richie/status/1460830111939186689
> Twitter API v2は、収集可能なツイート数の制限が無料プランでも月200万ツイートに緩和される、
> とアナウンスされたのだが、我らのTwitterアプリ「小鳥男」なら、とっくの昔から、
> 理論上432万ツイートを1日で(1秒あたり50)収集する能力を持っているぞ。
https://twitter.com/5chan_nel (5ch newer account) 例えて言うのなら、
1ヶ月30GBまで使えるように緩和されます
↓
とっくの昔から理論上一日で30GB使い切るアプリを持っているぞ!
何を自慢しているのかわからないなw
そんなのどんなアプリだって使い切る能力ぐらい持ってるでしょ
432万ツイートを収集できる能力のどこが「とっくの昔から能力を持ってるぞ」と
自慢するようなないようなのかわからん むしろ1秒あたり50ツイートって遅くね?
1ツイートあたり 280文字?として多めに見積もって1ツイート1KB
つまり50KB/sでしょ?
Twitter側の帯域制限があるのだろうと思うけど
別に自慢できる量じゃないなぁ
そもそも通信速度とサーバーの負荷に依存する話なので
たかがクライアントアプリを自慢するようなもんじゃない 全ての事をシェルスクリプトで実現可能だと信じる者にとっては、この世の全てはシェルスクリプトの話になる。 すみません、質問です。
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を実行する形になりますでしょうか。
お手数おかけして恐縮ですが、教えていただければ幸いです。 コマンド呼び出しは、 `〜`, $(〜)
〜の所に、/usr/bin/python /usr/local/bin/piyo/piyopiyo.py
を書けばよい
python で、スクリプトファイルを実行する リッチー大佐ヤケドしすぎててワロタw
あの2人、終始レッテル貼りと揚げ足取りばっかりで終わってるな ガチでヌーブなんですけどrequestsとbeautifulsoupでスクレイピングやってます
waitかけないとバンされるよと言われましたがどうすればいいですか?
requests.get()でtimeoutは今書きましたがforで同じサイトの似たようなページに何度もアクセスするのでサーバーへの負荷はすごいと思います
これに対してどうすればいいですか? シェルスクリプトの話題ではないので、他のスレへ書き込んでください! すみません、質問です。
cp -f dir1/file dir2 を実行し、もし失敗したとき、
echo File copy failure >> log
を実行させる処理はどのようにすればよいですか? シェルスクリプト if文
でググると最初の方にあるのは、[ ] (test) ありきで、
評価するのは 条件式 と他の言語と同じような説明してるのなんだな 一定時間ごとにechoするスクリプトがあります
プロセスっていうのでしょうか、
そのechoされたものを動的に取得し
別のスクリプトに渡したいのですがどうやればいいのでしょうか
【sample1.sh】
echo aaa
sleep 3
echo bbb
【sample2.sh】
echo $1
$ bash sample1.sh & sleep 5 && bash sample2.sh
このコードになんらかを加えてsample2にbbbを渡せたらな、
というのを期待しています 補足 >>271
実際はsample1.shの部分はサードパーティな他のスクリプトで
そのプロセスが走ってる感じです
具体的にはbash sample1.shの部分は
npm localtunnel --port 8010
です。
これが途中で your url is https://○○
みたいな表示が出てくるのですが
そのhttps://○○をsample2.shで受け取りたいのです。 訂正 >>272 npmじゃなく
npx localtunnel --port 8010
でした。 # コマンドの実行履歴を出力する
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 $?. >>271
プロセスの標準出力・エラーを、tee とかでファイルへリダイレクトして、
そのファイルを、tail とかで読み込めば?
単純に、パイプでつないでも出来るかな?
分からないけど >>275
おおそんな便利なコマンドがあったんですね
$bash sample1.sh | tee result.txt & sleep 5 && bash sample2.sh
でsample2内で取得できましたありがとうございます
ゴテゴテですが一応やりたかったことはできました
https://colab.research.google.com/drive/1nHbgd_KRiSF3uoaRKsM8shhMqFrI6PB0 for ((i=0; i < 10; i++)) {
...
}
風
i=-1; while : $((i+=1)); [ $i -lt 10 ]; do
...
done >>271 mkfifoで名前付きパイプを使ってもいいと思った
取りこぼしが無いよう、先にパイプを作る必要はあるが
mkfifo pipe
sample2.sh < pipe &
sample.sh > pipe &
fg %-
みたいな sample2の引数にsample1を取って中で実行させるんじゃ駄目なの? >>279
終わった話に、あやしいやりかたの提案。w >>274
無駄な書き方だからでは?
警告通りに if mycmd ... の形式を使うわけには行かないのか? >>271
expect コマンドを使うと複雑な事も出来ると思う。 >>274
普通はファイルが存在するならコマンドを実行する、と書くし、非存在時のechoコマンドの
出力先が標準出力な点も気になる(標準エラー出力であるべき)。また、catコマンド実行時に
ファイルが見つからなければ、"そのようなファイルやディレクトリはありません"とコマンド
自体が(標準エラー出力に)メッセージを出すので、重複した記述でもある。 > 普通はファイルが存在するならコマンドを実行する、と書くし、
書かねーよ。
ファイルが存在すると判断した後の消されたどうすんだ
シェルスクリプト業界って素人が多いのか? ファイルが存在すると判断した後に消されたどうすんだ シェルスクリプト業界だろ?w
シェルスクリプトばーっかりやってる
シェルスクリプト最強って言ってるアホ会社ども >>284
どうせエラーになるから、問題ないやろ。
まあ、「業界」wではありがち。 どうせエラー出て失敗するんだからやり直せばいいだけのことなのに
あらゆる可能性を想定して滅多に使われない機能まで組み込んで肥大化する方があるある 問題点に対するソリューションのご提案。
・ファイルロックを取得してから操作します。
・ファイルロックを取得できなかった場合、
1.他のプロセスが既に取得している。
2.ファイルが存在しない。
・以上を確認します。 >>288
> 普通はファイルが存在するならコマンドを実行する、と書くし、
これがだめなやり方だって話をシてるんだが理解してる? テキストの入力、加工、出力以外の処理を無理に書くべきじゃない
それ以上のことがやりたくなったら別の言語使った方が楽 シェルスクリプトでcpやrmを実行するなとか言ってんの?
アホじゃね?
お前シェルスクリプトの使い方を間違ってるよ
むしろテキストの加工ならなんの言語でやってもいい どこの会社でもやたら批判的な発言をするものの具体的な答えは何も示さず
相手が何を言い返しても分かった風の立場で「それは違う」と上から目線で言い続けるだけのマシーンっているよね
一言目から答え出しておけば無駄な会話もなくなるのに 変な会社に勤めてるんだな
自分の特殊な環境なのに全体にするとか
ネットによく居るタイプだな cpもmvも処理の途中でやるもんじゃないよ。出力とみなして最後にやりなよ ファイルをロックしてまで、やっているスクリプトは珍しい
普通は、ファイルが存在しなければ、そこでエラーになるだけ シェルスクリプトには真のファイルロックなんてない
ロックファイルを作ってごまかしてるだけ
だからその状態で電源OFFとかエラーで強制終了すると
中途半端にファイルが残ってトラブルになる そもそもファイルをロックするなんて出た時点で
シェルスクリプトを使うのは間違ってる
データベースを使えばいい >>304
しょせんアドバイザリやろ?
たいして役にたたん。 >>306
オタク同士のなれ合いみたいなモノで、
DQNですらない陽キャ相手に崩壊するレベルだよ? name=value
: $(($name = 123))
echo $value
これってPOSIX準拠? bc使わないで小数の比較演算ってできますか?
RHEL8.0環境で何もインストールしてはいけません縛りの環境を渡されてbc入ってなくて詰んでます。 PerlかPythonははいってんじゃないの?
dnf(yum)用とかで。 確かに
pythonで計算することにします
ありがとうございました >>311
何もインストールできないせいで、生産性が下がっていますって
言わないとあとで苦労する
生産性が下がっている原因を、くだらない決まりを作ったやつに押し付けろ >>313
何そのレス
>>2にあるURLのこ見やがれ プログラミング言語を使わずに計算することを考える時点で、既におかしい >>316
>>2のURLのどこにも書いてないから言ってるんだよ
>>317
言えるやろw まさか「書いてる」という言質が欲しかったわけじゃないよな
言葉使いからは「いつもの」っぽいけど
書いてると言われても見つけられなさそうだな、パターン的には >>318
「比較」やそうやから、「計算」やないんでセーフ。
値とかバージョンとかの比較は、シェルスクリプトでもしたいことはあるやろ。
と書いて、ひとつ思い出した。
>>311
sort --sort numericでいいんでは。 いや、そう使うように書くのはなかなか面倒か。
できなくはないやろけど。w Linuxは一貫としてbcはデフォでは入ってないんだな。なんでだろ
LinuxというかGNUがだろけど POSIXとの互換性、仮にGNU bcでPOSIXのがそのまま動くとしても互換動作モードやドキュメントを書くのが面倒 とかかなと思ったら、
-w, --warn
POSIX bc に対する拡張機能が入力された場合は警告を出します。
-s, --standard
POSIX bc の言語仕様に厳密に従って処理します。
きっちりあるやん。なんでだろ。ナゾい なんか、予告的なアンカーだなw
書いてませんでした と言えるのがイミフ。凄すぎてわからん なるほど、本当にここに書いてあるという主張してるのか
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. 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.
どこにあるのか、言ってみ >>327
そうやって、わざわざ相手にしてちゃんと調べてやる人がおるからやろ。w あ、違うんか。
またいちびっとるとは思わんかった。 英語めないんでしょ?
2.6.4 算術式の展開
算術展開は、算術式を評価してその値を代入するためのメカニズムである。算術展開のフォーマットは以下のとおりです。
$((式))
式は二重引用符で囲まれているかのように扱われますが、式の中の二重引用符は特別に扱われません。シェルは、パラメータの展開、コマンドの置換、
引用符の除去のために、式のすべてのトークンを展開する。
次に、シェルはこれを算術式として扱い、式の値を代入する。算術式は、以下の例外を除き、
「算術の精度と演算」で示された規則に従って処理されなければならない。
符号付き長整数の算術演算のみが必要である。
ISO C規格の6.4.4.1項で規定されている
10進数定数、8進数定数、16進数定数のみを定数として認識する必要があります。
sizeof()演算子、前置および後置の "++"および"--"演算子は必須ではありません。
選択、反復、およびジャンプ文はサポートされていません。
算術式の中の変数に対するすべての変更は、"${x=value}"というパラメータ展開のように、
算術式の展開の後に効力を持つものとします。
シェルの変数xが、有効な整数定数を構成する値を含み、オプションとして先頭に<プラス記号>または
<ハイフン-マイナス>を含む場合、算術展開の"$((x)) "と"$(($x)) "は同じ値を返すものとします。
拡張機能として、シェルはここに挙げた以外の算術式を
認識することができます。シェルは、signed long のランクよりも大きいランクの符号付き整数型を使用することができます。
シェルは、オーバーフローが発生しない場合の結果に影響しない限り、signed long の代わりに real-floating 型を使用してもよい。式が無効な場合、または
式で使用されているシェル変数の内容がシェルによって認識されない場合、展開は失敗し、シェルは失敗を示す診断メッセージを標準エラーに書き込まなければならない。 >>330,331
よく読めよw ちゃんとよく読めよ
>>332
ん? 書いてないものをよく読めっていってごまかしてるのは
自分の間違いを認められないからなのかな? >>334
英語読めない...w
よく言うよ。その日本語でもいいけど、英語の方がわかりやすいと思うぞ
しかも、テキストでなくハイパーテキストの方が だからどこにも書いてないと言ってる
なんで反論してるの? > シェルの変数xが、有効な整数定数を構成する値を含み、オプションとして先頭に<プラス記号>または
> <ハイフン-マイナス>を含む場合、算術展開の"$((x)) "と"$(($x)) "は同じ値を返すものとします。
ここよく読めばわかるが、書いてないと言ってる。
他に言い返す言葉はある? ちなみに確認だが、
>>330,331と出してきた(よく探せて偉いぞw)ってことは、
問題にしてるのは
$(($name = 123))
これ
name = 123
これ
=
これ
ってことでいいんだな?
>>340って、もろPOSIXに準拠してるやんって書いてるとこをわざわざ出してイミフなことからも上記の通りで良さげかな
>>339,340
>>336,338の書いた通り >>342
なんで内容を端折るんだ?
たった3行だろ
全部読めよ
理解してないまま回答してるんだから
そりゃ嘘つき呼ばわりされてもしょうがない
name=value
: $(($name = 123))
echo $value
これってPOSIX準拠? 英語読めない。規格書を読めないって
バカにされていた○○主義者ってのがいたなぁ >>343
だから、それ全部、うん だってw そして書いてあるってw
お前が>>330,331と出してきてるんじゃないか
(またその中からもトンチンカンに一部抽出したりしてw) 書いてないことを自分の都合のいいように解釈して突っ走るところもそっくりだ >>344
いつもの 自己紹介 か...
ほんとすげえなあ、お前はw >>345
だから翻訳しておまえに教えてやっただろ
書いてないと name=value
: $(($name = 123))
echo $value
これよんで、
> 問題にしてるのは
> $(($name = 123))
> これ
> name = 123
> これ
> =
> これ
> ってことでいいんだな?
なんて質問するのも頭が悪い >>346,348
いつもの 誤魔化 しかよ
つくづくだな
お前はどこがPOSIX準拠じゃないと思ってるねん?
name=value
: $(($name = 123))
echo $value
全部か?w >>350
はぁ。説明しないと理解できないのか・・・
POSIXにはname変数の中身が整数定数でないときに
どうなるかの挙動が書いてない
反論はあるか? 英語というか、規格書の読み方をっ勉強したほうがいいぞ >>351,352,353
>POSIXにはname変数の中身が整数定数でないときに
>どうなるかの挙動が書いてない
なに言ってるの? name = 123 この部分だろ?
name変数の中身が整数定数 なんて関係ないぞ
コンピューターサイエンスw的に、型が無い言語なら当たり前的にもな
お前は仕様書、規格書読むのに必要な知識が足りなさすぎだがな、
よく言うよほんと自己紹介好きw > なに言ってるの? name = 123 この部分だろ?
name = 123 と書いたのはおまえ
↓どこにも書いてない。目が悪い?それとも頭?
name=value
: $(($name = 123))
echo $value > If the shell variable x contains a value that forms a valid integer constant,
読めないんだろうなぁ
はい、翻訳
シェルの変数xが、有効な整数定数を構成する値を含み、 $nameをvalueに変えるparameter expansionは最初に行われるでしょ
> The shell shall expand all tokens in the expression for parameter expansion, command substitution, and quote removal.
その後は普通にvalue = 123が実行されるだけ 「その後は普通にvalue = 123が実行されるだけ」と書いていない >>355
じゃあ、お前の言う
>POSIXにはname変数の中身が整数定数でないときに
>どうなるかの挙動が書いてない
ってどこの部分やねん
お前は他人の文の意味を読めなさすぎ、のくせによく言うよを繰り返しすぎだな >>356,358
= の左辺には関係ないとわかりそうなもんだが
というか、そのトンチンカンに取り出した一部ではない全文が何を説明したいのかわかってないだろ
お前は他人の文の意味を読めなさすぎ >>357
先にパラメータ展開が行われるからこれでいいのか
なるほど
> ID:sz49PmUD
あ、きみ、もういらない POSIX準拠じゃないのはこれか
name="1+2"
echo $(( name )) 今までの流れからすればこう書いたほうがいいね
name="var=1+2"
echo $(( name ))
name変数の中身が整数定数でないときに
どうなるかの挙動は書いてない シェルスクリプトで小数演算
dc ではいけないのか? 文字の長さに応じていい感じにタブの個数調整してくれる素敵なワンライナーとかない? ワンライナーじゃなくてコマンドだろ
だいたいタブ個数調整と言われて
仕様がわからないとなんとも言えん >>365
仕様をはっきりさせろ。
簡単にできそうで暇だったら俺が作る。 >>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で分岐させてなんとかしたけどもっと上手いことできるなら頼む >>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以降は揃ってるつもり >>370
スペース区切りの複数単語が1行に入っていて1番目と2番目の間の空白を調整して2番目が全行で同じ位置から始まるようにするってことね。 あ、ちょっと違うか。2番目以降は固定で決まっているから1番目の単語だけ読ませてその後ろのタブを何個付加するかの問題か。 >>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
$ ただし、UTF-8で複数バイト文字混ざりだと画面上の幅とバイト数が一致しなくて失敗する行が出てくるだろうな。 >>377
シェルだけでワンライナーにしろってか?可能な感じはするが、長くなりそうだな。ちょっと君試しに作ってみなよ。 いいかげんワンライナーなんてものからは卒業すべき
あれは実用的ではない だいたい位置揃えならcolumnコマンドを使えばすむ
cat /etc/hosts | column -t columnコマンドなんてあったのな
これしゅごい 第一フィールドは20文字の決め打ちで
awk '{printf "%-20s %s", $1, "IN A 127.0.0.1\n"}' test.lst >>375
酷すぎるwww
>>380
>>385
既存のコマンドでスマートに解決できるのになw columnはPOSIXじゃない!
よってawkで実装しなければいけない! フィルタープログラムはシェルスクリプトには必須だよ >>387
既存のコマンドで丁度良くTAB入れるやつは何てコマンド? >>392
スペースをタブに置き換える unexpand ってコマンドがあるよ!
>>385をちょっと改造、第一フィールドを50文字にしてスペースをタブに変換してみよう
awk '{printf "%-50s %s", $1, "IN A 127.0.0.1\n"}' test.lst | unexpand -a
でタブをスペースに置き換えるのが expand ってコマンド
expand はたまに使うけど unexpand はあんまり使わないよね >>393
第一フィールだけやるな
50文字固定にするな
awkで実装したって劣化版になるだけやろ?
columnをインストールすればいいだけやん >>393
unexpand -a だと全ての空白を対象にしてTABに置き換えようとするためにうまく行かなくなることがあるのでは?
>>394
column コマンドでは TAB は出力されないよね。 >>394
何そんなに怒ってんの?
入学試験じゃないんだからさ〜、臨機応変、柔軟、適当にやればいいじゃん
それに column 使うのはいいとしてAレコードの追加しなきゃダメでしょう?
>>395
あんまり細かいことは突っ込まないでねw > column コマンドでは TAB は出力されないよね。
スペースをタブに変換すりゃいいだろ シェルスクリプトというのは既存のコマンドを使って
いかに楽をするかっていうのが重要
POSIXにこだわるのはアホ >>394
columnコマンド使って>>370やってみろよ >>396
TABかスペースが関係ないならそれで良いんだよ。>>369, >>370 の求めているものとは違うものになるけどな。
>>397
それをするのに丁度良いコマンドはあるの?
unexpand -a では全スペースが対象になってしまって駄目かも知れないわけだが。 ハイハイ、ご要望通りにいたしました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 汚らしいパールのワンライナーに比べたら多少洗練されたようだな >>400
> unexpand -a では全スペースが対象になってしまって駄目かも知れないわけだが。
駄目だって事例提示してみ? columnは知ってたけど-Lオプションは知らなかった POSIX原理主義者「POSIXにはないコマンドをawkで再実装した」
UNIX哲学「車輪の再発明をするな」
POSIX原理主義者「・・・」 >>406
wcの-Lだよ
-lしか使ってなかった debianのcolumnに比べてredhat系のcolumnのオプションが随分と充実してる 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" スーパーコンピュータシステムのファイル消失のお詫び
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 のファイルを削除し
てしまいました。 機器の不具合かのように書いてるけど馬鹿による人災じゃねーか シェルスクリプト以外ではほとんど見られない性質ではあるからなあ。
たしかに人災とも言えるけど。 シンボリックリンクで新しいバージョンのプログラムにリンク先切り替える方式にしておけば被害は防げたかも知れないな Linux の場合プログラムは起動時に全てメモリに読み込まれるから
稼働中にプログラムを差し替えても OK って考えて実際に差し替えたら
メモリ上の古いプログラムがファイルシステム上の新しいモジュール
ファイル読もうとして動作不良になったことがあったなあ この挙動ってinodeが同じまま書き換えたから起こったんだよね?
inode変わるファイル更新なら起こらないよね? >>419
更新手順が更新されるんやろなあ。
既存ファイルに直コピーが禁止になって、新規ファイルを作成後に既存名に改名とか? リリース手順の考慮不足以前にfindを使った削除の運用自体に問題がある
ちゃんと金払ってまともなもの作ってもらわないと
未定義の変数を含むfindコマンドが実行すると
rootディレクトリのファイルが全削除される? findとか関係ねーよ
例えばrmで終わるコマンドがあったとして
xxxxrm / が rm / と解釈されることだってある >>418
>Linux の場合プログラムは起動時に全てメモリに読み込まれるから
誰に騙された? https://zenn.dev/mattn/articles/5af86b61004bdc
やっぱりinodeが変わってればokだったみたい。
mvとか、installとか使って反映しておけば回避できてた模様 門外漢なんで純粋に知りたいんだけどこのbashの実行中の書き換えも書き換えたとこから逐次実行する仕様って歴史的経緯によるもの?もしくは
有効に活用できるケースがたくさんあるから意図して実装している? Lustre の checkpoint 機能は使ってなかったのかな? 規模は違えど今回の事例と同様の体験をした人・組織は少なくなさそう inode云々は問題の表層でしかない
実行中のスクリプトが新しくなったからといって77TBものユーザーデータをサクッと削除しちゃえるのがおかしい
何重にもガードできているのが当たり前の案件 >>426
あくまで「シェル」なんやし、入力を逐次実行するのが仕様やろ? スパコン系の人達は運用周りのリテラシーすごく低い
シェルスクリプトしか知らない人達よりもひどいくらい >>434
ファイルの削除処理はJavaで作ればいいんちゃいます?
ログもしっかり残してさ >>425
installコマンドを使わないバカが多いからなあ >>426
bashそのものじゃなくてスクリプトの方だぞ >>441
installコマンドでも同じなんだが
こういう本物の馬鹿が多いからなあ >>426
bashに限らずevalが使えるスクリプト言語はどれも似たようなもの
その方が効率がいいから
ファイルを全部メモリに読み込んでたらメモリの無駄遣い。必要になった時に読み込んで
コンパイルして中間コードをメモリに保存したほうが効率がいい
書き換えたところから実行する仕様とかじゃなくて
読み込み中にファイル内容が書き換わっただけ #!/bin/sh
{
# Your stuff goes here
exit
}
って書くと、全部読み込んでから実行する…らしい。 >>444
> bashに限らずevalが使えるスクリプト言語はどれも似たようなもの
知らんけどJK、PerlもRubyも違うやろ。。。 >>446
REPL(Read-Eval-Print Loop)が使えるスクリプト言語あたりが妥当? >>446
検証してないけどPerlとPHPも同じらしい
それに厳密に言えばRubyでスクリプトを起動している途中で
gemsをアップデートしたらおかしくなる可能性があるやろ?
今から読み込もうとしたライブラリファイルが
中途半端に入れ替わってる可能性がある
シェルスクリプトは1ファイルの中で中途半端に
読み込まれて実行されてる可能性があるが
他のスクリプト言語は、それはないかもしれないけど
複数のファイルで構成されてる場合、中途半端に読み込まれて
実行されてる可能性がある
そしてバイナリでも動的にライブラリを読み込むようなものがあれば
同じようなことになる可能性がある こういう面倒なことになるからWindowsはアップデートの時に再起動が必要な仕様にしたんだよね ツッコミどころが多すぎるんだよなぁ
しいて他山の石とするなら
findの結果を直で削除せず
チェックしてから削除したほうがいいってことくらいかな >>448
よほど特殊なケースを除いて
RubyやPythonでは同じ問題は発生しないよ
かと言って実行中に上書きはしないけどな >>451
突っ込みどころが多いのはお前だろ
どうやってシェルスクリプトでfindの結果をチェックして削除済んだよ
しかもそのチェックコードすら書き換わるって話だろ
何が問題になってるのかわかってない >>452
特殊なケースで発生するって言ってんじゃんw >>448
>それに厳密に言えばRubyでスクリプトを起動している途中で
>gemsをアップデートしたらおかしくなる可能性があるやろ?
そういう運用を前提にするなら起動途中にgemをアップデートしてもおかしくならないように作ればいい シェルスクリプトの場合{ } で全体をくくって作ればおかしくならない >>448
それは>>444とほとんど関係のない話。
実行中とロード中は違う。
論点ずらしはやめろや。 >>447
要するに、シェル系だけなんちゃうの?w >>450
Linuxは、実は再起動が必要なときでも、システムがそれを認知しないだけやったりするからな。。。
考えてみると、システムのsoファイルを更新しまくっても再起動不要なのはヤバいやろ。w とりあえず手持ちの(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 は一度どっかにコピー(構文解析済みキャッシュ)してるから実行中の上書きが反映されない感じだと思う >>458
いいや、閉じ括弧の後、EOFを検出する前(要はブロック実行中)に行が追加されるリスクがあるやろ。
リスクを心配したいんかしたないんか、どっちやねん?w >>453
君のところでは実行中に直接上書きするのが当たり前なの?
うちではそんなことしないから考慮する必要ないんだよね
削除に至るまでのセーフガードが他にもいくつかあるからあえて教訓を得るなら削除前のチェックかなって話 プログラム上書きで動作を変えられるというのは、ある意味脆弱性と言えるかな
権限奪われた後でしか起こせないけど Perlとかはプログラム全部読んでから内部コードにコンパイルしてからそれを実行するので動的な部分以外は大丈夫だと思う
Perl で動的というと eval に文字列引き渡した場合と require でソース読んだ場合かな
シェルで言うと eval とドットや soure でのソース読み込み >>443
説明が足りないんじゃない?
単一のシェルスクリプトの場合は、更新時にinodeが変わってれば大丈夫。で終わり。
シェルスクリプトから、別のシェルスクリプトを読んでる場合は、
読み込む行でpathを評価するから、
読み込むシェルスクリプトだけが新しくなって、読み出し元シェルスクリプトが環境変数を持たない結果、同じ事象が発生する可能性はある。
だから、
installを使ったからと言って、すべてのトラブルを避けられるわけではない
と言うのであれば妥当 そこは重大な障害に至った本質的な原因じゃないからな >>459
スクリプト系は実行中にロードするんだよ
該当の行まで実行しないとgemsが読み込まれない
実行前に全てのライブラリを読み込むわけではない >>463
> いいや、閉じ括弧の後、EOFを検出する前(要はブロック実行中)に行が追加されるリスクがあるやろ。
{
exit
}
閉じカッコの後が実行されるとでも思ってんの? >>467
installはcpと同じ挙動をするんだから
解決策になってないって言ってるんだが理解してるか? >>466
> Perlとかはプログラム全部読んでから内部コードにコンパイルしてからそれを実行するので動的な部分以外は大丈夫だと思う
PerlとPHPはシェルと同じ問題がある
調べてから書き込め >>464
お前何の話してんの?
> findの結果を直で削除せず
> チェックしてから削除したほうがいいってことくらいかな
が意味不明って言ってるだけやろ ティム・クック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万円なので高値で落札されていますね。
しかしお高いランチ代。いったい誰が落札したんでしょうか。 >>471
installについてだけ突っ込んでるけど、
文書の本質は、inodeか変わる場合は、という意味で話してるのは理解してるか?
mvで上書きするとinode変わると信じてるけど、
installつかったすべての状況で、inode変わるかまでは分からないから、
installを例に挙げたのが悪かったのは認める。 だーかーらーinstall使っても
inodeは変わらないって言ってんだろ
信じてるとかじゃなくて、ちゃんと調べろ >>478
本質でないinstallについてだけツッコミたいということは理解した >>479
これのどこにinstall以外の本質の話が書いてあるんだアホか?
441 名前:デフォルトの名無しさん[sage] 投稿日:2021/12/30(木) 02:02:44.37 ID:bPzpLvLZ [1/2]
>>425
installコマンドを使わないバカが多いからなあ >>469
実行中に別モジュールをロードするんであって、スクリプト自身は構文木にコンパイル済み。
>>444にはほとんど関係のない話。
シェルスクリプトには実行エラーしかないけど、Perlとかは実行前にシンタックスエラーになるのはなぜだと思うの?w 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). 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. >>470
非現実的な解決策w
>>444で知ったかぶりして嘘書いちゃったもんだから引けなくなったのかなww お前は { ...; exit;} での対策が無効と思ってるのか?
それともそんな面倒なこと徹底できるわけないと思ってるのか? >ファイルを全部メモリに読み込んでたらメモリの無駄遣い
メモリの無駄遣いじゃなかったの? >>484
え?どこが非現実的なんだ?
お前のキーボードでは}が打てないとかそういう話か?
{
お前のコード
exit
} >>486
メモリの無駄づかいだから
小さな内部形式に変換するんですが? 例えばコメントとかメモリに置いておく必要はないよな
空白もそのままメモリに保持するのはメモリの無駄遣いでしかない bashスクリプトは実行完了するまでスクリプトファイルをcloseしないでしょ
内部形式の変換だが知らんがコピーした分だけ余計メモリに使うから >>488 以降は同意できん >>490
わからないの?コンパイラの仕組みとか勉強したほうが良いよ。 >>491
> コピーした分だけ余計メモリに使うから
何をコピーするんだよw
まさか起動中はメモリを解放できないとか思ってるのか? >>494
自分でわからないって言っただろ
わからないなら、自分で勉強するか
わからない所を具体的に聞け
ちゃんと教えてやるぞw まあ俺は優しいから教えてやろうw
{ echo '#!/bin/sh'; printf '#%100s\n' {1..1000000}; echo sleep 30; echo end; } > scr.sh
これで100MBぐらいのシェルスクリプトができる
これを実行しても3MBぐらいしかメモリは食わない
内部形式は小さいからだ
これを全部メモリに蓄えておくと100MB以上消費する
最初にパースして内部形式にする方式は
後ろにバイナリとかがついている時ににエラーになるから使えない { echo '#!/bin/sh'; echo '{'; printf 'printf %s\n' {1..1000000}; echo sleep 30; echo '}'; } > scr.sh
「内部形式は小さいからだ」wwwww echo "あけおめ $(TZ=Asia/Tokyo date +%Y)" 今回のケースって世代バックアップとかやってたとしても
それを掴んでたバックアップスクリプト自体が上書きされて暴走して余計なファイルまで全消ししたわけだよね
>実行中のスクリプトが存在している状態でスクリプトの上書きによりリリースしてしまった
問題はここだけだと思うんだけど
酷く杜撰な運用に見える
*nix使いってこの程度のITリテラシーしかないんだね
気持ち悪い >>500
本気でやったら、金も時間もかなりかかりそうやからなあ。
やらかしでしかないんでいいわけのしようもないんやろけど、そこはあんまり重視してなかったんやろ。 >>500
マジでこれな
特殊な事例かと思ったがこのスレ見る限り似たようなレベルのやつが多数 >>501
実行中なら中断するか終了を待ってから新しいのをリリースすればいいだけだろ
日次バッチを中断したり終了を待つのに金も時間もかなりかかるのかい?
他にも例えば権限管理をまともにしてれば防げたよね? >>500
バックアップ容量が多いと、書き込み先の書き込み速度以上のスピードはでないから、
複数世代バックアップするにも、ずっーとバックアップというかコピーというかの処理をし続けることになる。
月次フルバックアップ処理中に、次の増分バックアップ処理が始まるのはテープの場合はよくある。
今回は復元不能と言っていることから過去のバックアップも消えてそうでD2Dっぽいけど、
そういう設計なら基本的にスクリプトは止められないから、
止まったときに更新するんじゃなく、
別のスクリプトをリリースして、古いスクリプトを退役させるような方式を選ぶと思う。
毎日すぐに処理が終わるようなスクリプトしか目にしてないエンジニアが、
そんな設計とは知らず、そのまま更新しちゃったとかそんな理由なんじゃないかなあ? >>503
そんなのなら本気やないな。w
テラバイトレベルのバックアップをしっかり実装すんのはなかなかやと思うが。
「日次」でいけるかどうかもあやしいやろ。
クリティカルなシステムでもなし、ただ甘く見てた、てところやろうとは思うが。 >>505
長時間かかる処理は普通suspend/resumeできるようにするよね?
自作しなくても市販のソフト買ってもいいし
日次で終わるかどうかは障害とは関係ないが
ミラーリングなのに日次で終わらないようなら作りが悪いよ
それにバックアップスクリプトに削除を混ぜるのがそもそも間違い
ジョブの単位や依存関係の管理が杜撰 >>506
世代バックアップするなら旧世代のバックアップを削除すべきだろうし、
スクリプトで作った一時ファイルは、そのスクリプトで消すべきだと思う。
やはりスクリプトの更新方法の不備かと。 >>507
OSはLinuxやで
Cray用のソフトも普通に売ってるで
知らんだけやろww >>508
世代バックアップちゃうで
今回の障害を受けて世代バックアップ検討しますて書いとるやろ >>475
俺、ティム・クックと0円でランチを一緒にしたことあるぞ。
例の宇宙船にほど近いレストランのカウンター席でメシを食ってたら隣に誰か座ってきた。
その人は電話をしまくってて、落ち着かねー奴だなーと思って顔をよく見たら... !!! >>509
> OSはLinuxやで
それはカーネルやろ。
> Cray用のソフトも普通に売ってるで
どこの店でどんなふうに?
いわゆる「市販」とちゃうやろ。 >>498
それ内部形式じゃないぞ?
100MBのシェルスクリプトのソースコードを生成してるだけ
100MBのシェルスクリプトを実行してもわずかのメモリしか消費しない
内部形式は小さいからだ!
やっぱアホの子はお前の方?w >>514
off-the-shelf softwareの日本語訳だよ
そこら辺の電気屋さんとかで買えるという意味の市販とは確かに違うが
市販ソフトって言葉は文脈によってもう少し広い意味になるよ
勉強になった? >>516
勝手に文脈をつくんなや。
で、どこで売ってんの? >>517
Linux用でいいのでは?
https://support.hpe.com/hpesc/public/docDisplay?docId=a00109703ja_jp&docLocale=ja_JP
オペレーティングシステム
HPE Cray Linux Environment
HPE Cray Programming Environment
Intel Parallel Studio XE (およびIntel MPI)
PGI Professional Edition
GNUコンパイラコレクション
Rogue Wave SoftwareのTotalView
AMD AOCC
Vampir
GNUコンパイラ https://www.hpe.com/jp/ja/product-catalog/detail/pip.hpe-cray-operating-system.1012842044.html
HPE Cray OSは、ハイパフォーマンスコンピューティング向けに機能強化された
SUSER Linux Enterprise Server (SLES) をベースとしています。
ふむ。SUSEのパッケージ全部動きそうだけど? >>508
処理をどので分割すべきか理解してない典型例
cronのような原始的なのしか使ったことないでしょ
*nix系あるある >>519
それで動作保証まですんのはなかなかのチャレンジャーやと思うが。w
そんなことより、どこで売ってんの? >>521
石北会計?w
UNIX系あるあるなのは認める。
だが、それでいい。 >>472
LinuxでPerlで実験してみたが同じ問題は出なかったぞ。
$0 のファイルにプログラムを追加書き込みしてもその部分は実行されない。
シェルで同様に$0に追加書き込みしたらその部分は実行された。 >>524
嘘つきに騙されんなよ
PerlもPHPもRubyもPythonもJavaScriptも問題ない
シェル特有 だよなあ。eval や動的にソース読んで実行する個所以外は問題ないよなあ。 >>520
計測した結果を書いてるだろw
見たくないものは見えないってか >>522
だからLinux用アプリを探せよ
それともお前、オーダーメイドはどこで市販されてるの?って聞いてるのか? >>527
嘘つくなよ
ファイルサイズすら計測してないじゃん
内部形式プッw >>528
>>506
ちなみに、ワイかてLinux用ソフトウェアを「購入」したことはあるが、「市販」やなかった。
試用版を借りてから代理店経由やったかな。
「市販」ていうからには、コンシューマ用アプリとしてどっかで売ってるんやろうから、どこでやと聞いとるんや。 >>526
evalも、ふつうは問題ないな。
ブロックなら解析済みやし、文字列でも内部でリテラル化済みやし。
Perlで唯一可能性があるとしたら、BEGINブロックか? >>531
サチコ、それ代理店経由で市販ソフトを購入した言うんやで・・・ GPGPU対応ソフトウェアはMacが一番多いそうだけどね。
意外だよね。 >>529
ファイルサイズはlsでわかるし
メモリサイズはpsでわかる
やり直し ノード数で値段が変わるソフトはスパコンを念頭に置いてるんだな。 >>532
ファイルやソケットや標準入力から読んで作った文字列を eval に渡すなんてのがあったらダメかも知れないが、
これはもうプログラムの作りが悪いと言えるな。SQLインジェクションと同じだし。
require でソース読むやつは事前にチェックされてないのではないかな?
use でのモジュール読み込みはコンパイルされるが。 正直、何となくまずいとは感じる程度のものだったけど解像度が上がって良かったと思ってる
単純なファイル操作だけど対象が巨大で時間がかかるってのは中々お目にかからない >>539
もしかして>>496と>>498の違いがわからないの? わかるなら説明しろ。そうやって回答から逃げる手だってバレバレだ。 >>541
> require でソース読むやつは事前にチェックされてないのではないかな?
だからなに?
自分で書いてるやん。w
> これはもうプログラムの作りが悪いと言えるな。SQLインジェクションと同じだし。
ただし、実行時でなくロード時に読みきることは変わらないので、結局、シェルスクリプトほどのリスクはない。 >メモリサイズはpsでわかる
そんな装備で大丈夫か? シェルスクリプトのリスクは高い
なぜなら普通やるだろ?
起動中にプログラム書き換え
な? 結局シェルスクリプトが原因じゃなく
シェルスクリプト使いの低スキルが原因だった 自己書き換えシェルスクリプトは、昔に見た記憶があるな。
動作がちゃんとわかってれば、有用な機能として使えるんだろ。 例えばWindowsのログオンスクリプトとかに使われるバッチファイルもアトミックな更新が必要になるね
そういう場合はログインする可能性のない夜間とかを狙って更新したりする
スパコンのアホは、よりによってバックアップ中にバックアップのスクリプトを更新しようとした
上の例で言えば一番ログインが試行される始業時間帯とかを狙ってわざわざ更新するようなもの
どれだけ愚かな行為か想像できよう OSやファイルシステムによっては出来ないかも知れないが、プログラム動作中に新バージョンへの入れ替えを
行っても動作しているプロセスはそのまま動かし続けて影響させず、次回起動時から新しい方が動く方式にして
おけば良かった。例えば Linux や UNIX 系 OS ならシンボリックリンクの指す先を変えることでこれは可能だ。
Windowsではどうやるか知らないがシンボリックリンクはあるようなので多分出来るんじゃないだろうか。 >>556
Windowsだとリンクを一旦削除してから張り直す事になるから無理だろうね
リンク先が一旦消えるから、掴んでたバッチファイルは読み込みが途切れるか、
そもそも誰かが掴んでる状態ではリンクの削除に失敗するかどっちか OSとしてはプログラムを実行中に入れ替え可能だとしても
アプリがそのように作られてない可能性はなくならない 実行中に上書き更新しないのは当たり前
undefinedになった場合でも全データを削除しないように作るのも当たり前
どちらも当たり前だと思ってないやつが多数いるのがシェルスクリプト特有の問題 「全スクリプトを{ ...; exit; }で囲え」なんていうキチ・・・エッジな人もいる コマンドプロンプトとかいうゴミみたいなシェルは実行中にメモ帳から普通に上書き保存できるしbashみたいな更新問題がある
構文解析が闇鍋状態だからまともに(...&exit)でガードする気も起きん 全スクリプトを{ ...;exit;}というとヤバいように見えるけど
... #オプション解析とか
main(){ ...;}
{ main "$@"; exit;}
とでもすれば多くの更新事故は防げると思う >>562
関数を使わない主義に属してるので
そのコードは主義に違反している >>561
> 構文解析が闇鍋状態だから
それはシェルスクリプトを勉強しろっていいたいねw >>562
全然防げないよ
無駄なことに時間費やさずに実行中に上書きするのをやめろ >>562
mainの中で他のスクリプト呼ぶ場合はどうするの?
先に読み込んでおける? {} の中にsource入れとけばいいだろ
他のスクリプト言語と一緒 { } を使ってるってことは、最後の}まで読まないと実行しないんだから問題なし
{ } の中でsoruce使っていれば } を読み込んだあとでsourceが実行される
soruceで読み込むファイルでも同じように { } を使えば全部読み込まれた後に実行されるから問題なし こういう低脳がゴロゴロ居るからやらかす奴が後を絶たない 低脳は自分が低脳だと気付かないから始末が悪い
テストして確認しましたと言ってもその内容も方法も間違ってる
基本的に日本語が通じない 高い堅牢性が必要な処理にシェルスクリプトは向かない こんな不確かな情報に頼ってまでやることじゃないと思うのだが
普通にスクリプト側に更新機能でも追加した方が確実だし メモリ使用量を計測させれば
低脳の足切りが出来るぞ {}が安全だとわからないアホは
}を読まないと文法が確定しないからって
理屈がわからないんだろうな >>584
メモリ使用量はすでに計測済み
sleepを間に入れて、その間にpsを実行するだけでわかるよ >>582
アホやな
安全対策の一つに決まってるやろ >>586の方法は重大な欠陥が2つある
スパコンのデータ削除したやつと同レベル >>589
必死すぎじゃね?それで議論に勝ったつもりでいるんだろうけどさ >>590
ないよ。一つも欠陥について述べられてない スレ立てるまでもない質問はここで 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 質問スレなかったのでここで質問させてください。
フォルダ以下の全てのファイル内の特定の文字列から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に渡ってきません >>600
Sedでも特定行の次行の処理とかできるで?
これはダメやろうが、こんな感じでがんばったらいけるんちゃうの。
sed -q '/guid/{p;n;s/m_name:/.../p;b}p' 処理時間気にしないなら
|while IFS=: name line etc; do sed -e "$((line+1)) s///" $name; done
とかで良くない? >>600
全部awkでやればいいんじゃね?
下手にcutとかsedとか使うと混乱するでしょ? まあ別にawkにこだわらなくてもperlとかでもいいけどさ >>600
perl 使ってこんな風にするとか。
perl -pe 'if($f){s/m_Name:/置換したい文字列/}$f=/guid: c5b2e3eb25e32904fa18c5ae09b782d9/' 読むファイル >書くファイル
少なくとも一つ前の行の状態を今読んだ行の処理をする時に分かっていないとできない。
読む方法を行単位にしないのであればその限りではないが。 もう一つ awk, sed, xargs の組み合わせでやるやつを考えたが書き込もうとするとエラーになって書けない。
要約を書くと
grep で行番号付きで出力 | awk でコロン区切りで読んで $1 をカンマ区切りで連結した文字列を作った後でその後ろに "s/m_Name:/xxxxx/" の文字列を付けて出力 | xargs で入力はsedスクリプトになるようにしてsedが読むファイルは最初にgrepで指定したファイルと同じにする。 >>606
シェルスクリプトでperlワンライナーはごく普通 そんなこといったら
pythonだってシェル使ってワンライナーやろうと思えばできるじゃん せっかくのシェルスクリプトで
ワンライナーにこだわるやつはバカだろ >>600
なにをどう変えたいのか知らん(読むの面倒)けどこうすればいいだけ
自分でパズル(ワンライナー)問題を作ろうとするな
cat prefab | awk '
/guid: c5b2e3eb25e32904fa18c5ae09b782d9/ {
print
getline
print $0 "new"
next
}
{ print }
' awk -v "var=`grep -A 1 'guid: c5b' source.prefab | sed -n '2p'`" '{ sub(var, "hello, world!"); print }' source.prefab > after.prefab >>612
なんかものすごくイキってるみたいだけど
まともに動くコード書いてからにしてねw >>613
sedは柔軟性がない
仕様変更に弱いんだよ
>>614
可読性が低すぎる
>>615
バッチリ動いてるんだが? 一ヶ月後、一年後、
読み返してすぐに理解できるのはどっち?って話だよ 可読性という言葉はキミの頭の悪さの免罪符ではないですよ? ああ、awkを知らないのねw
勉強したほうがいいよ? sedやawkつかうならperlつかうな
シェルスクリプトなんだから、判定等はそちらに任せて
あくまで置換等の処理限定で >>600
sedの-zオプション使って複数行まとめて置換すれば?
sed -Ez 's/(guid: c5b2e3eb25e32904fa18c5ae09b782d9[^¥n]*¥n m_Name: )¥n/¥1FOOBAR!!¥n/g' ServerCameraSpot.prefab 柔軟性のないsedや、ハードル高めのawkよりいいべ
シェルスクリプトができる環境ならだいたいperlは入ってるし 条件の行と処理したい行が分かれてる時点で単純なフィルタじゃ無理だからでしょ
awkなりperlなりで状態遷移は必須
むしろsedでできるなら教えてほしい あっさりワンライナーで書かれたもんだから激おこですな ここまで回答が出るのに時間がかかってるのに
あっさりとは言わないw ワンショットなら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() >>612
そんなのただのawkのベタ書きじゃねーか
ベタ餓鬼するなら断然perlのほうがいいよね
cat ServerCameraSpot.prefab | perl -ne '
if (/guid: c5b2e3eb25e32904fa18c5ae09b782d9/) {
chomp($a=<>);
print "$_$a new\n";
} else {
print
}'
perl最強! sed -e '/guid/,/^/s/m_name/xxx/' >>623
あの、これ動作してないように思うんですけど‥ Ruby のyaml を使ったら、最初のPrefab 部分しか取れなかった。
行頭に、--- があって、複数の文書として扱われるからかな?
require 'yaml'
data = YAML.load_file( "ServerCameraSpot.prefab" )
p data
出力
{"Prefab"=>{"m_ObjectHideFlags"=>1,
"serializedVersion"=>2,
続く 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 >>638
5ch仕様なのか連続複数スペースは一つにまとめられるみたいね
m_Name: ) の前のスペースが一つになっちゃってる 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" >>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は正規形じゃないから、普通のパーサーで解釈するのは、骨が折れる timeコマンドみたいな感じで、あるプロセスとその子プロセスが読み書きした
ファイルのデータ量を簡単に調べる方法ないですかね?
Linux板に書き込めなかったのでここで 俺が知らないだけかもしれんが、コマンドとしてはないんじゃないかな?
mmapのメモリコピーによる書き出しの捕捉はカーネル空間じゃないと無理だろうし
比較的簡易的なのはstraceだけど、mmapのは漏らす
面倒なのでstapとか思いつく Linux 板は、荒らし退治がすごい
もう何か月も書けない。まだ、何年も続きそう 「linux メモリ使用量 プロセス 監視」などで、検索すれば?
Zabbix などに、そういう項目は無いのか? >>648
そのコマンドって一瞬で実行が終わるんですよね 久しぶりにこのスレ来たけどPOSIX云々言ってた人消えたんだな
一気に過疎ったな 一時期は数ヶ月で1スレ消火するぐらいの勢いがあったのに。つわものどもが夢の跡 見てきたけど酷いな。よくシェルショッカーなんて相手にするよ
リッチー大佐も冷静を装ってるが完全に脅迫になってるのわかってないのかな BourneがALGOL策定に関わってたからfiとかesacになった、odは名前被りで免れたという小噺は聞いたことあったが、ここまで染まりきってたとは思わなかった
さすがにソース内までは免れきってない、あとPOOLってなんだよ…
https://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h 昔は、マクロでCを他の言語っぽく書けるようにする、つー流派?があったからなあ。w
begin/endを定義してPascalっぽくとか。 >>659
昔の話だろ?Bourneシェルの後のバージョンは
ALGOL風じゃなくなってるで >>660
COBOLっぽくしてるのを見たことがあるな doが対称性を崩してるよな
キーワード …; do
…
done
FOR-ROF
LOOP-POOL
WHILE-ELIHW
美しい対称性 xargs コマンドの -P オプションに、3時間ぐらい前に気付いた。 >>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で置換する必要はあったけど bashの
[[ -a ${TMP_FILE} ]] && rm -f ${TMP_FILE}
って-aとか[[ ]] &&とかそれぞれどういう意味なの?
TMP_FILEがあったら消すってことなんだろうけど -aはファイルが存在すれば真になるという古い書き方
ANDの意味の-aと間違いやすいから-eを使え
&&は普通にANDだろ >>667
古い書き方なのねandの-aと紛らわしいな 短絡評価。真、偽の順で表示される
and の場合は、左辺が偽なら、右辺を評価せずに、偽が確定する。
or の場合は、左辺が真なら、右辺を評価せずに、真が確定する
[ a = a ] && echo 真
[ a = b ] && echo 表示されない
[ a = a ] || echo 表示されない
[ a = b ] || echo 偽 bashは構文を拡張しすぎたせいで、変なのを書くやつが増産されてしまった。 >>668
[]がコマンドであることを認識した方がいい 昔は [ が test にシンボリックリンクされていたものぢゃ ファイルの先頭と末尾だけを表示させたくて
$ (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 分しか表示されなかった
多分シグナルとかの関係だろう、と思ってるんだけどイケてる回避策ってあるかな?
まあなければ愚直にファイルに書き出すだけなんだけども たぶんheadが複数行まとめて読み込んで行数とか判断してるんだと思う
回避策はないかな
stdinから読み込む挙動を変えるオプションも無さそうだし (sed -u 10q;tail) < <(grep 22-04-20 tmp) せやったら全部Sedだけでええやろ!w
と思ったけど、なるほど、むつかしいんやな。。。
末尾複数行を簡単につまめないんやった。
$(($(wc ...)-N))を埋め込んだらできるけど、それもなー。 どうでもいいけど22-04-20 00:60ってなによ >>677>>678
そうか、headでバッファ読み捨てられてtailは参照できてないのか
サンクス
>>680
気にせんでくれ… readでcsvのヘッダを読んで、本体だけが次のパイプに渡って処理され、最後にcatで再結合する技は見たことある
つまり、head じゃなくて10行readならいけるんでないか? >>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;…
なら通るでしょう() { for _ in {1..10};do read l; echo "$l"; done; tail; } < <(grep 22-04-20 tmp) grep 22-04-20 tmp | tee >(head) >(tail) >/dev/null lsの日時の書式をyyyy/mm/dd hh:mm:ss固定にしたいのですがどっかに設定あるんでしょうか >>688
これ動くような気もするけど、エッジケースの詰め合わせみたいで関心するわ…ぜひ明日試したい
teeはプロセス置換への分配を均等に進めるのか?
head/tail でなければ入力も出力も数ブロックのバッファ単位で入り交じるはずだけど、バッファ単位に収まる10行のhead/tailの出力は一塊で吐かれるはず、つまりhead→tail/tail->headのいずれか
先頭だけ舐めるheadの方がtailより先に処理を終えるからhead->tail、の出力になるのだろうか? tee, head, tailの実装とバッファリングモード、入力データの素性の全てに依存してそうなヤバさ とりあえず手元の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 入力が小さいときに限っては、teeも実質引数に一回渡したきりだからheadの速さも関係ないんだろうね
seqの引数を二分していけば均衡して、結果はランダムになりそう 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] }' つまりさ、複数のコマンドを使って
効率的に処理する方法はないってことでしょ?
>>696みたいにするしかない seq 100 | pee head tail
peeでだめなん? >>689
ls −l −−time−style=+'%Y/%m/%d %H:%M:%S'
をaliasにでも登録しておく >>697
そもそもgrepが律速なんだから効率とか野暮だけど、あえて言うなら
元のファイルがダンプしてしまえるならストレージは食うが終端にシークしてしまうのが最速だし、ストリーム処理なら初めの10行プリントする自明な処理の後、10行のバッファを保持して終端が見えるまでひたすら読みまくるしかアルゴリズムはないわけで
それはsed N;N;...でもなんでもいいが、timeするまでもなく10行保持して読み捨て専用マシーンとしてガリガリチューンされてるtailを使うのが最速に決まっとるがな 変な流れになってるのは>>688という爆弾に完全に食われてしまったからな…
俺にも挙動が予測不能過ぎて興味が尽きない >>695
seq 10001 | tee >(tail -10000) >(head -10000) >/dev/null
を実行しても、headが前半、tailが後半と期待どおりに出力されるんで、問題ないんちゃう?
headは頭から行単位に出力、tailは終端に達してから出力、やと思うとそれでいい気もするし。
>>692は知らん!w 並スペックの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 head or tailだけにコイントスってか(裏でも表でもないが)
https://i.imgur.com/uQBk3cx.jpg バックグラウンドの割り込み遅延やその時点での負荷が影響するだろうから、エントロピー源に出来るな
もっとも一様乱数に近付けるにはおま環固有の定数を探す必要はあるが
マウスグリグリで乱数吐く/dev/randomと原理的には同じもの そもそもteeから非同期に投げたプロセスが順序良く出力することを期待するのがおかしいわけで
何のコマンドでもいいが、それを暗喩する名前のheadとtailというチョイスがツボに嵌まって面白い
というか>>688は狙ってやってるだろ
pidやマウス座標とか拾って改善目指すとかは無粋 字面とその挙動、足すことも引くことも躊躇われる簡潔さ
完成し尽くされてるよな
今スレのベストコマンド賞にノミネートしたい ユーモア部門なw
プロセス置換がposixで無いのだけが惜しいが、一番面白いワンライナーなのは間違いない >>703
tailのほうにsleep 0.1でも入れとけば充分安定するな。 そこまでやるならもういっそ行番号振って最後にソートしろよ… というか、気紛れさが可愛いという話なのに安定させてどうする もうとっくに解決してるので…
爆弾落としてった誰かが悪い
>>687でいいと思うが、あえて添削するとすれば、まずコマンド置換は不要
grep pat file | { for i in {1..10}; do read line; echo "$line"; done; tail; }
再利用したいならパラメトライズが面倒なブレース展開を避けるべき(パラメータ展開より先)
{1..10} -> $(seq $n)
もちろんwhileでカウントしてもいい、どちらの版も適当なファイルで取り敢えず動作確認済 まちがい
✗コマンド置換
↓
✔プロセス置換
です 質問です
if [-z $cmwt ]の-zは何なん? >>715
そういうのいらないっす.
>>716
[ がコマンドなんすね そのオプション -z the length of STRING is 0 だとfalse? bash$ help test | grep -A1 -e '-z' >>717
あのさ、シェルスクリプトをちゃんと勉強しろよ!
「入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界」という本があるんだけど、これを読めば何もかもわかるよ。 UNIX シェルスクリプト・コマンドブック 第3版、山下哲典、2015 [ がコマンドで、ゆえに直後にスペースが必要
というのは初心者が見落としやすいところではある シェルスクリプトの基礎をすっとばして
いきなりコマンドの使いこなしから始めましょう
みたいなのは害悪だと思う
シェル芸から始めるんじゃなくて、シェルスクリプトを勉強すべき 言い出したら切りがないけどコンピューターの仕組みからやるべき まずはマニュアルくらい一通り読まんとな
俺は座り無精なのでマニュアルだけ読んでマスターした気になってる言語の方が多いくらい() vimでshebangを自動で入力してくれる機能ありますか? スレ違いだと思うけどまあ一応
:autocmd BufNewFile *.sh [コマンド]
put='#! /path/to/sh'
多分dieとかgetoptとかtrap含めたテンプレを用意して日付とかファイル名とかお前の名前とか置換
r /path/to/tmpl.sh | s/__DATE__/\=strftime('%Y-%m-%d')/
未テスト >>732
ありがとうございます、:autcmdですか スペースを含む複数のファイル名を一括でリネームしたいんですが、上手い方法はありますか?
スペース無しならfind+sed+xargsで行けるのですが findのオプションでprint0とかしたらいけないんだっけ? >>734
そういうのsed使って加工するとだいたい壊れるw
ファイル名を置換するシェルスクリプトを作れ
あとはそれをfind -execで呼び出せばいいだけ それからあとはどんなリネームをしたいのかを書くこと 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
次へ続く 前の続き
# ファイル名を変更する
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 スペース含みの対処はレコード区切りを'\0'にすること
(普通だったら'\n'区切り)
find ... -print0 | sed -z 's/...//' | xargs -0 ...
renameが目的なら1レコードをsedで2レコードに分割して、
xargs -0 -n2 mv で受け取ることになるんじゃない?
パイプに流れてるものを見たけりゃxxdでも使えばいい >>734
どんなリネームかによるけど、renameコマンドは? for n in { 1 2 3 }
do
echo $n
done
ってバグ? 手元のshellで気に入らない動作でもしたのか?
誰かが書いたコードがおかしい話か? ループに{}も含めたいのならバグじゃないし
含めたくないならバグかもしれない
知らんがな 波括弧って文法上意味を持つ(フォークしないグルーピング)から含まれないのは正しい挙動だろう >>750
よくわからん指摘
予約語か文法として意味持つかは直交する話でしょう >>751
その他の予約語 if
お前 echo if が、文法上ifという意味を持つなんて思うの?w 予約語が特殊な意味を持つのは
コマンドの最初に使ったときだけ
わからんかねぇw man bashにも、{ }には注意しろ、て書いてあるくらいやからな。 お前が無知なだけやろw
{ } は文法上は特別な意味を持たない 外出しの関数ファイルってどんな名前にしてる?
特に拡張子 関数が書いてあってsourceで読み込むファイル?
名前は何が聞きたいのか知らんけど拡張子は
POSIX準拠で作るときは.shで、bash用なら.bashかな >>759
そそsourceで読み込むやつ
やっぱそんな感じだよね
前に参画してたプロジェクトでは.prfだったから最初?ってなった
ちなみに変数外出しするなら? 変数だけ区別する必要ないやろ?
.shか.bash コマンドとしては使えないスクリプトファイル、ということで、拡張子を別にしたい気持ちはわかる。
検索しやすくなるしな。 関数しか書いてないやつはコマンドとして使えないんだから
それと同じでいいやん bashというかシェル全般について質問です
シェル内で変数定義(例えばTEST="test")して
Java(jar)プログラムを呼び出してその中で環境変数(TEST)を
取得すると値"test"が得られます
シェル内の変数とは環境変数と同義なのでしょうか?
単なるスコープの違いでしょうか? >>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);
}
} そのシェル以外のどこかでexportされてる可能性もなくはない >>768
sample.bash を起動するシェルで unset TEST してから実行してみて
docker で試したけどちゃんと null が出力されたよ >>769
>>770
すみません見落としている箇所があって
きちんとexportしていました
そりゃそうですよね… しかし普通はそんなのが定義されていたからって
だからなんだ?っていう話なんだよな Ruby では、コマンドライン引数の処理に、OptionParser を使って、
short/long option を定義していく 見えないというのなら見えるようにしてあげよう
ルビーでは、コマンドライン引数の処理に、おぷしょんぱーさー を使って、
short/long option を定義していく 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"} short/longと前置/後置の両方サポートしたければ
getoptもgetoptsもダメだよね? realpathコマンドは、Windowsだと何に相当しますか?
シンボリックリンクとか仮想ドライブ経由の実ファイルを特定する方法は、Linuxだとちゃんとあるけど、Windowsはどうしてるんだろ? 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が設定されてるのが出るんだけど 自己解決しました
trap~の行を先頭に持って行ったら上手く行きました トラップ一家物語って子どもの頃は怖かった
マリア?だっけが怒られるシーンとか苦手 そういやデブだっていじめられてたっけ?
マリアはデブ。MariaDB MariaDBは新規に採用されることはもうないだろうな。 exec cmd1 | cmd2
と
cmd1 | exec cmd2 ってどっちが親のプロセスになるかってだけで同じだよね
どっちのほうがいいとかってあったりする? >>769
どちらも子プロセスだアホ
親プロセスはそれを呼び出したシェルカシェルスクリプトだ PATH=$ADD_PATH:$PATH
でPATHにすでに$ADD_PATHが含まれてない場合にだけ追加するやり方ない?ループとか回さずにいい感じにやるやり方 こんなのもあるのか
www.rapidee.com/en/command-line >>803
パスの前後に:をつけてパスの前後に必ず:が付いた状態でgrepかけるのはダメ?
if ! grep -q ":${ADD_PATH}:" <<< ":${PATH}:" ; then
PATH="${ADD_PATH}:$PATH"
export PATH
fi [[ :$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}" ほらよ。お前ら自分でコードもかけんのか?
prepend_path() {
case ":$PATH:" in
*:"$2":*) return 0
esac
PATH="$2${PATH:+:}$PATH"
}
prepend_path "$ADD_PATH" Twitterの#シェル芸とか、うんことか変な吹き出しとか
おっさん臭キツイんだけど、あれ何が楽しくてやってるの? シェル芸と言えば、USP 研究所の上田隆一。
シェルスクリプトを芸にまで高めた香具師
でも、上田の本を見たら、解答がRuby などのスクリプト言語でも書いてあるw シェル芸で、ここはRuby の1 Liner を使ってとか、
シェル芸には、Rubyなどのスクリプト言語の1 Liner も含むw > シェルスクリプトを芸にまで高めた香具師
これが間違ってる
シェル芸=シェルスクリプト芸じゃないぞ つか、シェル芸って、シェルスクリプトの機能ってほとんど使わんやん
パイプぐらいでしょ? ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB%E8%8A%B8 >>820
> 上田さんが書いたページですか?
本人がwikipediaに書いたのかもねw
つか、本人のブログへのリンクあるじゃん
https://b.ueda.tech/?page=01434
> シェル芸の定義バージョン1.1
> マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、
> あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。
> あるいはそのときのコマンド入力のこと。
>
> 要は
> Unix系OSのシェル上でのワンライナーのことです。勝手に名前つけてすんません。
ソースコードを残さない時点でシェルスクリプトじゃないし、
これが定義ならシェルからワンライナーで実行するならperlとかも使っていい
POSIX原理主義とは真っ向から対立してる 上田は、シェル芸の定義まで作っていたのかw
まあ、しゃーない。
シェル芸を生み出したのは上田だから シェル芸って昔からあるワンライナーの日本語訳みたいなもんでしょ?
上田が生み出したとは言えないのでは なんだ?上田ってやつはワンライナーを言い換えた程度で
wikipediaのページまで作ってるのかw その手のワンライナーがスイスイ書けるならそれでいいがワンライナーにするために考え込むぐらいなら普通に複数行使って書いた方が早いし使い回ししやすい > コマンド入力一撃で終わらすこと。
試行錯誤で何度も実行してるよねw シェル芸は、雑誌で連載していた人気企画だったのに終わってしまった
今でも、勉強会などでやっているのかも ワンライナーはともかくシェル芸やってる人って
競技プログラミングやってみるみたいなもので
現実の問題を解くというより、問題のための問題を
解くって感じだから実用的じゃないよね 15年位前まで仕事でシェルスクリプト触ってたけど
ワンライナーの人は難読化させてたように思うね
自身しかわからないようにして仕事がなくならないようにしてた ワンライナーなら、PythonよりはPerlやろ。 Pythonの文法でワンライナーって可能なのか?
ワンライナーならPerlとRubyだろうな
一行でコードを書ける 引数で入力テキスト取れるんだからそりゃ書けるけど、インデントと改行文字埋め込みが辛い
あとperlみたいにfeature全部盛りオプションがないのでボイラープレートが割と要る Ruby の1 liner では、
-r で、モジュールを読み込める。require
例えば、csv を使うのなら、-rcsv とする。
だから、awk はいらない rubyしか使いません使いたくありませんって言ってるだけだな rubyを使うとかアホらしい
そのモジュールにバグとかあったらどうするんだ?
俺が作ったcsvライブラリを使え
awkで作った 俺が作ったcsvパーサーをインストールされば
rubyをインストールしないですむ
俺が作ったcsvパーサーはGitHubでスター68個もある 俺が作ったcsvパーサーなら、ファイルを適切なところにコピーするだけで動く
rubyのインストールは難しい。誰にでもできるような作業じゃない 俺が作ったcsvパーサーはコメント除いて200行ちょっとしかない
たった200行書くだけでrubyは不要になる
200書く方がインストールよりも簡単だ 押しが強いのばかりだな。なんでお前らそんなのきもいのか とはいえCSVの扱い方っていうのはまあまあのバカ発見器だと思う Rubyのインストールが難しいとか言ってるやつの書いたCSVパーサーww
使ってるやつ絶対アホ ダブルクォーテーション内のコンマ改行、エスケープ文字、空白、空行、末尾コンマ、行ごとの列数ブレの扱いや、エンコード、読み込みバッファの使い方とかかしら クォートがダブルクォーテーションとは限らないしそもそもクォートされてるとも限らない シェル芸では、CSV をAWK で書くけど、
ダブルクォーテーション内に、
ダブルクォーテーション、行区切り文字の改行、列区切り文字のカンマがあるとバグる
だから問題では、それらは存在しない事になっていて、現実的ではない。
シェル芸は、あくまでもパズル。頭の体操 >>852
シェルスクリプトで書いた
200行のawkスクリプトを使えば
シェル芸出来る おまえらこういうのがシェルゲイだよ
/bin/sh -c 'while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-32));date;tput rc;done &' シュル芸って一行ならなんでもいいのけ?
1000行ぐらいのシェルスクリプトだって
セミコロンでつなげば一行になると思うが? ./自作便利コマンド.rb
こういうのもシェル芸になるのかな?w
./OSS便利コマンド
だって、これはシェル芸やろ?w 見たやつにへぇーボタンを押させるかどうかよ すべってたり寒かったらスルーされるだけ すでに定義が貼られてるのにこれは?これは?って聞いてるのバカすぎるだろ >>860
定義に自作コマンドを使ってはならないなんて書いてないぞ
だから使っていいよねって話 >>861
うん、いいよ。だからいちいち聞かなくておk >>862
最初からそういえばいいだろ?
なんで最初から「いいよ」って返信しなかったの? >>864
だからその答えを言えばいいだけだろwww >>866
どんな面白いことを言うのか
評価してやるからやってみ 道理にかなってるとかじゃなくて面白いかどうかなのに、
アスペにはわからない模様 POSIX準拠とかこだわってどうするんだろう?
絶対に完全オフライン環境でも使えなければならない理由があるなら別だが、そうでなければ無いものはダウンロードすればいいだけなのに >>873
おろかものめ。Pythonやライブラリを使うとソフトウェアの持続性が短くなる
シェルスクリプトはメンテンスフリーだ。古いOSから最新OSにまで対応できる
ファイルをコピーするだけでいいからインストールが簡単だ
POSIXは1988年に規格化されてからほとんど変わらない
POSIXに準拠していないものは移植性が低い
POSIXに準拠していればLinuxでもMacでもいつでもどこでも動く製品を開発可能だ
これはシェルスクリプト以外では不可能だ
POSIXだけが25年経ってもメンテナンスせずに動き続けるソフトウェアを作れるのだ まあブーブーいうなよ あんたもどうせそのPOSIXが標準化に失敗したtarを使ってるんだろう? 少なくとも、macOSはPOSIX準拠ってことになってるけど使えない機能あるけどな。 >>874
> おろかものめ。Pythonやライブラリを使うとソフトウェアの持続性が短くなる
> シェルスクリプトはメンテンスフリーだ。
セキュリティホールあきっぱなしの /bin/sh 実装でもスクリプトが実行できるガバガバ運用ってだけでしょ。
メンテナンスせずに動き続けるって事こそが危険だから Python は下位バージョン切り捨ててるわけで。 本当に何十年も使われることが想定されるものを作っているならいいけど、なんとなく「寿命長い方がいいよね」程度の理由でPOSIXに拘って結局暫くすれば使われなくなるなら結果的にかなり生産性悪い作業でしかない >>877 >>878
そうやって今まで使っていたアプリケーションが
OSをアップデートしたらいきなり動かなくなって
長い間システム停止して大損害が発生するわけだ
その責任をお前らは取れるのか?
シェルスクリプトで作っていれば何十年後でも動くし
ファイルコピーだけで別の環境で動く。何も修正する必要はない
シェルスクリプトの可搬性が低いとか言ってるやつは
どのOSでも動く書き方を知らんだけだ
POSIXがあるのだからシェルスクリプトの可搬性は高い >>879
OS アップデートで動かなくなる状況の場合はカーネル/libcがらみで dash も影響受ける。
OS じゃなくて言語・インタプリタのアップデートの場合も過去の失敗から java やら python は複数
バージョンインストールするようになってる。 /usr/bin/python3.6 とか入ってるだろ?
/bin/sh が POSIX 非互換なのか dash なのか bash なのかは非決定的なのにいつまでもシェバン
に /bin/sh って書く方がおかしい。
メンテナンス性の悪い POSIX 互換で書くよりシェバンに /bin/bash って書いてメンテナンス性良い/
簡潔なスクリプトを書くべき。 難読な POSIX 準拠のスクリプトを素人プログラマーが下手に
修正してエンバグするほうが余程リスクが高いわ。 2045年に特異点、政府のムーンショット計画が2050年だからそこまで動けばいいや いま作ってるシェルが糞コード過ぎて恥ずかしいからさっさとこの現場から離任したいわ へー、シェル作ってるんだw
そりゃクソな現場にふさわしいクソな人材だねぇ >>426が書いてるように、
bashですらスクリプトファイルの逐次read中にスクリプト実行までやるのは不思議だわ 実行時にコード生成してそれを実行するなら
runtime_code_generator |bash
で済むしなあ
入出力を<>(rw)で開いて0&>1でウロボロス実行方式を閃いた
何でもいいから非同期バッファ(cat &とか)挟まないと自分が書きにやって来る(書いてるから来ない)のを待たされてデッドロックしそうだが パスワード生成
cat /dev/random | tr -dc '[:alnum:]' | fold -w 16 | grep '[[:digit:]]' | grep '[[:upper:]]' | grep '[[:lower:]]' | head -n 1 >>891
そんなアホみたいなことしてないでmkpasswd使え "c:\test\e01"
の文字列をkshで書く際に
"c:\\test\\e01"
とすると"c:\test□01"と化けてしまうのですが、
どう記載したら良いでしょうか。 そもそもコマンドは何?勝手にc風エスケープ受け付けるコマンドと仮定するけど
\tにはちゃんと\効いてるのに、よりマイナーな\eをesc文字と解釈するのが気持ち悪いな
とりあえず'(シングルクオート)でそのまま囲めば? 初歩的過ぎ、あるいはkshでは違ったらごめんだけど
"\\"はコマンド関係無しにシェルが\と解釈する
後はコマンドが解釈する
という前提はok? "#!"機能の有無の検出って、シェルでどう書くんだっけ? #!/usr/bin/perl の場合を例にして言ってみて >>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
的な感じで ごめんcol1じゃダメそうだわ
機構が有効なら./hash-bang-pは文字列を返して、そうでなければ返さない(例:sh ./hash-bang-p)
事に注意してよしなに >>897
SVR2とかは>>898みたいに書いても、単にコメントとして処理されてたんです
(この例だとperlは実行されない)
>>899
やぱし呼んでみるしかないか… SVR2なんか今時使うの?
もうとっくの昔にサポート切れで脆弱性とかあるのでは? >>901
#!機構で呼んでくれないけど、#!指定のインタプリタを呼びたいケース
例えば実装スクリプト言語が不明/システムにより異なる場合等
とりあえずパースすれば?
`echo "$(head -1 unknown-script)" |tr -d '!'#`
的な感じで
汚ないというのは、まあ容赦してくれ 伝統的にスクリプト実装だけど、効率のためバイナリに置き換えられてる場合も多々あるので、fileの結果を見た方がいいかも 分かりにくいと思うので補足>>903
例えばunknown-scriptが先の./hash-bang-pなら
中のコマンド置換は文字列
/usr/bin/echo true
を返す
外のコマンド置換でこれがコマンドとして実行され
true
が返る(はず) System V Release 2は1984年4月にリリースされたって書いてあるんだが
38年前かー。ファミコンのパックマンの発売年じゃん。
初代スーパーマリオの一年前のUNIX
そんなの使ってるなんてなんか可哀想w >>903
SVR2ならBourne Shellだからそれ動かないんじゃね? >>902
そういやperl4のConfigureって判別してたよなって思い出して、
っぃ… >>908
そんな古代のOS対応するだけ無駄、さっさと切り捨てろ
昭和じゃねー。もう平成だぞ。 単に$?を見るのはダメだったの?
本質はOSがshebangをサポートしてるかどうかの判定だから、やってみて戻り値見る行為以外ないんじゃないかな
>>903みたいのはzshが内部でexecve()の失敗後にやってるけど、判定が主題ならそのconfigureのやりかたを見てみたいな >>907
そうか、というか仮に動いても正しく動く保証は全く無いな…
長さ制限を除いても、#!機構のパースは一般にシェル言語と全く関係がないので(特に引数やクオート)
例えばlinuxの#!機構は引数は一つまでなので
#! /usr/bin/env -Scommand\_arg1\_arg2
みたいなものが書かれる
perl等も(独自の)似たようなワークアラウンド機構を持ってたはず
そのままシェル言語として通用する文字列が得られるのは
#! /path/to/command alnumonly
くらいな気がする その頃のUNIXだったら/bin/shじゃなくて/usr/bin/shとかも
考慮しないといけないのでは? >>912
そこまでワークアラウンドを積み重ねるくらいなら、もう潔く決め打ちで"分かりやすく"失敗して、ユーザーに適宜直してもらうべきだな
自分で言うのもアレだけど、>>903にSVR改修、パスサーチ、言語毎の#!機構用ワークアラウンドに対するワークアラウンド…
を加えていけば、一体どんなモンスターになるやら >>913
うん、で今は#!に対応してないUNIXなんてないんだから
やる意味ないよねって結論になる。 変な工夫を凝らして変死するのが最も厄介
>>899
必要かどうかはさておき少しだけ読みやすく
(hash-bang-p)
#!/usr/bin/true
false # or exit 1
if ./hash-bang-p; then
... >>910
perl5のConfigure出てきた
github.com/Perl/perl5/blob/blead/Configure
これのsharpbangって変数のあたり
でも、これ自体はmetaconfigが自動生成したやつだしな… >>899
-P Convention………lisperの『味』だぜ…… metaconfigのソース見ると実際にスクリプトを実行して戻り値で判定してるね UNIX板のシェルスクリプトスレの方がいいのだろうか…
>>908
レトロゲームをやりこむのに近い行為なのかもです レトロゲーム本体がないのにどうやって動作確認するの? macOSはUNIXだけど専用板あるし
UNIXなんてもう使われてない
BSDももうおしまい >>924
あとサーバー系もUNIXは終わってるよね
ハードウェアを作っているところが
ドライバを非公開にして、ハードウェアを
販売したいってところでしか使われてない 一般ユーザにとってはな
無知晒すのもいい加減にしろよ そのページはWebサーバ限定で、しかもUNIXは80.3%使用されてるって書いてあるけど…
仮にlinuxとBSDを抜いたとしても、
0.803×0.533=約40%は使われてる計算 >>929
アホはお前だろ。英語一文字も読めないのかよ どっちもどっち
unknownはlinux含むunix
linuxを除くunixがそこに何%含まれてるかは分からない
だからunixのシェアが0.1%とも40%ととも言えない どっちかわからんなら
分かってるのと同じ割合を割り当てろよ 基盤なunixは変わらず生き続ける
linuxは傍流でしかない、仕様策定上は。bashismで見られるようにw
linux使ってるだけのlinux中だろな。中学生な >>934
分かった分かった。
Linuxは生き残る
死ぬのはBSD UnixとSystemV Unix
このように言えってことだろ
分かってるって あるディレクトリの下にサブディレクトリがいくつかあって、それぞれのサブディレクトリの中にはファイルがいくつかずつある
このサブディレクトリ群内のファイルを対象に作成日時が新しいものから順に任意の個数を選んでサブディレクトリ名を含んだパス名を出力する場合どう書く? どう書く?どう書く?ど~う~書く?
君ならどう書く~? 適材適所ならシェルスクリプトの方が適してるでしょ? 自己解決した findのprintfオプションとsortとsedで出来た ども bashの実行中上書き動作ってどういう時に役立つの? Unix/Linuxは昔から実行中にファイルを書き換えられる
Windowsとは違う 超Geekぐらいだろな、役立つように使おうとするのは
機能としてではなく限られたメモリ上でどうするかでそうなったんじゃね
>>943
バイナリの正当な(?)実行ファイルもそうなのか?
あり得ないけど=今時のUnix系OSはそうはならない UNIX/Linuxにはアドバイザリロックしかないんだから
実行中にファイルは書き換えられる
バイナリ実行ファイルは、スクリプト言語とは違って
最初にメモリに全部読み込むってだけ そもそも、シェルやしな。
インタラクティブが前提なら必要なとこまでしか読んどらんやろから、自然とそうなるんちゃうか。 インタプリタっていうのは元々そういうもんだと思うけどね
一行ごとに解釈するものなんだから、必要ないところまで読み込む必要がない
最近のスクリプト言語は最初にファイル全体を解釈して
内部的にバイナリにしているような気がするけど
それもファイル単位で動的にファイルを読み込むこともあるし 昨年末にHP(が作成したスクリプト)が京大のスパコンデータを吹き飛ばした事故があったけど、あれも原因は「実行中のシェルスクリプト書き換え」だったはず 普通にバックアップ処理実行中に
プログラムアップデートするなって話だな >>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.
実装に先走って舵取りまでやりたいのかこいつら、傲慢もいいとこ exitやexecの先まで読まれるとtclやperlのように頭だけシェルスクリプトとして読まれて、読まれない部分にコードを記述するインタプリタや、到達しない部分をデータ置き場として使ってるスクリプトが困るような
まあ展望されている実装が十分賢くて、そこでシンタックスエラー出さないなら問題無いんだけど source another-file
${exitcmd}
こんなもん解析できるわけねー >>950
何言ってるの? opengroupはシェル開発者がやろうと思っていることを
妨げないようにしているだけ
シェルスクリプトのコンパイルであればBourne Shellの開発者がやろうとしたことだし
Korn Shellにはずっと前からシェルスクリプトのコンパイラがある
お前の意見を押し付けるな
傲慢はお前だろ >>950
誰が望むんだって、それただのラベルを使ったループの脱出じゃん
そういった拡張シェルを作りたい人もいるだろうし
お前は、将来の目をつもうとしてるのか?
シェルが改良されたら困ることでもあるのか?
まああるんだろうな。
新しいシェルを勉強したくない > ちなみに俺はexitの後に>>"$0"でデバッグ中のログ取りしてる、別にログファイル作るのめんどいしバッファ再読み込みでエディタにすぐフィードバックが得られる
珍妙な事やってるな(笑) >>951
単純にシェルスクリプトにシェルスクリプトとして解析できないものを埋め込んだら
コンパイルできないってだけだろ
頭固いよ(笑)
なんでシェルスクリプトのコンパイラは
どんなシェルスクリプトにも対応できなきゃ駄目だって
思っちゃうの?
【注意】以下のようなコードを書いたらコンパイルできません
って注意書きを書くだけでいいんだよ?
もっと柔軟な頭を作ろうね(笑) インタプリタを軽くした方が筋がいいと思うわ
dashもなだかんだでコマンドライン編集や規格に従いたくて対話機能落とせてないし
どうせスクリプティングにしか使われないんだから、規格なんて無視すればいいのにと思う 機能を削減したら互換性がなくなるだろ
規格準拠じゃなくて、互換性のためにやってる >>950
vi編集モードの指定がやけに細かいな
dashはemacsもヒストリもサポートしてるしむしろ対話シェルとして十分使える方で、普段対話使いしてる人もまあ居るかも
シェルスクリプトエンジンとしては、ttyに見せかけてvi/emacs風キーバインドを送って間接的にコマンドバッファ弄ったり、ヒストリ検索活用するシェルスクリプトが多いなら互換性の為に要るけど、要るかね?
対話用途の人も少なからず居るだろうからdashとしては出せなくても、名前を変えてシェルスクリプトエンジンとしてもっと特化した版があれば嬉しい シェルスクリプトなんてコンパイルしたところで外部呼び出しだらけだし大して速くもならんでしょ
恩恵あるのはビルトインだけでループぐるぐる回すベンチくらい >>960
> vi編集モードの指定がやけに細かいな
もしかしてPOSIXが仕様を決めたから
dashはその通りに作ってるとか思ってる?
vi編集モードとかemacsとか、それを最初にやったのはkshなの
dashやbashや他のシェルはそれを真似しただけ
POSIXはkshやdashやbashで移植性があるものを文書化しただけなの
> 対話用途の人も少なからず居るだろうからdashとしては出せなくても、
> 名前を変えてシェルスクリプトエンジンとしてもっと特化した版があれば嬉しい
自分で作ればいいじゃん?POSIXに準拠してないシェルを作ってもいいんだよ。
dashはPOSIXに準拠するという方針なだけ
機能を減らすことで何が嬉しいのか知らんけど/bin/shとしては使えなくなるだろうね。
別にbashをインストールしなきゃ対話的に使えないOSになってしまう >>961
×シェルスクリプトなんてコンパイルしたところで外部呼び出しだらけだし大して速くもならんでしょ
○外部呼び出しだらけのシェルスクリプトはコンパイルしたところで速くならない
他の言語のようにビルトインだけで作ればいいんだよ
作れるわけがない?
作れない理由を潰せば作れるよね?
シェルの将来としてそのようなシェルがあってもいい >>961
それを言ってはおしまいだけど、IFS決め打ちって文脈からパースについて楽できないかって話ね
しかし複合文は先読みでエラー出せることから分かるように、環境の更新や副作用起こす展開をしないループなら既に手抜きは可
長大なベタ書きならIFS決め打ちで結構削れるだろうが、そんなケチくさい努力に見合うとは思わない >>964
何の話してるの?
楽できる機能を搭載したシェル作ればいいだけじゃん? まああれだね
「POSIXが変なことを考えていて、コンパイラとかを作ろうとしてる」
と勘違いしているアホが居る
POSIXがどういうものかを理解していれば
「POSIXはコンパイラを作ろうとしているシェルがあることを知っていて
そういったシェルを将来作れるように考慮している」
が正しいとわかる じゃあ後追いでええのにな。
様子や実装具合を見ながら。
どうせ普及せんのやろし。w >>967
だから後追いじゃん?
POSIXが先に作ってる仕様なんてないぞ
どこにPOSIXがコンパイラの仕様を作ってる?
よーくみたまえよ 一部だけ認めるのでもまだ早い。
大半が実装してから共通項を整理するくらいでいい。 >>969
やっぱり理解が追いついてないか(苦笑)
1. シェルスクリプト用のコンパイラを作りました
2. この時点でPOSIX準拠になっていないといけない
3. 大半が実装してから共通項を整理する
大半が実装するまでの間、POSIX違反になっちゃいけないのよ
意味わかる?POSIX違反なコンパイラを作るな!って言われるでしょ
POSIXが正しいシェル間違ったシェルを決めるのは傲慢
POSIXは決まった以外ならどんなシェルでも許さなきゃいけない 訂正
POSIXは決まったこと以外であれば、どんなシェルでも許さなきゃいけない 「大半が実装するまでPOSIXでは認めない」
これが傲慢な考えだってわからないのは本当にヤバイよ
POSIXがルールになってるじゃん
「大半が実装しなくてもPOSIXはそれを禁止することはない」 >>950
例にしてもラベルの位置が先頭なのは思慮が足りなさすぎるな、予約語認識のセマンティクスとBNFに手を入れることになる
仮にねじ込むとすれば、inの部分で認識される
新予約語に続けてラベル名 for x of outerloop [in word+]
的な感じか
ofは適当だけど、既に予約されてて意味の通るトークンが流用できれば望ましい >>973
それ例じゃないからw
あんたこれPOSIXの提案だって思ってるでしょ?
こんな事も考えられるってことでだけだよ
そんなことに突っ込んでも意味ない どういう文法にするかはシェルを作っている人たちが考えることであって
「POSIXは仕様を考えません」ってスタンスは明確になっている まだ試してないけどfor x ofの時点でシンタックスエラー吐くのが普通だろうし、自由に選べるはず
C-style((..))のような拡張とも被らない >>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
ので、ラベルのようなあっても無くても困らないものでなく、もっと重要な拡張の為に取っておくべき > もちろん今のうちから予約しておくのは良い事
勝手に予約しないでください コマンドがファイルでありえる限りヌル文字と/以外なんでもありだし、本当に任意コマンドを受け取って呼ぶならcommand, type, envとかで全部問い合わせるか、クォートする必要があるな
ところで任意文字列のコマンドが既にダメなのは今更な事に気付いた、例えば
✗com=mand arg1 arg2…
✔\com=mand arg1 arg2...
これを流用して意味を為さない
=label
なんてどうかと思ったが、bash/dashはcommand not found返しやがる 不用心にパス区切へ使われがちな:はなるべく避けてるけど、名前空間の表現なんかでpkg:nameくらいは使いたい
末尾:という制限付きならまあ
とりあえずbashは関数も実行ファイルも普通に作れるしガン無視の模用、実効性は疑問 個々人が(覚えてたら)一応リスペクトしておくか、の積み重ねじゃね >>983
=は他のコンテキストでクオートする必要がないところが特異
任意文字がダメなのはコントロールオペレータやメタ文字、予約語もそう
当たり前だから忘れがちだけど、空白>|($&cを含んだコマンドを呼ぶならクオートする >>983
面白い挙動見つけたな
名前を受け取ってevalし、空でなければ普通に環境設定、空ならデフォルト動作として=cmdが呼ばれるとか
色々遊べそう
禍根はこうして産まれるんだなって 一応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として認識できないなら、コマンドとして検索すると間接的に示唆してるな
もちろん期待すべきではないが 名前が空になるのは大抵eval "$var=$val"のようなコードでのバリデーション不足だから、エラーにしてくれれば親切なのに
残念 挙動は揃ってるっぽいな
こんな時の為の明示的なunspecified
汚いから連想配列使えって?標準を示してくれればな 親切にエラーを投げても構わないよ、って意図はしばしば察せられるね
正直とても分かりにくいが
変数はダメ文字多いけど、頑張るならx$VARとか >>989-990
それがBourne Shellの動作だからね
POSIXはそれを明確化しただけ
さっきからずっとPOSIXに文句を言っているようだが
POSIXにごちゃごちゃ言うようなないようじゃないよ
そんなの意味ないからbashやkshの開発者に
変更してくれって言わないとだめ >>991
> 変数はダメ文字多いけど、頑張るならx$VARとか
え?それで何が防げると思ってるの?
少しよく考えた方がいい
無意味な話をしてる。 >>992
互換性を保つ必要があるわけだから
ここでごちゃごちゃ言ってもどうしようもないよね
POSIXに色々書いてあったとしてもそれは
後からでも変更できるので気にする必要はない ここに居る人は多かれ少なかれ利害関係者なわけだけど、その意識が欠けてる感じがする
俺は物言うエンドユーザー(いわゆるクレーマー)だけど
ニュースグループ、メーリス、バグレポートに直接クレーム付けるのが憚られるインフォーマルな話題やネタは大体ここから拾ってたりする
おまえらエッジケース見付けるのうまいしな
少なくともchetは丁寧に返信してくれるよ、他は知らん なんか大した実績もないクソ雑魚が
いきがってるなw >>998
まあ実績はないけど、言わんで困るのも俺だしな まあちゃんと日本語話せるようになれよw
お前の日本語は意味不明で誰も理解できんからwww このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 439日 3時間 31分 36秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。