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

■ このスレッドは過去ログ倉庫に格納されています
2020/08/21(金) 15:17:55.64ID:mArnj/tT
シェルスクリプトに関する総合スレッドです。

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

シェルスクリプト総合 その33
https://mevius.5ch.net/test/read.cgi/tech/1584893550/
2020/10/29(木) 10:45:18.65ID:XkZMBg2d
>同一プロセス内での複数スレッド処理に関しては
>そもそもCPUの機能を全部抽象化されてるようなシェルスクリプトでは
>外部コマンドを使ったりしないと実現できんのでは
何を言いたいのかイミフ
複数のスレッドで作業を分割して同時並行で実行するが、終了は順番に受け取るとかめんどくさいだとかで普通にできるだろう。単にやる必要もないってとこだな

>POSIXかどっかで「この動作はマルチ*スレッド*で処理されますよ」
>というのが規定されている可能性もあるが,
>ちょっと考えにくい。
なんか純粋なUnix系のOSを理解してないっぽい。純粋部分はマルチスレッドはOSで「勝手に」はやらんだろう。CUIレベルだと必要なさげだからな。GUIなOSでは勝手にはあるけど
702デフォルトの名無しさん
垢版 |
2020/10/29(木) 10:55:31.90ID:yfEeCvlS
シェルスクリプトはHaskellと同じで自動的にマルチスレッド化するプログラミング
言語ですよ!
素晴らしいですよ!

ってこと?
2020/10/29(木) 10:57:33.10ID:XkZMBg2d
>>700
イミフな部分は シェルの内部コマンド をマルチスレッドでという話か
内部コマンドっても単にコマンドを内包してるだけで、外部コマンドと変わらない(いや、変わらないと困る)もんだろと思ってるから、そういう読みはできなかった。なるほどね

ksh,zsh でも確かマルチスレッドではなかったような
i=0
command | while read j; do
i=$((i+j))
done
って、i がちゃんと変わるようにしてるのに(確かネストしても大丈夫だったような)。実現方法はなんだっけ
2020/10/29(木) 10:59:39.85ID:XkZMBg2d
>>702
しないよw
多分全く
705デフォルトの名無しさん
垢版 |
2020/10/29(木) 11:25:48.02ID:yfEeCvlS
でも、自動的にマルチスレッド化してC言語の64倍高速化する可能性も、ワンチャンあるって事ですよね?

試してみるバリューあるのでは?
2020/10/29(木) 11:31:36.93ID:XkZMBg2d
ないよw
C言語でもOpenMP使えば割と見た目簡単にできそうだが、OpenMPもそれほど流行ってない
プロセス=特に何か意識する必要もない
スレッド=常時何かを意識する必要がある
そう簡単な話ではない
Haskellとかはマルチスレッドでなきゃそもそも実現できない言語なのだからそれと比べても意味はないな。Haskell出したのはそう意味あるわけではないだろけど
2020/10/29(木) 11:38:39.55ID:XkZMBg2d
>そもそも実現できない言語なのだから
というわけでもないのね
出し受けがどでかいばかりじゃないからそりゃそうか
708デフォルトの名無しさん
垢版 |
2020/10/29(木) 11:49:45.20ID:yfEeCvlS
シェルスクリプトがマルチ高速化のアビリティを持つのは否定しようがないファクトですよね?
2020/10/29(木) 11:59:44.96ID:XkZMBg2d
小池とかのギャグに走ってるだけだろ
2020/10/29(木) 15:03:10.28ID:8VEYobTG
>>708
マルチ高速化?
アビリティ?
ファクト?

