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

レス数が900を超えています。1000を超えると表示できなくなるよ。
1名無しさん@お腹いっぱい。2018/05/03(木) 17:54:23.25
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。
 bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています
 最新の仕様はこちらへ http://pubs.opengroup.org/onlinepubs/9699919799/
 (左上の「Shell & Utilities」 から参照することができます。)
・v7 shに一番近くて、現役(?)のshは、OpenSolaris由来のheirloom sh。
  http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
  http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
 質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう
前スレ シェルスクリプト総合 その26
https://mevius.5ch.net/test/read.cgi/unix/1489979246/

878名無しさん@お腹いっぱい。2018/07/09(月) 15:13:46.00
1990年代には確かにこういうプログラムもCで書いてたが、今では はやらんよ。
スクリプト言語とかJava VM系言語とかでCSVライブラリ呼ぶように書くのが普通。
もっと低レイヤの処理ならCも使うけど、業務システムにCを使うってのは、
開発効率が悪いせいで、ほぼ亡びた。

879名無しさん@お腹いっぱい。2018/07/09(月) 19:00:09.14
compgenによる補完候補の絞り込みですが
bashでは正常に動作するもののzshでは絞り込まれません。
なぜでしょう?

# bash 4.4.19 on Ubuntu 18.04
$ compgen -W "aaa bbb ccc" a
aaa

# zsh 5.5.1 on Ubuntu 18.04
% compgen -W "aaa bbb ccc" a
aaa
bbb
ccc

.zshrcでは
autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit
してます

880名無しさん@お腹いっぱい。2018/07/09(月) 22:19:36.10
>>878
すでに入ってるLL使うならわかるが、JavaVM入れるくらいならCでいだろ。

881名無しさん@お腹いっぱい。2018/07/10(火) 08:36:39.48
>>880
>>876は「java VMがインストールされてるなら」って書いてあるじゃろ。
つまりCSV処理のためにjava VM入れるんじゃなくて既に入ってるならって話。
入ってないなら交渉してスクリプト言語入れる方を推奨だな。

エンタープライズ系は静的型検査が欲しいので相変わらずjava VMな言語が強いのよ。

882名無しさん@お腹いっぱい。2018/07/15(日) 05:45:07.54
シェルスクリプトでwebpackみたいに結合して1ファイルにしてくれるものとか
babelみたいにトランスパイルすることで言語を拡張するものって無いかな

883名無しさん@お腹いっぱい。2018/07/15(日) 13:28:22.06
>>882
シェルアーカイブ形式とか?
file.sharという形で,ファイル後半に(圧縮した)バイナリーファイル,前半(というかヘッダ)に展開用シェルスクリプトとインストールスクリプトを書いておく)
最近のソフトウェアだとVMWare Horizon ClientsのLinux向けインストーラーがその形式だった。

884名無しさん@お腹いっぱい。2018/07/16(月) 09:08:44.64
>>883
別にバイナリファイルを動かそうって話じゃないよ
単にくっつけてくれればいいだけ

885名無しさん@お腹いっぱい。2018/07/16(月) 11:20:08.69
>>884
それがshar

886名無しさん@お腹いっぱい。2018/07/17(火) 14:15:20.69
>>885
だからぜんぜん違う
webpackみたいに1ファイルに結合するって話をしてる
結合しても結合する前と同じように動く
すこしはsharについて調べてきたら?

887名無しさん@お腹いっぱい。2018/07/17(火) 14:17:28.78
shar知らない人のために説明しておくと、
これは単なる自己解凍形式の圧縮ファイル形式に過ぎない

888名無しさん@お腹いっぱい。2018/07/17(火) 14:31:39.62
それよりwebpackとやらについて説明しておくべきだったろ
聞き方が悪い

889名無しさん@お腹いっぱい。2018/07/17(火) 14:59:08.62
名前出てるんだから調べればいいだけだろ

890名無しさん@お腹いっぱい。2018/07/17(火) 15:01:52.39
なんで聞く側が偉そうなんだよって話だろ

891名無しさん@お腹いっぱい。2018/07/17(火) 16:41:05.27
どう使いたいかとかわからんのにな
>>887って言ってるけど、得られるのは自分でそれを使ってダイレクトにも頑張ればできる範囲だし

892名無しさん@お腹いっぱい。2018/07/17(火) 18:43:00.23
webpackはCのプリプロセッサのincludeみたいなやつだよ

