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

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

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

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

関連スレ
・【Bash】Windows Subsystem for Linux【WSL】11
https://mao.5ch.net/test/read.cgi/linux/1627507889/
・Bashでプログラミング [転載禁止](c)2ch.net
https://mao.5ch.net/test/read.cgi/linux/1443885102/
・シェルスクリプト総合 その28
https://mevius.5ch.net/test/read.cgi/unix/1533154936/
・zsh その7
https://mevius.5ch.net/test/read.cgi/unix/1337844883/
・過去UNIXで使われていた ksh というシェルについて
https://mevius.5ch.net/test/read.cgi/unix/1582358403/
・【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net
https://mevius.5ch.net/test/read.cgi/unix/1443103705/
・おまえら! shell は何を使っているんですか?
https://mevius.5ch.net/test/read.cgi/unix/1012330865/
2021/12/14(火) 19:34:10.98ID:sz49PmUD
>>343
だから、それ全部、うん だってw そして書いてあるってw

お前が>>330,331と出してきてるんじゃないか
(またその中からもトンチンカンに一部抽出したりしてw)
2021/12/14(火) 19:34:30.12ID:/wewuKga
書いてないことを自分の都合のいいように解釈して突っ走るところもそっくりだ
2021/12/14(火) 19:34:50.92ID:sz49PmUD
>>344
いつもの 自己紹介 か...
ほんとすげえなあ、お前はw
2021/12/14(火) 19:34:51.68ID:/wewuKga
>>345
だから翻訳しておまえに教えてやっただろ
書いてないと
2021/12/14(火) 19:35:59.31ID:/wewuKga
name=value
: $(($name = 123))
echo $value

これよんで、

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

なんて質問するのも頭が悪い
2021/12/14(火) 19:36:18.40ID:sz49PmUD
>>346,348
いつもの 誤魔化 しかよ
つくづくだな

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

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

反論はあるか?
2021/12/14(火) 19:38:15.35ID:/wewuKga
ホントなんでこんなバカなんだろうな
2021/12/14(火) 19:38:33.15ID:/wewuKga
英語というか、規格書の読み方をっ勉強したほうがいいぞ
2021/12/14(火) 19:42:47.04ID:sz49PmUD
>>351,352,353
>POSIXにはname変数の中身が整数定数でないときに
>どうなるかの挙動が書いてない
なに言ってるの? name = 123 この部分だろ?
name変数の中身が整数定数 なんて関係ないぞ
コンピューターサイエンスw的に、型が無い言語なら当たり前的にもな

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

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

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

name=value
: $(($name = 123))
echo $value
2021/12/14(火) 19:44:44.42ID:/wewuKga
> If the shell variable x contains a value that forms a valid integer constant,

読めないんだろうなぁ

はい、翻訳
シェルの変数xが、有効な整数定数を構成する値を含み、
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が実行されるだけ
2021/12/14(火) 19:45:36.95ID:/wewuKga
「その後は普通にvalue = 123が実行されるだけ」と書いていない
2021/12/14(火) 19:45:41.12ID:sz49PmUD
>>355
じゃあ、お前の言う
>POSIXにはname変数の中身が整数定数でないときに
>どうなるかの挙動が書いてない
ってどこの部分やねん

お前は他人の文の意味を読めなさすぎ、のくせによく言うよを繰り返しすぎだな
2021/12/14(火) 19:51:21.66ID:sz49PmUD
>>356,358
= の左辺には関係ないとわかりそうなもんだが
というか、そのトンチンカンに取り出した一部ではない全文が何を説明したいのかわかってないだろ
お前は他人の文の意味を読めなさすぎ
2021/12/14(火) 19:57:45.01ID:/wewuKga
>>357
先にパラメータ展開が行われるからこれでいいのか
なるほど

> ID:sz49PmUD
あ、きみ、もういらない
2021/12/14(火) 20:15:07.62ID:/wewuKga
POSIX準拠じゃないのはこれか

name="1+2"
echo $(( name ))
2021/12/14(火) 20:16:20.29ID:/wewuKga
今までの流れからすればこう書いたほうがいいね

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

name変数の中身が整数定数でないときに
どうなるかの挙動は書いてない
2021/12/14(火) 20:32:34.85ID:2RbqpbYV
シェルスクリプトで小数演算
dc ではいけないのか?
365デフォルトの名無しさん
垢版 |
2021/12/18(土) 21:47:26.51ID:ThKMmio5
文字の長さに応じていい感じにタブの個数調整してくれる素敵なワンライナーとかない?
2021/12/19(日) 00:43:08.09ID:1P9anxgU
ワンライナーじゃなくてコマンドだろ
だいたいタブ個数調整と言われて
仕様がわからないとなんとも言えん
2021/12/19(日) 04:58:32.60ID:Q8lTA8Fy
unexpand
2021/12/25(土) 20:40:43.43ID:62MjaTIU
>>365
仕様をはっきりさせろ。
簡単にできそうで暇だったら俺が作る。
369デフォルトの名無しさん
垢版 |
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で分岐させてなんとかしたけどもっと上手いことできるなら頼む
370デフォルトの名無しさん
垢版 |
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以降は揃ってるつもり
2021/12/25(土) 22:27:57.12ID:qPDC9gWr
printfのが簡単なんじゃないの?
372デフォルトの名無しさん
垢版 |
2021/12/25(土) 22:32:53.73ID:o6Yb7nqK
ifとprintfでやった
373デフォルトの名無しさん
垢版 |
2021/12/26(日) 01:41:37.96ID:7bx5KWMB
>>370
スペース区切りの複数単語が1行に入っていて1番目と2番目の間の空白を調整して2番目が全行で同じ位置から始まるようにするってことね。
2021/12/26(日) 01:44:16.01ID:7bx5KWMB
あ、ちょっと違うか。2番目以降は固定で決まっているから1番目の単語だけ読ませてその後ろのタブを何個付加するかの問題か。
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
$
2021/12/26(日) 02:14:02.08ID:7bx5KWMB
ただし、UTF-8で複数バイト文字混ざりだと画面上の幅とバイト数が一致しなくて失敗する行が出てくるだろうな。
2021/12/26(日) 02:30:31.24ID:Opbh/M6O
スレタイ読めよ
378デフォルトの名無しさん
垢版 |
2021/12/26(日) 06:24:53.12ID:7bx5KWMB
>>377
シェルだけでワンライナーにしろってか?可能な感じはするが、長くなりそうだな。ちょっと君試しに作ってみなよ。
2021/12/26(日) 06:55:50.56ID:Guj/6jti
いいかげんワンライナーなんてものからは卒業すべき
あれは実用的ではない
2021/12/26(日) 07:00:58.21ID:Guj/6jti
だいたい位置揃えならcolumnコマンドを使えばすむ
cat /etc/hosts | column -t
381デフォルトの名無しさん
垢版 |
2021/12/26(日) 08:08:53.29ID:7ywlyW9o
columnコマンドなんてあったのな
これしゅごい
382デフォルトの名無しさん
垢版 |
2021/12/26(日) 09:30:37.45ID:JgxQVN1x
>>378
スレタイ読めよ
383デフォルトの名無しさん
垢版 |
2021/12/26(日) 12:47:31.30ID:N3NYq5+A
プログラム技術。
384デフォルトの名無しさん
垢版 |
2021/12/26(日) 12:59:08.59ID:VAEhq19p
すれたい
2021/12/26(日) 13:59:45.22ID:0AMzbiZh
第一フィールドは20文字の決め打ちで

awk '{printf "%-20s %s", $1, "IN A 127.0.0.1\n"}' test.lst
386デフォルトの名無しさん
垢版 |
2021/12/26(日) 17:10:00.49ID:NwCcamJz
シェルではないね
2021/12/26(日) 17:57:01.68ID:FJp/KqIP
>>375
酷すぎるwww

