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

■ このスレッドは過去ログ倉庫に格納されています
2019/07/01(月) 23:04:27.02ID:/rKj5XUf
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ:
シェルスクリプト総合 その29
https://mevius.5ch.net/test/read.cgi/tech/1537540487/
2019/08/04(日) 20:05:19.04ID:KSih4AJE
となるとMacは切り捨てだな
2019/08/04(日) 20:06:51.77ID:ZVJM9ExE
おお、lsにも-vオプションあったっけ
523515
垢版 |
2019/08/04(日) 21:06:16.73ID:zjBZp1dd
>>518
GNUのsort、-V オプション
ls | sort -V

これは便利!
2019/08/04(日) 21:11:25.12ID:WhAPGaK9
sort --help には
-V, --version-sort 自然な (バージョン) 数字順でソートする

って書いてあるけどさ、これセマンティクスバージョニングでの
比較にちゃんとなってるの?正確な仕様がわからん
2019/08/04(日) 21:14:26.03ID:ApCAdEzq
なんにせよ可搬性ないからあまり使わんほうがいい
526デフォルトの名無しさん
垢版 |
2019/08/04(日) 23:41:22.05ID:fspxWXLG
シェルスクリプトに可搬性期待するなって結論出たろ
2019/08/05(月) 00:49:19.74ID:uR0Am4u5
bashごと持って行けばいいんじゃね?
他のインタプリタ系の言語ってみんなそうしてるっしょ?
2019/08/05(月) 00:58:52.07ID:lQJxfKJu
>>526
馬鹿だなぁ。sortはシェルスクリプトじゃないよ。
sortコマンドだよ。可搬性がないのはsortコマンドだよ。
シェルスクリプトで実装すれば可搬性があるよ
2019/08/05(月) 01:59:22.26ID:053u+cPb
sortは-hもよく使うな
du -hc * | sort -hみたいに
2019/08/05(月) 02:53:17.73ID:IFzEkeeB
>>527
sortコマンドはBash組込みコマンドじゃないから関係ないんじゃ…
2019/08/05(月) 04:07:47.17ID:RegSSUKZ
busyboxをスクリプトに同梱して、
全部これに解釈させればいいじゃん
ashに加えて、よく使うコマンドも一緒についてくる
2019/08/05(月) 04:23:15.10ID:IFzEkeeB
いいじゃんと言われても…いいね。としか答えようがないw
2019/08/05(月) 06:43:25.45ID:IFzEkeeB
exitコマンドってexit $?とやってやらなくても前に実行したコマンドの終了コードを見てくれるんだな。
ずっとexit $?ってやってたわw
2019/08/05(月) 07:20:51.08ID:O6CFE/yb
if $? でやるより
&& || で分岐したほうが らしい 感じにならないか?
2019/08/05(月) 08:03:05.75ID:IFzEkeeB
>>534
ああいや。
埋め込みシェルスクリプト(←なんて呼べばいいのか知らんけど
実行形式のファイルで冒頭に書かれてることがある
そのファイル自身を伸長するシェルスクリプトのこと)
で使ってたのよ。
#!/bin/sh

< "$0" sed -n '5,$p' | unar -
exit $?
こっからZIP
↑みたいに。
2019/08/05(月) 11:46:23.87ID:MNXFY7cg
tputの存在理由はわかるが
現実的な問題として、どういう場合にtput使ってよかったって思える?
もうエスケープシーケンス決め打ちでよくね?
2019/08/05(月) 12:52:22.28ID:IFzEkeeB
clearコマンドがPOSIXで定められていないのをいいことに実装されていない環境がある。
そのときにtput clear。
2019/08/05(月) 13:19:56.72ID:MNXFY7cg
> 実装されていない環境がある。

「現実的な問題」っていうのはその実装されてない環境なんて、
今どきあるの?って話なんだよ。
2019/08/05(月) 13:23:05.75ID:MNXFY7cg
clearが実装されてない環境より
tputが実装されてない環境のほうが多くて、
tputを使うと逆に動かない環境の方が多くなっちゃう
例えばbusyboxとかalpine linuxとか
2019/08/05(月) 13:31:42.54ID:O6CFE/yb
which clear >/dev/null 2>&1 && echo has || echo 404
両対応書いておけばいい
2019/08/05(月) 14:26:42.83ID:MNXFY7cg
/usr/share/terminfoの中を見てみたが、
シンボリックリンクを抜かして1700ものファイルがあった。

