22/12/17 16:37:20.54 kO3DzgkN.net
シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
・「POSIX原理主義」「ユニケージ」「USP研究所」はPOSIXとUnixを曲解し
間違ったシェルスクリプトを広めている宗教です。洗脳されないようにしてください。
前スレ: シェルスクリプト総合 その37
スレリンク(tech板)
関連スレ
【Bash】Windows Subsystem for Linux【WSL】12
スレリンク(linux板)
・Bashでプログラミング [転載禁止](c)2ch.net
スレリンク(linux板)
・シェルスクリプト総合 その28
スレリンク(unix板)
・zsh その7
スレリンク(unix板)
・過去UNIXで使われていた ksh というシェルについて
スレリンク(unix板)
・【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net
スレリンク(unix板)
・おまえら! shell は何を使っているんですか?
スレリンク(unix板)
2:デフォルトの名無しさん
22/12/17 16:37:59.62 kO3DzgkN.net
・特記なき場合、POSIX準拠シェルが既定です(古きBourneシェルはほぼ絶滅しました)
POSIX準拠シェルは(d)ash, bash, zsh, (m)ksh, yash, posh, (p)boshです
参考 URLリンク(unix.stackexchange.com)
特定のシェルの専用機能に依存する場合は明示しましょう(特に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に準拠しましょう
仕様 URLリンク(pubs.opengroup.org)
・シバンになにを使えばいいの?→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 URLリンク(heirloom.sourceforge.net)
Schily Bourne Shell: obosh URLリンク(schilytools.sourceforge.net)
歴史的資料 URLリンク(www.in-ulm.de)
・csh/tcshでのシェルスクリプトは*まったく推奨しません*
参考 URLリンク(www.speech-lab.org)
・Linux/UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。Manページや各種リンクを見ましょう
・ワイルドカード・パターンは正規表現ではありません。正規表現の話題は正規表現スレへ
・シェル芸とシェルスクリプトは全く異なります
・シェルスクリプトのことをシェルってゆうな
3:デフォルトの名無しさん
22/12/19 02:24:48.44 Emj1398e.net
スレ建てサンキュー
4:デフォルトの名無しさん
22/12/19 02:35:38.83 Emj1398e.net
このスレのグダグダ議論がメンテナにフィードバックされてたという衝撃…
手を煩わせてそう
5:デフォルトの名無しさん
22/12/19 02:43:48.53 HlSjKkDw.net
お上が決める事に口出ししても無意味しか言わない壊れたラジオよりは、行動力のあるアホの方が貢献してるのが皮肉
6:デフォルトの名無しさん
22/12/19 11:36:20.22 N0ztMMfe.net
POSIXを「お上」と勘違いするやつは愚かだね
POSIXは何も決めないし、決めてない
勘違いしてるやつの典型的な行動は
POSIXの仕様が変だと思った時にPOSIXのせいにして文句を言う
筋違いなのがわかっていない
7:デフォルトの名無しさん
22/12/19 12:04:01.74 ytAE1sHX.net
とりあえず同じ内容の投稿は一回までにしてくれ
8:デフォルトの名無しさん
22/12/19 12:23:54.61 ACKFaDCE.net
というか俺が考えた最強のシェルスクリプトの話はどうでもいいよ
ここでグダグダ言ってないで、bashのメーリングリストとかで
こんな機能考えました、作ってくださいって語ってくればいい
9:デフォルトの名無しさん
22/12/19 12:47:35.29 ytAE1sHX.net
前スレ見てもその主張に対して一つもコメント貰えてないじゃん、哀れな奴
10:デフォルトの名無しさん
22/12/19 12:55:27.07 ACKFaDCE.net
都合悪いから無視してるんだろうね
11:デフォルトの名無しさん
22/12/19 12:56:04.69 ACKFaDCE.net
あとコメントはもらえてるよ
よく読みな
12:デフォルトの名無しさん
22/12/19 21:15:07.83 kSP3DPlm.net
POSIX偏重主義者はめんどくさいもん。w
13:デフォルトの名無しさん
22/12/20 00:12:37.48 TxV4Yb7/.net
またいつものPOSIX原理主義者が来ていたのか。懲りないなw
14:デフォルトの名無しさん
23/01/01 11:46:15.75 tG5gg2/T.net
URLリンク(i.imgur.com)
紅白でシェルスクリプトが出てきた
15:デフォルトの名無しさん
23/01/01 23:20:26.96 EPk6GwwK.net
>>14
www
16:デフォルトの名無しさん
23/01/05 14:13:50.57 gL1mwsvj.net
最先端だぜ!
17:デフォルトの名無しさん
23/01/05 22:04:03.24 7AKtp3Yz.net
>>14
左側はこのファイルやね
URLリンク(github.com)
18:デフォルトの名無しさん
23/03/08 11:44:14.07 P4+/KkQa.net
スレチで悪いがGNU/diffutilsのスレがあれば教えてくれないか。
diff3の改善を考えていて、その辺詳しいor考慮中の奴がいれば話をしたい。
19:デフォルトの名無しさん
23/05/05 12:20:01.51 0uwn+ADY.net
アルゴリズムの改善案?
20:デフォルトの名無しさん
23/05/05 13:02:20.08 5lQzBSYZ.net
いやその上の階層。
具体的にはdiffと同様に-r指定で傘下ディレクトリ全対象にすればマージ出来てgitモドキが出来るんじゃね?とか、
UNIXコマンドにmergeってのがあるが、これがそうなのか?とか。
21:デフォルトの名無しさん
23/05/13 10:53:53.68 ag/ehtCI.net
すいません。
FreeBSD13.2の/bin/shですがループがread NAMEで止まる理由は&&の右項が0になるからですか?
ためしに|| trueを追加するとループが回りきったので実装的には結果が出てるのですが理由がわかりません。
> #!/bin/sh -xe
>
> echo "BBB" | while read NAME
> do
> [ "${NAME}" != "BBB" ] && :
> done
22:デフォルトの名無しさん
23/05/13 12:09:39.09 ICgxywxP.net
違う
テストコマンドが非0を返してるから
&&の右辺は評価されてないからそもそもいくつでもない
[ "${NAME}" != "BBB" ] → 偽
[ "${NAME}" != "BBB" ] && : → 偽 && : → 偽
[ "${NAME}" != "BBB" ] && : || true → 偽 || true → 真
23:デフォルトの名無しさん
23/05/13 12:48:14.60 ag/ehtCI.net
返答ありがとうございます。
そして、すみません。意図の記述が不十分でした。
質問の焦点は停止する理由では無く停止する位置です。
左項が0なのは判ってるんですが&& :が無い場合はこの式([ "${NAME}" != "BBB" ])で停止するのに&& :を付けた場合に何故か次(read NAME)で止まるんです。
さらに不可解なのが次行にcontinueを挿入するとループが完遂されてしまいます。
指摘の通り左から解釈されるので最初の式で止まるはずが結果だけ見るとなにか変です。
それで混乱したので質問しました。
24:デフォルトの名無しさん
23/05/13 14:36:20.16 ICgxywxP.net
そもそも仕様として&&や||の左側は-eオプションの判定の対象になってない
だからcmd1||cmd2みたいのを使いたいスクリプトでは-eオプションを使わないorその都度オンオフするみたいな話がよくある
偽を返すテストコマンドがあるとして[ ... ]なら停止するし[ ... ] && trueなら停止しない
それとは別にプロセスの戻り値の話がある
スクリプトはechoとwhile以下をパイプでつないでるけどそれぞれ別プロセスで戻り値がある
do ... doneの中身の最後の行が非0([ "${NAME}" != "BBB" ] && :)ならwhile側のプロセスの戻り値は非0になる(-eオプションの効果で停止する)
continueで終われば戻り値は0になる
25:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています