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

■ このスレッドは過去ログ倉庫に格納されています
2021/02/25(木) 09:20:14.64ID:ZyJLXTlk
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。

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

関連スレ
・【Bash】Windows Subsystem for Linux【WSL】9
https://mao.5ch.net/test/read.cgi/linux/1607589861/
・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/02/25(木) 09:20:36.91ID:ZyJLXTlk
・特記なき場合、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ページや各種リンクを見ましょう
・ワイルドカード・パターンは正規表現ではありません。正規表現の話題は正規表現スレへ
・シェル芸とシェルスクリプトは全く異なります
・シェルスクリプトのことをシェルってゆうな
2021/02/25(木) 18:11:17.11ID:w3Ud6BUK
知ってるガススタのことだよね
2021/02/26(金) 02:56:16.05ID:BSvPs2+3
資源メジャーをカススタとか、視野の狭い奴は生きてて恥ずかしくないのかな
2021/02/28(日) 14:32:38.25ID:BgTYpoJY
なんだか誤解を招く表現ばかりだけど、
https://gigazine.net/news/20210227-posix-parallel-shells-xargs/

2GBをzip圧縮するような重たい処理を並列化する場合は、pthreadよりxargsのほうが、"僅かに"有利なようだ
2021/02/28(日) 14:53:29.82ID:797yScED
xargsやparallelのほうが簡単
job control的にはparallelのほうが優れてたはず
2021/02/28(日) 14:54:49.97ID:JYcgL82Q
xargsってPOSIXでは作れない機能でも使ってるの?
xargsってFreeBSDでもmacOSでも動くよね?
2021/02/28(日) 15:01:05.15ID:XNBptB7O
>>5
> 2GBをzip圧縮するような重たい処理を並列化する場合は、pthreadよりxargsのほうが、"僅かに"有利なようだ

当たり前じゃね? スレッド切り替えのオーバーヘッドがないんだから
マルチコア(マルチCPU)なら複数プロセスで実行したほうが速いでしょ?
2021/02/28(日) 15:07:08.34ID:XNBptB7O
つまりこれはマルチスレッド vs マルチプロセスの話で
一般的にはマルチスレッドの方がパフォーマンスは良いが
マルチスレッドだと共有リソースの排他制御などをする必要があるから
共有リソースがない場合はマルチプロセスのほうがパフォーマンスが良くて
POSIXとはなんの関係もないよねって意味ね
2021/02/28(日) 15:11:12.46ID:XNBptB7O
>>5
> 2GBをzip圧縮するような重たい処理を並列化する場合は
2GB・・・関係ない
zip圧縮・・・関係ない
重たい処理・・・関係ない

> pthreadよりxargsのほうが、"僅かに"有利なようだ
xargs・・・関係ない

共有リソースがなくて排他制御をする必要がない処理を並列化する場合は
マルチスレッドよりマルチプロセスで実装したほうが、"僅かに"有利なようだ

これが正しいかな
2021/02/28(日) 15:15:22.13ID:0S62sz9G
POSIXによって能力を制限されてるって書いてあるけど

https://linuxjm.osdn.jp/html/LDP_man-pages/man7/standards.7.html
> POSIX.1c
> IEEE Std 1003.1c-1995. POSIX スレッドインターフェースについて記載している。

POSIXスレッドは1995年?ぐらいに登場した新しいPOSIXで
xargsで使われてるマルチプロセスはずっと前から使えるPOSIXじゃん?
POSIXで実装されてるのにPOSIXで能力を制限とか意味わからん
2021/02/28(日) 15:21:32.20ID:VQYtUoBE
>>8
やりかたしだいやろ。
Apacheなんかは、マルチプロセスモデルよりもマルチスレッドなイベントモデルのほうが(一部を除いて)パフォーマンスが高いとされてる。
2021/02/28(日) 15:31:23.99ID:N8V7r+yZ
Apache(とか)はfork+execのオーバーヘッドが無視できないってのだな
処理単位が1秒以内とかで済む、処理単位がガシガシ来るなら当然

でもまあ>>8は間違ってるかな。>>9で訂正してるようだけど
2021/02/28(日) 16:02:00.25ID:CBZyHOS6
外国にもPOSIXを勘違いして解釈したPOSIX中心主義みたいな奴がいるんか?w
POSIXは主にC言語のインターフェースなんだから、POSIXで標準化されたコマンド以外でも
POSIXインターフェースを使って作られたコマンドもPOSIXに準拠してることになるんだって