なるほどこれは大変だ。だがその中でどれだけのものが使われているのだろうか?
またどれだけ違いがあるのだろうか?ほとんどは細かい(殆ど使われない)
機能の違いでしか無いのではないか?

大抵は色を変えるぐらいしか使わないだろうし、
それ以上使っても画面サイズとカーソル移動ぐらいだろう。
数パターンしか違わないのであれば、独自対応も可能だろう。

実用レベルで考えるとtputを使うことは、使わないよりもデメリットが大きい気がしている。
2019/08/05(月) 14:33:25.56ID:IMjI9HmJ
vt100, xterm 以外設定した覚えがないな
2019/08/05(月) 14:47:57.15ID:MNXFY7cg
おそらく端末名の後ろは細かいバリエーションだろうからと削ってみたら789種類にまで減った
それでも数が多すぎるかつこんなの誰も使ってないやろと思ってしまって
何が違うのか把握する気が起きないレベル

でもinfocmpとか便利だな。よし俺の中で方針が決まった。
もしこれらの端末に対応しなければいけない自体になったら、
プログラムで直接tputを使用するのではなく、tputと同じ引き数で関数を実行しますから、
それで出力するエスケープシーケンスは設定ファイルで書き換えられるって方式にしよう。

さしあたって、現状、色を変えるだけしかやっとらんのだがtput使う必要あるのかな?
2019/08/05(月) 14:55:51.10ID:uR0Am4u5
なんであるものを使わないんだろう
二段階認証おじさんみたいな頭の構造なんだろうか
2019/08/05(月) 15:27:49.43ID:MNXFY7cg
> なんであるものを使わないんだろう
書いたでしょ? tputコマンドがない環境が現実としてある。
2019/08/05(月) 15:54:00.38ID:MNXFY7cg
簡単なスクリプトを書いて、とりあえずcolsについて
データベースに登録されてる1700端末をすべて調べてみたが
すべてが 0x31 0x33 0x31 0x0a だった

boldだと非対応を除いて892端末。44パターン。結構違いがあるな
setafだと340端末、11パターン

まあtputを使うほうが楽だってのはわかるけど、エスケープシーケンスが違うのは
マイナー端末だろうし、数の割にパターン数は限られているので
完璧を求めたいなら別だけど使う環境で動けば良いわけで、tputを使用するのは過剰な気がするな。
2019/08/05(月) 15:55:50.50ID:IMjI9HmJ
tputがない環境って例えば何?
2019/08/05(月) 16:04:49.48ID:MNXFY7cg
む、/lib/terminfo/ 以下にも定義ファイルがあるのか
xterm-256colorがないのに使えると思ったら
まあ +40個しか変わらんけど
2019/08/05(月) 16:05:10.32ID:MNXFY7cg
>>547
書いたんだから上見ろ
2019/08/05(月) 16:11:29.93ID:IMjI9HmJ
まあいいけど日記はブログで書けや
2019/08/05(月) 16:18:56.02ID:MNXFY7cg
ブログねーしw ここはみんなのらくがき帳だ
2019/08/05(月) 18:58:04.34ID:7Al1V6ob
シェルスクリプトマスターの皆様
xxxxNN.txtというファイルが大量にあります(xxxxの部分はファイル名、NNの部分は0〜99の連番)
NNの部分が50未満ならxxxx50.txtにNNが50以上ならxxxx99.txtに一括でリネームしたいのですがやり方教えてください
2019/08/05(月) 19:10:26.82ID:AegVyuQi
xxxx の部分はファイルによって異なるって前提でOK?
2019/08/05(月) 19:15:29.15ID:7Al1V6ob
>>553
YES
2019/08/05(月) 19:19:16.45ID:MNXFY7cg
無理に頭の体操的なことをせずに、こんな感じでいいでしょ?