>>380
>>385
既存のコマンドでスマートに解決できるのになw
2021/12/26(日) 20:01:39.02ID:nf0VENp6
columnはPOSIXじゃない!
よってawkで実装しなければいけない!
2021/12/26(日) 20:07:09.32ID:stZFhmVl
>>388
っスレタイ
2021/12/26(日) 21:01:43.80ID:NGc68XAG
フィルタープログラムはシェルスクリプトには必須だよ
391デフォルトの名無しさん
垢版 |
2021/12/26(日) 23:55:43.97ID:7bx5KWMB
>>380>>385
TABになってないじゃん。
392デフォルトの名無しさん
垢版 |
2021/12/26(日) 23:56:34.73ID:7bx5KWMB
>>387
既存のコマンドで丁度良くTAB入れるやつは何てコマンド?
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 はあんまり使わないよね
2021/12/27(月) 01:51:55.20ID:4XXPAYbv
>>393
第一フィールだけやるな
50文字固定にするな
awkで実装したって劣化版になるだけやろ?
columnをインストールすればいいだけやん
395デフォルトの名無しさん
垢版 |
2021/12/27(月) 02:06:52.16ID:4gZrwhe1
>>393
unexpand -a だと全ての空白を対象にしてTABに置き換えようとするためにうまく行かなくなることがあるのでは?

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

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

>>397
それをするのに丁度良いコマンドはあるの?
unexpand -a では全スペースが対象になってしまって駄目かも知れないわけだが。
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
402デフォルトの名無しさん
垢版 |
2021/12/27(月) 22:40:58.39ID:6GChlJ/6
>>401
ありがとう
2021/12/28(火) 01:16:53.28ID:JDHjDqJz
汚らしいパールのワンライナーに比べたら多少洗練されたようだな
2021/12/28(火) 12:30:02.74ID:IE5w4ImF
>>400
> unexpand -a では全スペースが対象になってしまって駄目かも知れないわけだが。

駄目だって事例提示してみ?
2021/12/28(火) 14:14:41.00ID:l3lJRmOp
columnは知ってたけど-Lオプションは知らなかった
2021/12/28(火) 14:39:23.17ID:GaScW5/W
columnに-Lオプションなんてあるの?
2021/12/28(火) 19:18:04.81ID:53pt8mb/
UNIX哲学
2021/12/28(火) 23:09:44.65ID:5lZUdhkB
POSIX原理主義者「POSIXにはないコマンドをawkで再実装した」

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

POSIX原理主義者「・・・」
2021/12/28(火) 23:13:32.40ID:l3lJRmOp
>>406
wcの-Lだよ
-lしか使ってなかった
2021/12/29(水) 00:32:57.69ID:fFVPrxR2
debianのcolumnに比べてredhat系のcolumnのオプションが随分と充実してる
411デフォルトの名無しさん
垢版 |
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"
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 のファイルを削除し
てしまいました。
2021/12/29(水) 03:16:45.01ID:gf7++b5l
あぁ、やはり Lustre はダメだなぁ…
2021/12/29(水) 03:21:51.59ID:9nMYZ2sv
機器の不具合かのように書いてるけど馬鹿による人災じゃねーか
2021/12/29(水) 04:05:13.87ID:DIjHY86S
シェルスクリプト以外ではほとんど見られない性質ではあるからなあ。
たしかに人災とも言えるけど。
416デフォルトの名無しさん
垢版 |
2021/12/29(水) 04:51:32.06ID:Uqmbe8qT
シンボリックリンクで新しいバージョンのプログラムにリンク先切り替える方式にしておけば被害は防げたかも知れないな
2021/12/29(水) 09:47:12.44ID:aqWkCMvZ
xargsは強力だよねー
全然使いこなせねーわ
2021/12/29(水) 10:35:20.64ID:HbjA8KL2
Linux の場合プログラムは起動時に全てメモリに読み込まれるから
稼働中にプログラムを差し替えても OK って考えて実際に差し替えたら
メモリ上の古いプログラムがファイルシステム上の新しいモジュール
ファイル読もうとして動作不良になったことがあったなあ
2021/12/29(水) 10:53:37.16ID:yFPIHMKS
この挙動ってinodeが同じまま書き換えたから起こったんだよね?
inode変わるファイル更新なら起こらないよね?
2021/12/29(水) 11:28:25.09ID:DIjHY86S
>>419
更新手順が更新されるんやろなあ。
既存ファイルに直コピーが禁止になって、新規ファイルを作成後に既存名に改名とか?
2021/12/29(水) 11:33:56.17ID:EOkSZQC4
リリース手順の考慮不足以前にfindを使った削除の運用自体に問題がある
ちゃんと金払ってまともなもの作ってもらわないと

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