POSIXは、POSIXで規定されたコマンドだけを使って
それ以外はシェルスクリプトで独自開発しましょうって規格じゃねーだろ?
POSIXのC言語のインターフェース使ってコマンド使ってもいいだろ?
そして自分じゃなくて誰かがOSSとかで作ったコマンドもバンバン使っていいだろ?
可搬性?OSSなら可搬性あるるからどこでも使えるコマンドだろ
2021/02/28(日) 17:07:15.88ID:qG6bavOU
>>10
もしも時間のかからない処理だったら、プロセス生成にかかるコスト差のほうが上回るんじゃね?
2021/02/28(日) 20:14:25.47ID:O8DyCWfa
これどうなんだろ、xargsの方は1プロセス1ファイルだけど、pigzは複数スレッド1ファイル
なんでしょ。
だったらpigzも1スレッド1ファイルで複数ファイルを同時処理するモードがあればどうなのかと。

いずれにせよ元の話はいろんな条件が混ざっていて気持ち悪い感じがする。
2021/02/28(日) 20:17:39.23ID:O8DyCWfa
GNUのxargsというのでじゃあPOSIXのxargsを考えると、
POSIXのxargsだと例えば引数の数を1にしても(-n1)、プロセスが並列には走らないのか。
waitを使うようなシェルスクリプトとかでGNU xargsの-Pと似たようなことはできるかな?
というわけでこのスレ的な流れに持っていけるかな? w
2021/02/28(日) 20:27:29.22ID:pff3D6mj
可哀想なのがおるな
2021/03/01(月) 03:10:12.92ID:UPXhvHyB
>>17
xargsはPOSIXじゃないぞ
2021/03/01(月) 03:28:09.40ID:RTWwkQ1E
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
2021/03/01(月) 03:34:18.55ID:UPXhvHyB
あ、POSIXにあるのかw
ってことはxargsは使っていいけど-Pは
POSIXじゃないから使わないって言ってるのか?
ほんとPOSIX中心主義みたいなこと言ってるなw
2021/03/02(火) 15:59:01.27ID:NSMtG/TQ
この部分がどうしても繋がりません

if [ {find "$line" -maxdepth 1 -mindepth 1 -type d | wc -lc } -eq 0 ] ; then
echo "hoge"
fi


これがどうしても出来ません
find "$line" -maxdepth 1 -mindepth 1 -type d | wc -lcだけだと出来るんですが、それを演算式に繋げようとすると私が思いつく限りは何をどういじっても動きません
パイプを更に不等式で繋げるのがよくないと思うんですが
どうしたら直りますか?
23デフォルトの名無しさん
垢版 |
2021/03/02(火) 16:47:44.09ID:5tuGRxIW
$()
2021/03/02(火) 16:50:56.84ID:kOL3oDu9
>>22
{}じやなくて、$()なんじゃないの?
標準出力の内容と「0」を比較するのなら。
2021/03/02(火) 16:55:13.39ID:kOL3oDu9
まけた。。。

ちなみに、"$()"のほうが安心。
2021/03/02(火) 17:15:53.31ID:qy7/OUMA
だがwcを使うのがイケてない
27デフォルトの名無しさん
垢版 |
2021/03/02(火) 17:24:52.22ID:5tuGRxIW
wcだと改行コードがね
2021/03/02(火) 18:08:15.82ID:qy7/OUMA
$ printf abc | wc -l
0

こうなるって話?
行数を数えるより良いロジックはなんだろうか
2021/03/02(火) 18:29:23.93ID:bIA4j74d
何にも該当するのがないかどうかって判断でしかないのに、余計なこと考えたんじゃね