個々の言葉はそれほどでもないが、にもかかわらず、全体から漂うバカっぽさ。w
2020/10/29(木) 15:45:57.37ID:i0HZBLVS
自己紹介がお上手
2020/10/29(木) 22:21:37.37ID:87BKVwTm
並行・並列とプロセス・OSスレッド・軽量スレッドと同期・非同期の切り分けがごっちゃになってそう知らんけど
713デフォルトの名無しさん
垢版 |
2020/10/29(木) 22:49:07.55ID:yfEeCvlS
バリューないですか?
2020/10/29(木) 22:51:15.28ID:Ju4cpcAY
並行と並列はいまだにうまく使い分けられていない印象
正確な定義はどこかにあるんだろうが、人によって使われ方が違う
715デフォルトの名無しさん
垢版 |
2020/10/29(木) 22:55:56.32ID:yfEeCvlS
コンカレントとパラレルの違いはアジア人にはわかり辛いですからね。

キリスト教的考え方が普及していないからですね。
2020/10/29(木) 23:59:18.90ID:N/u/fZ2Q
並行と並列は使ってるCPUで決まる。
プログラムの書き方に違いはない。
717デフォルトの名無しさん
垢版 |
2020/10/30(金) 17:02:49.47ID:ig1/qwB5
$@みたいな擬配列変数に格納されている値 一つ一つに対して
何か処理を行なう時に,別の変数を用意しない(使わない)方法って原理的に可能かな。

普通は
for args in $@; do
なにか処理
done
というスクリプトを組むと思うんだけど,
argsみたいな変数を使わずに済む方法があれば知りたい。
(シェルスクリプトは基本的には変数の無駄遣いを避けなきゃいけないので。
まあそれが「欠陥」かどうかは別として)
2020/10/30(金) 17:39:03.81ID:mooUMZ8S
なう
2020/10/30(金) 18:20:41.07ID:vW0P/VrR
PowerShellってKshとかPerlとかUnixのシェルやスクリプト言語を研究してベースにして作ったって、昔QuoraかどこかでMSの社員が答えてた
begin/endブロックとか、昔からUnix使ってればそのまま活かせる知識かなりある
2020/10/30(金) 18:25:55.93ID:sXVsY8+M
>>717
$@を書き換えるのでないなら