xxxxrm / が rm / と解釈されることだってある
423デフォルトの名無しさん
垢版 |
2021/12/29(水) 13:53:35.50ID:kCXooe0G
/LARGE0${undefined}ってこと?
2021/12/29(水) 15:06:25.94ID:W7/CHwWQ
>>418
>Linux の場合プログラムは起動時に全てメモリに読み込まれるから

誰に騙された?
2021/12/29(水) 15:11:30.51ID:1N8ukzHQ
https://zenn.dev/mattn/articles/5af86b61004bdc
やっぱりinodeが変わってればokだったみたい。
mvとか、installとか使って反映しておけば回避できてた模様
2021/12/29(水) 15:31:39.64ID:V1sEjw5U
門外漢なんで純粋に知りたいんだけどこのbashの実行中の書き換えも書き換えたとこから逐次実行する仕様って歴史的経緯によるもの?もしくは
有効に活用できるケースがたくさんあるから意図して実装している?
2021/12/29(水) 16:23:06.17ID:bBNK3YsU
Lustre の checkpoint 機能は使ってなかったのかな?
428デフォルトの名無しさん
垢版 |
2021/12/29(水) 17:29:01.73ID:wwN1RbRp
Linuxはホットパッチが売りなので。
2021/12/29(水) 17:40:55.16ID:I8/QQkF4
https://stackoverflow.com/questions/2285403/how-to-make-shell-scripts-robust-to-source-being-changed-as-they-run
2021/12/29(水) 17:43:56.77ID:Y+wm1ikU
>>422
今回のにそれ関係ある?
2021/12/29(水) 18:01:13.94ID:tast0kyj
規模は違えど今回の事例と同様の体験をした人・組織は少なくなさそう
2021/12/29(水) 18:01:34.74ID:o6aVS5Lj
inode云々は問題の表層でしかない
実行中のスクリプトが新しくなったからといって77TBものユーザーデータをサクッと削除しちゃえるのがおかしい
何重にもガードできているのが当たり前の案件
2021/12/29(水) 19:12:14.86ID:DIjHY86S
>>426
あくまで「シェル」なんやし、入力を逐次実行するのが仕様やろ?
2021/12/29(水) 19:12:44.47ID:DIjHY86S
>>432
コストとのバランス。
2021/12/29(水) 21:10:55.07ID:t8aruUm+
スパコン系の人達は運用周りのリテラシーすごく低い
シェルスクリプトしか知らない人達よりもひどいくらい
2021/12/30(木) 00:46:59.13ID:IL1LVlOR
>>434
ファイルの削除処理はJavaで作ればいいんちゃいます?
ログもしっかり残してさ
2021/12/30(木) 01:04:22.58ID:v9gi5gW5
Javaが出てくる意味が分からん
2021/12/30(木) 01:12:51.79ID:IL1LVlOR
Javaで作れば安全だからです!
439デフォルトの名無しさん
垢版 |
2021/12/30(木) 01:25:09.88ID:TO85sxcb
log4jで消そう
440デフォルトの名無しさん
垢版 |
2021/12/30(木) 01:49:09.54ID:wfs2tbs7
perlのワンライナーでやるべき
2021/12/30(木) 02:02:44.37ID:bPzpLvLZ
>>425
installコマンドを使わないバカが多いからなあ
2021/12/30(木) 02:05:00.83ID:bPzpLvLZ
>>426
bashそのものじゃなくてスクリプトの方だぞ
2021/12/30(木) 02:15:01.93ID:IL1LVlOR
>>441
installコマンドでも同じなんだが
こういう本物の馬鹿が多いからなあ
2021/12/30(木) 02:25:12.29ID:IL1LVlOR
>>426
bashに限らずevalが使えるスクリプト言語はどれも似たようなもの
その方が効率がいいから

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

書き換えたところから実行する仕様とかじゃなくて
読み込み中にファイル内容が書き換わっただけ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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