wcを使うのがイケてないって他の行数を数える方法でなのか??
単に出力があるか無いかだけでかと思った
2021/03/02(火) 18:41:11.07ID:bIA4j74d
-lc ってどっちやねんもあるか。それか?いや違うか
どっちかにしろってのは存在してるけど
2021/03/02(火) 18:47:50.24ID:NSMtG/TQ
おお!
なんかエラーがそれっぽくなって近づきました
エスケープ文字で引っかかってる感じですけど
ありがとうです
2021/03/02(火) 18:54:51.13ID:NSMtG/TQ
すいません
-lcのcはいつの間にか間違えて入ってしまってたみたいです
ただのミスです
申し訳ない
2021/03/02(火) 18:57:13.79ID:bIA4j74d
なる。いや、謝るほどでもない。でも、まあ、いいなその姿勢w
頑張れ
2021/03/02(火) 18:57:26.63ID:NSMtG/TQ
0にしてるのは簡易的なテストで
フォルダが1かつファイルが0ならば下層フォルダの階層を全部あげようとしてた感じでした
これもまたもっと良い方法があるのかもしれまん?
2021/03/02(火) 20:26:31.82ID:1DoNrFvk
$ printf abc | grep -c .

でええんちゃうちゃう
2021/03/02(火) 20:28:20.11ID:1DoNrFvk
あ、間違えた

$ printf abc | grep -c ''

だった
2021/03/02(火) 21:37:15.67ID:11FPPCA/
>>34
>フォルダが1かつファイルが0
??
>下層フォルダの階層を全部あげようとしてた


調べるフォルダで内包するのがファイルも無くフォルダ一つ
って言っていることになると思うけど
ありそうなのは、中身空っぽのフォルダ だけど、それとは違うのか
調べるフォルダ(始点のフォルダ)直下のフォルダだけでなくそれ以下の階層でもの空のフォルダを探そうとしてる
ってことなのかなあ
2021/03/02(火) 21:38:12.22ID:gQx0ks5j
KARA「呼んだ?」
2021/03/07(日) 19:26:32.91ID:T3tOQ7Z+
こんな感じで
if [ "$source_line_10_first" -ne "$source_line_10_after" ] ; then
i=40
fi

ソースを引っ張ってきて比較するんですが、ソースはやはりエスケープ文字が多いので失敗します
シングルクォテーションでも思いつく限り括弧で括ってもダメでした
変数のエスケープ文字を無視する方法は何か無いですか?
2021/03/07(日) 19:40:15.82ID:vyuBuDwH
>>39
下手なやつが試行錯誤するんじぇねーよ
何がダメかちゃんと書いてるだろうが
41デフォルトの名無しさん
垢版 |
2021/03/07(日) 19:49:06.84ID:UqHHohgI
文字列に元々含まれてるシングルクォートだけ"で囲って
あとは文字列全体をシングルクォートで囲めばいいのでは
2021/03/07(日) 19:54:42.49ID:abZnd7wd
コンピューターサイエンスの難問:
・命名
・オフバイワン
・キャッシュインバリデーション
・文字のエスケープ(New!)
2021/03/07(日) 20:00:22.61ID:quYd9iFF
>>39
その変数はどうやって設定してんの?
変数にいれなきゃダメなの?

cmp < <(...) < <(...)
とか、一時ファイル経由じゃダメなの?
2021/03/07(日) 20:09:21.95ID:vyuBuDwH
答える方もアホばかりやなw
素人がエスケープが〜と言っていたからって
それが原因だと思うな
2021/03/07(日) 20:41:29.78ID:PBQIZrIy
>>39
質問がよくわからんのだが -ne (数値比較であって文字列比較ではない) の
使い方は意図通りなの?
2021/03/07(日) 20:43:03.31ID:vyuBuDwH
素人の質問を真に受けるな、相手に情報を出させろ。アホどもが
2021/03/07(日) 21:28:47.98ID:UPuiYP7U
後で自分がわかったから偉そうにする馬鹿
2021/03/07(日) 23:47:36.62ID:T3tOQ7Z+
>>45
うわ、バッチリ出来ました
ほんとアホでした
ありがとうございます
2021/03/08(月) 03:27:47.81ID:3+uDlPP2
だから最初から出力されてるエラーメッセージをわかると書いただろ
2021/03/08(月) 09:59:07.99ID:6lKYXbK2
>>49
人にやかましく言う前に、まともな日本語を書け!
2021/03/08(月) 10:09:07.56ID:3+uDlPP2
> ソースを引っ張ってきて比較するんですが
ソースを引っ張ってくるとは?

> ソースはやはりエスケープ文字が多いので失敗します
ソースにエスケープが多いとは

> シングルクォテーションでも思いつく限り括弧で括ってもダメでした
思いつきで書くんじゃなくて、正しい書き方を学べ