893名無しさん@お腹いっぱい。2018/07/17(火) 19:48:43.74
バンドルじゃないの。macOSのバンドルのようなのを単一ファイルでの
単にincludeだったらシェルスクリプトにcatでくっつければええやん。目的は単一のファイルにしたいだけなんだから
バンドルなんだからバンドルをハンドルするヤツが必要じゃないの。んなのはshar使って自分で作ればってとこじゃね

894名無しさん@お腹いっぱい。2018/07/18(水) 07:15:49.95
webpackとかbabelとか覚えたてのキーワード並べてみたかったんでしょ
そんなのが必要になる状況がクソなんだがなw

895名無しさん@お腹いっぱい。2018/07/18(水) 10:45:31.69
>>891
> >>887って言ってるけど、得られるのは自分でそれを使ってダイレクトにも頑張ればできる範囲だし
自分で頑張ればできるって話なら、ファイル結合なんだからcatでもできるよ?
自分で頑張ればいいだけ。結合されても大丈夫なようにコードを書く必要があるけどな

その頑張るのが面倒だからツール使うんだろう?

ちなみにsharなんていらない。だってこれ目的を満たすためのツールじゃないから
自分でcatで頑張る+圧縮もしたいなーって思った時にオプションで使えるかもしれないツール

896名無しさん@お腹いっぱい。2018/07/18(水) 10:47:00.38
>>894
単一のファイルで何千行も書きたいの?

897名無しさん@お腹いっぱい。2018/07/18(水) 10:48:08.70
ちなみにsharの問題は展開しないと使えないって所
ルータのような書き込み回数に制限があるシステムでは致命的

898名無しさん@お腹いっぱい。2018/07/18(水) 10:48:51.53
あと展開のためのコマンドが入ってない可能性もあるしな
ファイル結合するだけなら、外部のコマンドにも依存しない

899名無しさん@お腹いっぱい。2018/07/18(水) 12:29:11.73
シェルスクリプトは実行可能なままファイル結合する必要性があんまりないってこと
そんなのとかトランスパイルとかが必要になるJavaScriptを指して、クソだなって言われてるんじゃない?

900名無しさん@お腹いっぱい。2018/07/18(水) 14:24:18.43
てゆうかそれ以前に、そんな長いプログラムをシェルスクリプトで書いちゃいかんやろ。
他の言語を使うべき。

JavaScriptくらい高級な言語ならアリだけど。

901名無しさん@お腹いっぱい。2018/07/18(水) 19:30:47.19
ディレクトリ A の中のファイルを全部
ディレクトリ B の中の同名のファイルと diff を撮りたいんですけどどうすればいいですか
xarg で1つの引き数を渡す方法しかわからないのでおねがいします

902名無しさん@お腹いっぱい。2018/07/18(水) 19:32:58.08
diff -r A B
でいいのでは?

903名無しさん@お腹いっぱい。2018/07/18(水) 20:29:52.99
少しはggるとかしてからここに恋や

904名無しさん@お腹いっぱい。2018/07/18(水) 21:00:07.83
その前にmanすれ

905名無しさん@お腹いっぱい。2018/07/18(水) 21:33:29.76
システムのスクリプトにも参考になるものがたくさんあるよね。zgrepとかzdiffとか
linuxだけどlddがシェルスクリプトだったのには驚いた

906名無しさん@お腹いっぱい。2018/07/18(水) 21:51:54.45
bashのHISTTIMEFORMATを設定した環境だと
sshログアウトしてもbgプロセス消えないみたいなんだが
なんでなん?

907名無しさん@お腹いっぱい。2018/07/18(水) 22:33:43.46
設定してなくてもsshログアウトしてもbgプロセス消えないけど、うちでは
他の設定じゃね

908名無しさん@お腹いっぱい。2018/07/18(水) 23:31:51.58
うーむ
会社の環境だとその設定の有無で変わったんだけど
今vmでcentのminimal立てたら設定なしにbgプロセス生きてた

何か勘違いしてるのか

909名無しさん@お腹いっぱい。2018/07/19(木) 00:16:48.11
https://serverfault.com/questions/117152/do-background-processes-get-a-sighup-when-logging-off
だって。ちょい昔からデフォで子プロセスにHUP送らなくなってるんだなあ。OSやディストリによってデフォが違うだろうけど

huponexitオンにして、HISTTIMEFORMATを設定してもbgプロセスは消えるねえ

910名無しさん@お腹いっぱい。2018/07/19(木) 09:21:29.33
case文で,Bash特有の高速化オプションとかありませんかね。

911名無しさん@お腹いっぱい。2018/07/19(木) 10:02:38.02
>>910
高速化できるんならオプションじゃなく最初からそうしてると思うが、
さらに、高速化が必要なほど遅いcaee文とは?

912名無しさん@お腹いっぱい。2018/07/19(木) 10:34:16.62
>>902
Aにあるファイル名だけ比較したいんです
Bのなかにはほかにもファイルがあったりするので
diff A/$f B/$f
とか場合によっては
diff A/$f B/*/$f みたいなことがしたかったのです…

ls なり find なりの出力ファイル名を変数に取り出すのってやっぱり難しいんですね
諦めます
レスありがとうございました

913名無しさん@お腹いっぱい。2018/07/19(木) 11:14:05.74
お題としてはちょっと楽しめると思うけど、諦めちゃうのか

914名無しさん@お腹いっぱい。2018/07/19(木) 11:19:41.98
find A -type fして、それぞれbasenameとって、find B -name filename -exec hogeってかんじかな。
B側で何度もfindするのを減らしたいけど、キャッシュされればそれほど負荷じゃないか。

915名無しさん@お腹いっぱい。2018/07/19(木) 12:11:39.09
diffの話ついでに
(GNU) diffでディレクトリごと比較したときに、一方のディレクトリにのみあるファイルを無視するオプションってある?
diff -r /dirA /dirB | grep -v 'にのみ存在'
とやればまあ大抵の場合解決するんだけども、たまたまあるファイルの変更箇所に「にのみ存在」っていう文があった時に
困るので、できればオプションで解決したい。

916名無しさん@お腹いっぱい。2018/07/19(木) 12:28:48.82
LANG=Cで^Onlyにマッチさせてはじく

917名無しさん@お腹いっぱい。2018/07/19(木) 12:35:37.30
diffの出力って行頭の文字が重要なのに、
これを無視した日本語ロケール作者は反省するべき。

918名無しさん@お腹いっぱい。2018/07/19(木) 12:53:00.49
結果に対してsedで…ってのはさすがに無駄だな

919名無しさん@お腹いっぱい。2018/07/19(木) 12:57:00.83
>>916
ああなるほど。
diffの出力結果では行頭は変化を表わすところだから
その行頭を除けばいいね。

920名無しさん@お腹いっぱい。2018/07/19(木) 15:19:36.24
詳しい解説サンクス

921名無しさん@お腹いっぱい。2018/07/19(木) 20:13:49.97
>>909
サンクス
俺の勘違いだったっぽい

922名無しさん@お腹いっぱい。2018/07/20(金) 01:50:52.37
>>900
> てゆうかそれ以前に、そんな長いプログラムをシェルスクリプトで書いちゃいかんやろ。

行数で使う言語を決めるなや

シェルスクリプトは、コマンドの連携処理を一番シンプルに書くことができる言語
シェルスクリプトが適している問題を、長いからという理由で他の言語を使うともっと長くなる

なぜ非効率な言語を使うのか?

923名無しさん@お腹いっぱい。2018/07/20(金) 02:03:28.48
はいはい

924名無しさん@お腹いっぱい。2018/07/20(金) 06:54:58.07
この引用符…あっ(察し

925名無しさん@お腹いっぱい。2018/07/20(金) 07:21:43.92
引用符?

926名無しさん@お腹いっぱい。2018/07/20(金) 12:12:45.33
>>922
まさにシェルスクリプトがプログラム間連携のための言語だからだよ。
1000行以上にも及ぶ複雑なプログラム間連携処理を
シェルスクリプトで書く状況ってのは
モジュール分割に失敗してる可能性がきわめて高い。
100行くらいの単体でも十分に使えるシェルスクリプトが10個ならば問題ないが。

シェルスクリプトは現代的プログラミング言語の持つ数々の抽象化機能を
欠いていて大規模プログラミングに向かないことは常に意識するべき。

927名無しさん@お腹いっぱい。2018/07/20(金) 16:50:00.03
仕事でならな。個人的なのでもそういう学習習得意欲がないんだったら馬の耳に念仏かと

928名無しさん@お腹いっぱい。2018/07/20(金) 20:11:37.10
ケンカはやめて(><)

新着レスの表示
レス数が900を超えています。1000を超えると表示できなくなるよ。
レスを投稿する