X



シェルスクリプト総合 その38
0001デフォルトの名無しさん
垢版 |
2022/12/17(土) 16:37:20.54ID:kO3DzgkN
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
・「POSIX原理主義」「ユニケージ」「USP研究所」はPOSIXとUnixを曲解し
間違ったシェルスクリプトを広めている宗教です。洗脳されないようにしてください。

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

関連スレ
【Bash】Windows Subsystem for Linux【WSL】12
https://mao.5ch.net/test/read.cgi/linux/1653317390/
・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/
0002デフォルトの名無しさん
垢版 |
2022/12/17(土) 16:37:59.62ID:kO3DzgkN
・特記なき場合、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ページや各種リンクを見ましょう
・ワイルドカード・パターンは正規表現ではありません。正規表現の話題は正規表現スレへ
・シェル芸とシェルスクリプトは全く異なります
・シェルスクリプトのことをシェルってゆうな
0004デフォルトの名無しさん
垢版 |
2022/12/19(月) 02:35:38.83ID:Emj1398e
このスレのグダグダ議論がメンテナにフィードバックされてたという衝撃…
手を煩わせてそう
0005デフォルトの名無しさん
垢版 |
2022/12/19(月) 02:43:48.53ID:HlSjKkDw
お上が決める事に口出ししても無意味しか言わない壊れたラジオよりは、行動力のあるアホの方が貢献してるのが皮肉
0006デフォルトの名無しさん
垢版 |
2022/12/19(月) 11:36:20.22ID:N0ztMMfe
POSIXを「お上」と勘違いするやつは愚かだね
POSIXは何も決めないし、決めてない

勘違いしてるやつの典型的な行動は
POSIXの仕様が変だと思った時にPOSIXのせいにして文句を言う
筋違いなのがわかっていない
0008デフォルトの名無しさん
垢版 |
2022/12/19(月) 12:23:54.61ID:ACKFaDCE
というか俺が考えた最強のシェルスクリプトの話はどうでもいいよ
ここでグダグダ言ってないで、bashのメーリングリストとかで
こんな機能考えました、作ってくださいって語ってくればいい
0018デフォルトの名無しさん
垢版 |
2023/03/08(水) 11:44:14.07ID:P4+/KkQa
スレチで悪いがGNU/diffutilsのスレがあれば教えてくれないか。
diff3の改善を考えていて、その辺詳しいor考慮中の奴がいれば話をしたい。
0020デフォルトの名無しさん
垢版 |
2023/05/05(金) 13:02:20.08ID:5lQzBSYZ
いやその上の階層。
具体的にはdiffと同様に-r指定で傘下ディレクトリ全対象にすればマージ出来てgitモドキが出来るんじゃね?とか、
UNIXコマンドにmergeってのがあるが、これがそうなのか?とか。
0021デフォルトの名無しさん
垢版 |
2023/05/13(土) 10:53:53.68ID:ag/ehtCI
すいません。
FreeBSD13.2の/bin/shですがループがread NAMEで止まる理由は&&の右項が0になるからですか?
ためしに|| trueを追加するとループが回りきったので実装的には結果が出てるのですが理由がわかりません。

> #!/bin/sh -xe
>
> echo "BBB" | while read NAME
> do
> [ "${NAME}" != "BBB" ] && :
> done
0022デフォルトの名無しさん
垢版 |
2023/05/13(土) 12:09:39.09ID:ICgxywxP
違う
テストコマンドが非0を返してるから
&&の右辺は評価されてないからそもそもいくつでもない

[ "${NAME}" != "BBB" ] → 偽
[ "${NAME}" != "BBB" ] && : → 偽 && : → 偽
[ "${NAME}" != "BBB" ] && : || true → 偽 || true → 真
0023デフォルトの名無しさん
垢版 |
2023/05/13(土) 12:48:14.60ID:ag/ehtCI
返答ありがとうございます。
そして、すみません。意図の記述が不十分でした。

質問の焦点は停止する理由では無く停止する位置です。
左項が0なのは判ってるんですが&& :が無い場合はこの式([ "${NAME}" != "BBB" ])で停止するのに&& :を付けた場合に何故か次(read NAME)で止まるんです。
さらに不可解なのが次行にcontinueを挿入するとループが完遂されてしまいます。

指摘の通り左から解釈されるので最初の式で止まるはずが結果だけ見るとなにか変です。
それで混乱したので質問しました。
0024デフォルトの名無しさん
垢版 |
2023/05/13(土) 14:36:20.16ID:ICgxywxP
そもそも仕様として&&や||の左側は-eオプションの判定の対象になってない
だからcmd1||cmd2みたいのを使いたいスクリプトでは-eオプションを使わないorその都度オンオフするみたいな話がよくある
偽を返すテストコマンドがあるとして[ ... ]なら停止するし[ ... ] && trueなら停止しない

それとは別にプロセスの戻り値の話がある
スクリプトはechoとwhile以下をパイプでつないでるけどそれぞれ別プロセスで戻り値がある
do ... doneの中身の最後の行が非0([ "${NAME}" != "BBB" ] && :)ならwhile側のプロセスの戻り値は非0になる(-eオプションの効果で停止する)
continueで終われば戻り値は0になる
レスを投稿する


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