> 変数のエスケープ文字を無視する方法は何か無いですか?
変数のエスケープ文字とか意味が全くわからない


この初心者の意味不明な文章を真に受けて
レスするやつがいるんだもんなぁ
アホかと
2021/03/08(月) 13:04:09.36ID:OXaKjPz6
結局あんなにレスしてるのに一つとしてまともな文を書けないのな
2021/03/08(月) 13:04:45.87ID:QR/il1w1
>>51
お前の指摘は「-eq を理解している事 前提」なんだよ
右も左もわからん奴は中学生レベルの英語のエラーメッセージを読む精神的な
余裕が無かったり、読んでも正しく解釈できない

お前のやり方は抽象的過ぎるわ「情報小出しにするな」的な基本でもないわで相手に全く届かず
会話に参加できていない
幾ら吠えてもムダ
2021/03/08(月) 21:43:41.10ID:vBncgnCM
ある文字1文字が標準入力で与えられたときに
その文字がサロゲートペアであるかを判定するシェルスクリプトを教えてください
2021/03/08(月) 21:49:20.34ID:eBezB7N7
文字はodコマンドで1バイトずつに変換できる
あとはその数値を調べればいいだけ
2021/03/08(月) 21:58:22.39ID:0PSdEx+k
>>54
| 判定するプログラム
2021/03/09(火) 01:18:57.53ID:GjAck/b0
文字って正確には何のことじゃいな?
2021/03/09(火) 03:38:34.14ID:O1t/zxF9
コンピューターサイエンスの難問:
・命名
・オフバイワン
・キャッシュインバリデーション
・文字エンコーディング(New!)
2021/03/10(水) 14:30:06.19ID:4EdeRuF3
!r posix shell
をDuckduckgoで検索
2021/03/16(火) 18:28:13.75ID:KSYjhM+z
行頭の任意の数の特定文字を、同じ数の別の特定文字に、sedで置換する方法はあるかな?

たとえば、次のようなテキストを

a aaa
aa aa
aaa a

次のように変更したい。

A aaa
AA aa
AAA a

次のようにだらだら書いたらできるけど、めんどくさいし、任意の数に対応できない。。。

s/^a¥s/A/;
s/^aa¥s/AA/;
s/^aaa¥s/AAA/;
...
61デフォルトの名無しさん
垢版 |
2021/03/16(火) 18:57:27.90ID:4E4BJCoI
IPF="対象のファイル.txt"
OPF="結果を出力するファイル.txt"

#最初のフィールドを抜き出し、aをAに変換
cat ${IPF} | cut -d' ' -f1-1 | sed -e "s/a/A/gi" > /tmp/$$0
#残りのフィールドを抜き出す
cat ${IPF} | cut -d' ' -f2-128 > /tmp/$$1
#同列行を連結
paste -d " " /tmp/$$0 /tmp/$$1 > ${OPF}

rm -f  /tmp/$$*
6260
垢版 |
2021/03/16(火) 19:53:28.48ID:KSYjhM+z
>>61
いや、サンプルはああ書いたけど、実際はフィールド的じゃない。
任意のテキストも混じってるから、cutはちょっと。。。

sedで任意個→任意個の置換は、やっぱりムリ?
2021/03/16(火) 19:53:49.41ID:37ClWGtj
'h;s/ .*//;s/a/A/g;x;s/^[^ ]*//;H;g;s/\n//'
2021/03/16(火) 20:44:06.60ID:Uw3qDZze
':b;s/^\(A*\)a/\1A/g;tb'
2021/03/16(火) 23:16:18.12ID:cOTzxoWO
仕様を後出しするなカス
2021/03/16(火) 23:29:02.91ID:iNI2JLkI
$ echo 'aa@aa' | sed -E '/^(a+)/!b;s/^(a+)(.*)\n/\1\n\2/;h;s/^(a+).*$/\1/;s/./A/g;G;s/\na+//'
aa@AA

$ echo 'aabbb' | sed -E '/^(a+)/!b;s/^(a+)(.*)\n/\1\n\2/;h;s/^(a+).*$/\1/;s/./A/g;G;s/\na+//'
AAbbb
2021/03/16(火) 23:31:10.17ID:iNI2JLkI
>>66
最初の方、aa@AA じゃなくて AA@aa だわ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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