while [ $# -gt 0 ]; do
 なにか処理 "$1"
 shift
done
2020/10/30(金) 18:26:25.00ID:sXVsY8+M
他にも再起でできる
722717
垢版 |
2020/10/30(金) 18:27:46.70ID:ig1/qwB5
>>720
shiftを使うのか,頭になかったw
ありがとう!
2020/10/30(金) 18:30:51.05ID:sXVsY8+M
> (シェルスクリプトは基本的には変数の無駄遣いを避けなきゃいけないので。
これはなんで? 変数名がぶつかるとかいう話?
2020/10/30(金) 18:33:22.92ID:sXVsY8+M
ちなみにそれダブルクォートがあったほうがいい

for args in "$@"; do
なにか処理
done

もしくは逆に省略

for args; do
なにか処理
done
2020/10/30(金) 18:39:10.50ID:sXVsY8+M
ちなみにそれダブルクォートがあったほうがいい
for args in "$@"; do

もしくは逆に省略
for args; do
2020/10/30(金) 18:39:31.11ID:sXVsY8+M
書き込みエラった
727717
垢版 |
2020/10/30(金) 19:07:22.75ID:ig1/qwB5
>>723
そういうことです。
Bashとかの独自機能に頼れば
局所変数を使えるみたいだけど
それを踏まえても,
例えばC言語よりは「変数の使い過ぎ」には
注意しなくちゃならない(よね?)

>>725
for文ってin省略したら$@を暗示するのマジか!
知らんかったけどちゃんとPOSIXでも規定されてたわ。

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_03
2020/10/30(金) 19:15:49.74ID:sXVsY8+M
> for文ってin省略したら$@を暗示するのマジか!

他にはgetoptsもそうだな。こっちは逆によく省略されるから
逆に指定できたのか!になると思うが

今は解決してるかもしれないが、$@が0個の時、
set -u状態で"$@"を参照するとエラーになるシェルがあったから
for args in "$@" じゃなくて省略してfor argsと書くようになった
2020/10/30(金) 19:32:14.84ID:yPjXBzu5
>>719
実際、PerlとBashに慣れてると、かなり書きやすいからな。
2020/11/01(日) 17:25:31.39ID:xiHRYmfR
昔Perlやってて関数の$1とかいちいち変数に入れるのダサいよなぁと思っていたけど
シェルスクリプトをPOSIX縛りしてたらローカル変数なくて、そのまま$1とかでいいやって思ってたら
どうせ関数は小さく書くのは当たり前だから別に$1とかで問題ないと思うようになったな
外部からどういう引数で渡ってくるのか分かりづらいものはコメント書いてるけど
2020/11/01(日) 18:51:46.05ID:CuITjVo7
つきつめるとアセンブリで問題ないになる
2020/11/01(日) 19:28:12.68ID:xiHRYmfR
そうはならないよ。アセンブリは短く書こうとしてもどうしても長くなるから
「どうせ関数は小さく書くのは当たり前」が実現できない
733デフォルトの名無しさん
垢版 |
2020/11/01(日) 21:18:05.45ID:HWQKX8bn
名前の話なら、昔は名前が長いだけで容量が取られるから短くしていただけで、いまとなっては短いメリットはあまりない。
2020/11/02(月) 10:41:13.59ID:n2BNqgKx
たいてい編集するときに補完してくれるしね。
2020/11/02(月) 11:22:36.19ID:n2BNqgKx
poshを「POSIXシェルスクリプトがちゃんと動くか」というのを
確かめるのに使ってる人いる?

シェルスクリプトの妥当性をshellcheckみたいに静的じゃなく動的に検証したい。
736デフォルトの名無しさん
垢版 |
2020/11/02(月) 12:43:28.28ID:WhiKrslV
>>731-732
perl とか ruby で関数の戻り値が(敢えて描かれていないとき)
最後に評価されたレジスタ(アキュムレータ)の値が戻り値になる
ってのはアセンブラの尾骶骨だと思う
2020/11/02(月) 13:09:30.56ID:FhHZncje
>>735
poshはバグが大量にある古いpdkshのフォークで
ろくにメンテナンスされてないので今も大量にバグが有る

https://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=posh
2020/11/02(月) 13:11:03.65ID:FhHZncje
POSIX準拠してるかを調べたいならdashを使ったほうが何倍もマシ
2020/11/02(月) 13:26:39.74ID:n2BNqgKx
>>738
dashね。thx
2020/11/02(月) 13:28:36.85ID:ew0mgVfp
>>736
ないない。
最後の式の評価結果を返しとくのがだいたい自然で合理的なだけ。
2020/11/02(月) 13:28:58.41ID:lTcfprDV
dash dash dash
2020/11/02(月) 16:38:46.09ID:FhHZncje
シェルスクリプトも最後のコマンドの評価結果をそのまま返す
2020/11/02(月) 16:39:37.65ID:FhHZncje
>>739
dashはDebian・Ubuntu系の/bin/shだよ
クラウドで一番よく使われてるディストリ
2020/11/02(月) 16:42:40.40ID:UfGVYnOo
いまどきのシェルスクリプトはほとんど/bin/bashでしょ
2020/11/02(月) 16:56:54.34ID:pNDhR5km
シバンに使われるのは/bin/shだろ?
そしてそれがDebian・Ubuntuだとdashになる
なぜ今どきはbashだと思ったのか?
2020/11/02(月) 17:08:07.37ID:UfGVYnOo
初めはそうだったんだけどな
ディストリによっては/bin/shが/bin/bashなのでそれと気づかずbash拡張を使う奴が出てきて、debianやbsd等の/bin/shが/bin/bashじゃない環境じゃ動かなくなってきて
「bash拡張使ったスクリプトはshebangもちゃんと/bin/bashにしよう」ってなってきた
2020/11/02(月) 17:14:14.89ID:pNDhR5km
その結果bashが入ってないAlpine Linuxで動かないという問題が発生するわけで
さっさとPOSIX準拠に変更したほうがいい。bash依存は甘え。

っていうか俺勉強したくないんだーと言って必要もないのに/bin/bashにして
動かなくて後悔してるやつが増えてきてる。自業自得だが。
2020/11/02(月) 17:15:01.41ID:pNDhR5km
シェルスクリプトはPOSIX準拠にしておけ
bash特有の機能を使いたくなったら別の言語を使うべきだ
2020/11/02(月) 17:17:28.98ID:ZpVsHyOp
macのデフォルトシェルはzsh
2020/11/02(月) 17:21:10.82ID:pNDhR5km
macの/bin/shはbash
2020/11/02(月) 17:23:00.46ID:ZpVsHyOp
macの/bin/shはzsh
2020/11/02(月) 17:23:45.79ID:pNDhR5km
>>751
すぐバレる嘘を付くな
2020/11/02(月) 17:24:32.82ID:pNDhR5km
そもそも>>2に書いてある

・デフォルトシェルのシバンはBourneシェル時代からの伝統で#!/bin/shを使用します。ただしその実体はOSによって様々です
  Debian系 … dash   CentOS系 … bash   Alpine … ash(busybox)  Android … mksh
  FreeBSD … ash   Solaris,OpenBSD … ksh
  macOS … bash(Single UNIX Specification準拠のために一部動作が異なる)
・ログインシェルは/bin/shでない場合があります。例 macOS … zsh
754デフォルトの名無しさん
垢版 |
2020/11/02(月) 17:30:22.78ID:Xv3pPvZM
tcsh : 思い出してください
2020/11/02(月) 17:49:15.11ID:ew0mgVfp
>>748
大きなお世話だな。w
BashがいいところはBashがいい。

どのUnixでも動かないといけないようなスクリプトは、シェル以外にも心配事は多いし、いちいち気にせずとも。
2020/11/02(月) 18:35:32.48ID:pNDhR5km
なんでbash使うんですか?bashじゃないとダメなことでもやってるんですか?
2020/11/02(月) 18:52:50.96ID:j60yzXh/
自分のためのスクリプトなので書きやすいように書くだけ
2020/11/02(月) 18:54:08.71ID:pNDhR5km
だからbashのどういうところが書きやすいの?
759デフォルトの名無しさん
垢版 |
2020/11/02(月) 18:56:50.41ID:wsJGkNeE
>>741
wish and dash
2020/11/02(月) 19:19:37.82ID:6dMpVrf4
< <( )
2020/11/02(月) 19:30:22.69ID:pNDhR5km
cmd |
2020/11/02(月) 19:35:41.93ID:aDX4tDqS
代替になり得てないだろう
いつものPOSIXなやつか
2020/11/02(月) 19:40:13.91ID:pNDhR5km
それがなりえてるんだなぁ
2020/11/02(月) 19:42:01.99ID:aDX4tDqS
お前にとってはな
全てお前にとってはだろうw
2020/11/02(月) 19:43:07.75ID:ew0mgVfp
>>756
Bashがふつうに使えるし、適度に高機能だから。
わざわざあえて別のシェルで動作確認するのは面倒であり無駄。
2020/11/02(月) 19:44:07.24ID:pNDhR5km
>>765
なんて言ってると、シェルがdashで
動かないーとか言ってるやつが多すぎるんだがw
bashを使うにしろ、必要最小限にしてればいいだろ
POSIX準拠の命令も、bashの命令なんだから
2020/11/02(月) 19:45:33.32ID:pNDhR5km
だいたいbashスクリプトじゃなきゃダメなんだみたいに
言ってるやつのスクリプトはfunctionをなくして
[[ ]] を [ ] に置き換えるだけで8割はそのままPOSIX準拠にできるんだがw
2020/11/02(月) 19:47:44.55ID:aDX4tDqS
>>765
そもそも前提が違う
シバンに /bin/sh と書いてるならPOSIXで書くべきってだけだな
特定のシェルが好みでその機能を使って、シバンもそれにしてるなら好き好きにでしかないわな

なぜか、
>シバンに使われるのは/bin/shだろ?
とだけになり、シェルの派生は使うなそれなら他の言語をとか言い出すいつもの。自分がPOSIXに拘ってるのだけだろうがただうざいだけw
2020/11/02(月) 19:48:29.55ID:pNDhR5km
/bin/shはどこでも入ってるが、
/bin/bashはAlpine Linuxなど入ってない環境がある
2020/11/02(月) 19:51:03.74ID:aDX4tDqS
好き好きなんだから環境も好きにすんだよ、融通の利かない臨機応変出ないお前にはわからんだろうけど
問題があったら動かないし、シバンを変えるだけでもあるしな
2020/11/02(月) 19:51:53.50ID:pNDhR5km
POSIX準拠で書いていれば
シバンを変えるだけで動くんだよね
2020/11/02(月) 19:52:55.74ID:aDX4tDqS
いつもの話が通じないモードか
2020/11/02(月) 19:53:36.45ID:pNDhR5km
反論しろや
POSIX準拠で書いていれば
シバンを変えるだけで動くのは事実だろうが
2020/11/02(月) 19:57:02.06ID:aDX4tDqS
イミフだからだぞ
>シバンを変えるだけ
ってなんのこっちゃ
2020/11/02(月) 19:59:27.33ID:pNDhR5km
なんだこいつwww

770 名前:デフォルトの名無しさん[sage] 投稿日:2020/11/02(月) 19:51:03.74 ID:aDX4tDqS [4/6]
好き好きなんだから環境も好きにすんだよ、融通の利かない臨機応変出ないお前にはわからんだろうけど
問題があったら動かないし、シバンを変えるだけでもあるしな



774 名前:デフォルトの名無しさん[sage] 投稿日:2020/11/02(月) 19:57:02.06 ID:aDX4tDqS [6/6]
イミフだからだぞ
>シバンを変えるだけ
ってなんのこっちゃ
2020/11/02(月) 20:03:40.47ID:aDX4tDqS
bashが無ければインストールする、パスが違っていればシバンを適切に書き換えるだけ
後者なんて、それこそシェルスクリプト(というほどでもない)でのお仕事で簡単なこと
好きで使ってるならそんなの気にしないぐらいの

>>775
なに言ってるの?w なおさらナンノコッチャ
まだ「シバンを変えなくても」だったらわかるが、ますますわからんw
まさか「シバンで /bin/bash とか書いていてもPOSIX準拠してたらどう変えても動く」とか言いたいわけ?まさかなあwww
2020/11/02(月) 20:06:59.14ID:pNDhR5km
シバンを変えるだけといいながら、
bashをインストールしなければいけないと前言撤回w
誰もがbashをインストールできるわけではない
2020/11/02(月) 20:09:07.31ID:aDX4tDqS
いつものパターン
自分の何かがマズいと別の口実へとw
2020/11/02(月) 20:31:01.29ID:UfGVYnOo
シェルスクリプト使ってると精神が破壊されでもするのか
2020/11/02(月) 20:32:40.76ID:aDX4tDqS
ん?俺もお前も??w
2020/11/02(月) 21:59:15.95ID:Qlwbnxz+
echoの挙動すら統一できてないのに何がPOSIXだよ
2020/11/02(月) 22:39:16.63ID:ew0mgVfp
>>767
8割じゃねえか。w

個人的には、ほかに-o pipefailとかlocal -rとかも使うから、ほかのシェルは想定外。
いちいちほかを心配するのは無駄。2回目。
2020/11/02(月) 22:40:32.90ID:ew0mgVfp
>>779
POSIX原理主義者がやろ。
2020/11/03(火) 00:54:03.57ID:JyRXzZ9S
>>782
> -o pipefailとかlocal -rとかも使うから、
それを言ったのは1回目ですねw
2020/11/03(火) 01:06:01.23ID:eTFEu/to
>>784
そこは主文やないから。w
2020/11/03(火) 01:21:28.30ID:JyRXzZ9S
> 756 自分:デフォルトの名無しさん[sage] 投稿日:2020/11/02(月) 18:35:32.48 ID:pNDhR5km [7/17]
> なんでbash使うんですか?bashじゃないとダメなことでもやってるんですか?

注文ですね
2020/11/03(火) 05:06:25.45ID:ZHMzrFjb
>>755
ホントこいつは読めねえなw
2020/11/03(火) 05:07:52.60ID:ZHMzrFjb
>>787
× >>755
>>785
しつれ
2020/11/03(火) 10:58:07.03ID:mwHgWWA5
コマンドラインから実行したら自動的に色が有効になるのって
あれどういう仕組で実現してるんですか?
2020/11/03(火) 12:44:55.98ID:eTFEu/to
isatty()が真なら、エスケープシーケンスで色設定する。
2020/11/03(火) 18:29:40.60ID:j7Eu4w5F
C言語の類推で考えれば,POSIXに従うというのも分かる話だと思うんだがなぁ。
「原理主義」とかはちょっとやりすぎ(Webサービスとかはさすがに……)と思うけど,
例えばMicrosoft製のclとかでしか動かないプログラムは別に悪い訳ではないけど,
C99やC11に従ってGCCでもpccでも動くようなプログラムの方がいいよね,
というそれだけの話。
2020/11/03(火) 20:56:04.24ID:Vb+pPlne
エスケープシーケンスって仕組みダサいよな
パイプ通したときはどうとか面倒だし混乱するだけ
2020/11/03(火) 21:06:50.17ID:xZyzqOA2
そこで新たにエスケープの代わりにHTMLを流すことを提案しますとか
unicodeを拡張してすべての文字に色を付けられるようにします
とか言うの?
2020/11/03(火) 21:15:36.20ID:eTFEu/to
>>791
かなり異なるものに「類推」とか言ってもダメ。
それに、C/C++だって、環境やターゲットが違えば、#if/#endifはあたりまえに使う。
2020/11/03(火) 21:16:35.47ID:eTFEu/to
>>793
そこで、PowerShellのオブジェクトパイプだ!!!
2020/11/03(火) 21:19:50.78ID:xZyzqOA2
https://qastack.jp/superuser/1259900/how-to-colorize-the-powershell-prompt

カラーエスケープシーケンス
さて、Windowsの10 をサポートANSIエスケープコードのconhostでは、と24ビットカラーは 1703年以降でサポートされています。

ANSIエスケープコードのいずれかを使用するには、リテラルESC文字が必要です。
これは、033進、またはbashで小数点以下27である、あなたは使います"\033"か"\e"。
PowerShellには直接同等のシーケンスはありませんが、代わりに式を埋め込むことができます。"$([char]27)"
2020/11/03(火) 21:21:56.76ID:xZyzqOA2
C言語にとってのPOSIXは、ほとんどすべてのことができるのに対して
シェルスクリプトにとってのPOSIXは必要最小限のことしかできない

ここ、大きな違いな
2020/11/03(火) 21:33:57.64ID:j7Eu4w5F
>>796
そのクソ翻訳サイトを今すぐ
uBlacklistへ放り込め
2020/11/05(木) 08:37:54.68ID:aaXXoIST
最近使う機会のあったTinyCoreLinuxはashで >>2 のリストからしたらPOSIXみたいだけど
コマンドが無かったりして/proc依存しまくりで何の意味もなかったわありがとう!
2020/11/05(木) 14:20:57.02ID:NJa4xvXv
・TinyCoreLinuxに入っているashはPOSIXシェル
・TinyCoreLinuxにPOSIXコマンドがない・/procに依存している
この二つは何の関係もないんですが……

皮肉を言うのはいいけど,ちゃんと勉強してからにしような!
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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