for file in *; do
 name=${file%[0-9]}
 name=${name%[0-9]}
 num=${file#$name}
 [ $num -lt 50 ] && num=50 || num=99
 mv "$file" "$name$num"
done
2019/08/05(月) 19:27:32.93ID:7Al1V6ob
>>555
ありがとうございます
早速試してみます!
2019/08/05(月) 19:28:09.53ID:MNXFY7cg
早速試すとか言ってるが、
適当に書いたからどうなっても知らんぞ。
2019/08/05(月) 21:05:22.75ID:O6CFE/yb
>>552
ファイル名に数字がまざってなければ
例ば[a-zA-Z]だったら
dry run は
| perl -pe 's{ \d+ }{ $& < 50 ? 50 : 99 }ex'
2019/08/06(火) 08:47:13.20ID:fNxvG1AN
ほとんど気にすることないと思うんだけどさ
みなさんが今まで携わってきたシステムでshが/bin/shにないシステムってあった?
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap10.html
ここによると/bin/shは既定されてない→つまり必ずしもあるとは限らない
みたいなんだけど、そんなシステムあるかね?

Solarisとかなら…と思ったけど/bin/shだったし。
2019/08/06(火) 10:09:19.90ID:9obbnMlM
Androidには/bin/shがないとか聞いたことあるな
2019/08/06(火) 10:19:48.23ID:4kzCwlOl
Androidはそもそも/binも/usrも無いな
mkshが/system/bin/shにある
2019/08/06(火) 10:27:23.06ID:9obbnMlM
Androidの環境ってよくわからん。
busyboxは採用して無くて、昔はtoolboxだったのが今はtoyboxを採用している。
しかしtoyboxのシェルであるtoyshは完成して無くてmkshを使っている。
という理解であってるんだろうか?
dockerfileないんかな?
2019/08/06(火) 17:00:21.88ID:g73t6D+3
Androidはヘッドレスでは立ち上がらんのじゃね?
昔見た限りだとinitスクリプト中でコケるんじゃないかと
2019/08/07(水) 00:56:40.08ID:3XS5MIC7
Toyboxなんてものがあるのか。
2019/08/07(水) 01:43:15.26ID:WK8NJ3/V
diffみたいに二つのファイルを開いて、一行ずつ交互に比較できないかな?
bash依存禁止で
566デフォルトの名無しさん
垢版 |
2019/08/07(水) 01:49:50.14ID:r57RWdCS
diff使えばいいじゃん
2019/08/07(水) 01:57:20.41ID:QJETJeRx
diff のアルゴリズムは有名だから
あとはもっと具体的にどうさせたいのかによりそう
2019/08/07(水) 02:03:50.19ID:WK8NJ3/V
誰がdiffしたいっていったよ?
2019/08/07(水) 02:43:40.37ID:fPg/gK/3
paste コマンド使うとか。見づらいけどw

$ paste -d '\n' file_a file_b
2019/08/07(水) 02:47:37.40ID:WK8NJ3/V
一旦質問を忘れて

同時に二つのファイルを開いて処理したい
2019/08/07(水) 02:48:31.68ID:WK8NJ3/V
処理の内容は自由に変えられる
2019/08/07(水) 02:56:33.93ID:fPg/gK/3
他のスクリプト言語を使う方が幸せになれる様な気がする
2019/08/07(水) 03:19:53.88ID:prHDAaSE
>>568
こんな奴に誰が答えたいと思うだろうか?
2019/08/07(水) 03:26:49.06ID:arV/Dy+D
またいつもの奴か
2019/08/07(水) 03:43:34.68ID:3XS5MIC7
どうしてこう知識のない奴ほど傲慢なんだろうか。
2019/08/07(水) 06:41:35.91ID:5FNsDR6i
POSIXシェルのみで全て書くという縛りプレイが好きなんだろうw
POSIXは最低限のインターフェースを規格化しているだけで、結局はプラットフォーム別に書くしかないのが現状だからな
bashがあるならbashで書けばいい
GNU拡張が使えるなら使えばいい
あるもんは使えばいいんだよ
可搬性の幻想に囚われると逆に生産性が落ちる
2019/08/07(水) 06:56:03.49ID:5FNsDR6i
>>570
そんなの何やりたいのかで答えは変わってくるだろ
漠然とした質問には漠然とした回答しか返ってこないぞ
2019/08/07(水) 07:11:20.44ID:aj+f89Vu
>>575
パソコンの大先生にありがち。知識は少しはあると自負のアンバランスからだな
2019/08/07(水) 08:36:36.73ID:QJETJeRx
awk で丸飲みしちゃえ
1ファイル1配列

メモリ節約なら
1行ずつ読むのをシンクロさせる
2019/08/07(水) 11:22:21.65ID:WK8NJ3/V
>>575
ほんとそれなw
できるのに、知識ないやつほどぐだぐだとレスをする
答えられないのを質問者のせいにする

exec 3<file1.txt
exec 4<file2.txt

read -r file1<&3
read -r file2<&4
echo "$file1 $file2"

read -r file1<&3
read -r file2<&4
echo "$file1 $file2"
2019/08/07(水) 11:28:44.82ID:3XS5MIC7
重症だなこりゃ
2019/08/07(水) 11:31:15.75ID:WK8NJ3/V
ちなみに>>580
一回目のechoはファイルの1行目、
二回目のechoはファイルの2行目が
ちゃんと表示されるからなw

お前ら勉強してちゃんと質問に答えられるようになれよ
中途半端な知識で満足するな
2019/08/07(水) 11:36:26.97ID:5FNsDR6i
>>581
覚えたてで見てほしくてしようがないんだよ
生暖かい目で見守ろうやw
2019/08/07(水) 11:37:40.18ID:WK8NJ3/V
などと、質問には答えずに
それでも悔しいからか、レスだけはするようで
585デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:41:40.99ID:9POPBXN5
すげえ嫌な感じの方法思い付いた。

まず二つのファイルの行数だけ wc -l で調べ、小さい方を max に入れておく。
n=1 にしてから max までループさせて、ループの中で awk を使って NR==$n の一行を双方のファイルから抜き出してそれぞれ別の変数に入れる。

なんてことをすると2つの(またはそれよりも多くの)ファイルから1行抜き出して何かをする事は可能だ。
しかし行が長くなればなるほど無駄な処理が増えて時間が掛かることは言うまでもない。
大変効率の悪い方法だ。
2019/08/07(水) 11:48:42.74ID:5FNsDR6i
>>582
それやりたいなら普通はpaste使うけどな
2019/08/07(水) 11:48:48.99ID:WK8NJ3/V
>>585
その効率の悪い方法を実装するとして、wcもawkもいらんのでは?
行数を数えるのも、特定の行を読み込むのもシェルスクリプトだけでできるし。

>>580のやり方、同時に2つのファイルを開いて処理する方法で
実現できないような場合には使えるかも。ファイルのサイズが小さいなら問題にならないし
588デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:48:50.45ID:9POPBXN5
>>580
おお。それでできるな。
589デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:51:13.86ID:9POPBXN5
>>586
あ、そうだね。
区切り文字とうするかだけの問題か。
2019/08/07(水) 11:53:37.08ID:WK8NJ3/V
>>586
> それやりたいなら普通はpaste使うけどな
残念ながらpasteでは自由な処理ができない

例えば、1つ目のファイルに書いてある命令を解釈しながら
2つ目のファイルを読み込んだり、他の処理をしたりとかね。
2019/08/07(水) 11:56:37.01ID:WK8NJ3/V
で、POSIXで簡単にできることを、答えられずに
他の言語でやれとか、自由な処理をしたいっていうのに
それを理解しない答えを返してる奴ら
質問者の俺自身に、完璧な答えを出された気持ちはどう?w
2019/08/07(水) 11:57:46.26ID:WK8NJ3/V
またいい問題を思いついたら、質問(?)してやるから
じゃーねーw
2019/08/07(水) 11:57:52.31ID:5FNsDR6i
>>590
だからやりたいことを先に言えよ
お前はシェルスクリプトの前に質問の仕方から勉強しろ
2019/08/07(水) 12:00:28.63ID:WK8NJ3/V
>>593
同時に二つのファイルを開いて処理したい
って言った。
処理の内容は自由に変えられる
って言った。

同時に二つのファイルを開く以外のなにも条件として出してない
それができれば、いろいろと応用が効く

特定のことしかできないdiffやpasteでは
処理の内容が変えられないだろ
2019/08/07(水) 12:03:18.97ID:5FNsDR6i
>>594
>>593
596デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:04:06.23ID:9POPBXN5
>>591
なんで自分でわかるのに質問したのか謎
2019/08/07(水) 12:06:48.70ID:5FNsDR6i
>>596
>>583
2019/08/07(水) 12:08:56.79ID:fPg/gK/3
うーん、、、こんな感じ?

$ paste -d '\n' file1 file2 | xargs -d '\n' -n 2 | sh

file1 と file2 の内容例

file1:
====
ls
cp
mv
====

file2:
====
.
x y
y z
====
599デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:15:06.92ID:9POPBXN5
あー。「どうだ俺はこんなにできるんだすごいだろう」みたいな。
じゃあ本当にやりたかった事は複数ファイル処理ではなくて自分の能力自慢か。
人から認められて承認欲求を満たしたいってことでもあるかな。
いつも人からバカにされてるから何かで人をバカにしたいというのもあるかも知れない。
合掌。
2019/08/07(水) 12:15:09.78ID:5FNsDR6i
>>598
後出し要件からするとそんな感じ
また要件変わると思うw
2019/08/07(水) 12:17:59.15ID:WK8NJ3/V
>>596
> なんで自分でわかるのに質問したのか謎

質問した時点では知らなかったよ?w
2019/08/07(水) 12:19:12.78ID:WK8NJ3/V
>>598
後出しじゃない用件を言うと、
処理したい内容を自由に変えられないといけない

要件は同時に二つのファイルを開いて
いろんな処理をしたいってことだけ

ま、もう答えは出したがw
2019/08/07(水) 12:21:45.21ID:WK8NJ3/V
>>599
最初に用件をちゃんといってるのに、例をいうとその例しかできない方法を出すし
その質問にたいする曲解を潰していくうちに、その時間で自分で調べて解決できてしまうんだから
どうしろっていうんだw
2019/08/07(水) 12:22:22.45ID:WK8NJ3/V
やっぱ「自決しました」で終わらせたほうが良かったか?
605デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:32:00.78ID:9POPBXN5
>>603
普通にわからなくて質問していてやがて自分でわかった場合、普通はそれまでに答えてくれた人に対するお礼をするしこういう方法で出来ましたと自分のやったことを書く。
君の場合なぜか答えてくれた人に対する感謝の念がない。書かれたことが間違いや見当外れのことであっても普通は書いてくれたというだけで感謝するものだ。
しないとするなら少なくともその質問は質問に偽装された何か別のものだ。
2019/08/07(水) 12:36:21.05ID:5FNsDR6i
>>604
teratailとかSOで叩かれてこい
2019/08/07(水) 12:37:21.72ID:WK8NJ3/V
>>605
いい加減、客様は神様です。はやめたほうが良いよw
608デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:42:23.91ID:9POPBXN5
>>607
言っている意味がわからない。何か特殊な宗教でも信奉しているのかね?
2019/08/07(水) 12:45:25.69ID:WK8NJ3/V
>>608
回答者のほうが偉いみたいな考え方。
質問者と回答者は対等です。
610デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:00:34.72ID:9POPBXN5
>>609
対等じゃないよ。金を出す側と受け取る側と同じだもの。同じわけがないじゃん。
君はなんでそんな現実と食い違う思想を持ってるんだ?それでは人とのトラブルになるだけで世の中渡っていけんだろう。
2019/08/07(水) 13:17:46.60ID:VwbuDBsd
>>610
どうやら日本の礼儀が理解できないようだ
今問題になっている隣国の人間なんだろう
2019/08/07(水) 13:23:21.21ID:WK8NJ3/V
日本の礼儀と隣国の話しかできないのが世界が狭いよな
613デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:27:24.72ID:9POPBXN5
>>611
何かを与えてくれたらお礼をするのは国に関係なくどこでも共通の礼儀だが、君はそれをしないばかりか与えてもらって当然と考えるとするならば、それは正に今の韓国と同じだね。
614デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:29:19.39ID:9POPBXN5
優遇して与えていた側に礼を言わないばかりか盗人猛々しいとでも言うかね?
2019/08/07(水) 13:31:40.13ID:WK8NJ3/V
ということで、質問に対して
答えを返した俺に感謝しろ
という話さ
2019/08/07(水) 13:37:09.23ID:5FNsDR6i
これ触っちゃあかんやつや
2019/08/07(水) 13:39:19.49ID:WK8NJ3/V
俺は別に自決しましたで終わらせても良かったんだが、
俺ができるってことを示さなければ、
シェルスクリプトで同時に二つのファイルを開けるってことも
知らなかったんだろうな
2019/08/07(水) 13:41:42.46ID:aj+f89Vu
>>616
それを触りすぎw
2019/08/07(水) 13:46:29.59ID:WK8NJ3/V
この先の人生、似たような問題に直面したとき、
今日の会話を思い出しながらも、なかったことにして
俺が回答したテクニックを使うのだろう
620デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:49:03.15ID:9POPBXN5
>>615
質問者は君自信だ。それに関しては君が君に感謝すれば良い。他の人は少なくとも同じ質問はしていないのだから君に感謝する必要はない。

という、普通の事が君にはわからないのか?発達障害か何かか?だったらしょうがないから形だけ他の人を真似て合わせろ。そうすれば無用なトラブルは減らせる。
2019/08/07(水) 13:51:39.12ID:WK8NJ3/V
ん?他の人って会話に参加してる人だけのことだと思ってるのか?
検索で見つけた人とかあるだろう。
相変わらず視野が狭いんだな。
■ このスレッドは過去ログ倉庫に格納されています