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

■ このスレッドは過去ログ倉庫に格納されています
2019/07/01(月) 23:04:27.02ID:/rKj5XUf
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ:
シェルスクリプト総合 その29
https://mevius.5ch.net/test/read.cgi/tech/1537540487/
2019/08/10(土) 04:20:00.43ID:L+B8OP2P
>>762
Solarisは10まで(POSIX互換ではない)Bourne Shellが
デフォルトシェルだってのがいただけない
Extended Supportが2021年までらしい。
まあ俺はPOSIXじゃないからという理由で切り捨てることにしてるが
2019/08/10(土) 04:20:29.77ID:lTTXvTcQ
>>694
> 今回は a b c を xaz,xbz,xcz にしたいから IFS=, を使わなかったわけだが →分かる
> それでもIFS=,を使うならばどうすればよいだろうか?→そうだな,どうすればいいんだろう。

> 言い換えると、引き数 a b c を xaz xbz xcz にすればいいわけだが、→え?空白区切り?今IFS=,の話だよな??
> さてどうすればよいだろうか? →????
2019/08/10(土) 04:23:34.50ID:L+B8OP2P
>>772

>>694再掲 読める?

> 今回は a b c を xaz,xbz,xcz にしたいから IFS=, を使わなかったわけだが
> それでもIFS=,を使うならばどうすればよいだろうか?
2019/08/10(土) 04:26:01.61ID:L+B8OP2P
>>774
お前プログラマに向いてないよw
推論能力が圧倒的に不足してる

引数が、xaz xbz xcz の状態なら、IFS使って xaz,xbz,xcz にできるだろw

って言っても理解できないんだろうなw
2019/08/10(土) 04:28:59.25ID:YdwKfvKq
いつものクイズくん
2019/08/10(土) 04:29:01.72ID:L+B8OP2P
>>771
zshのマニュアルにはPOSIXという文字が50個以上存在する
これでPOSIXを意識してないとか考えられんわw
2019/08/10(土) 04:29:23.37ID:L+B8OP2P
>>777
呼びました?(別に隠してない)
2019/08/10(土) 04:35:32.28ID:6d2gRK68
>>778
Zsh is able to emulate POSIX shells, but its default mode is not POSIX compatible

なんて書いてあるから何か変数を設定しないとダメみたいだな
色々弄ってるけど $# が 3 にならんのぅ…ソースコード読むしかないかなw
2019/08/10(土) 04:38:16.54ID:L+B8OP2P
>>780
たぶんその挙動はバグで確定だと思うでw
2019/08/10(土) 04:41:34.35ID:L+B8OP2P
>>768の質問には答えてくれないのかな?
set -uしてると引数が存在しない場合に動かない古いシェルはなにか?
2019/08/10(土) 04:42:42.71ID:lTTXvTcQ
>>776
うんだってプログラマじゃねーもんw

寧ろその程度の能力でイキれるお前がプログラマっぽくねぇなw

こっちの類推能力も足りんかもしれんが
そっちの説明能力もかなり欠如してんぞw
2019/08/10(土) 04:43:21.02ID:lTTXvTcQ
>>782
すまんがその前に>>765に答えてほしい
2019/08/10(土) 04:44:17.65ID:L+B8OP2P
別にイキってないが、イキってるように見えるのは
俺じゃなくて、お前の問題でしょう? 普通のことなのにお前にはそう見えてしまう。
2019/08/10(土) 04:45:41.26ID:L+B8OP2P
>>784
何に答えればいいの?

引数を完全に起きかえたいなら置き換えればいいし
置き換えたくないならば、置き換えなければいいだけじゃん
2019/08/10(土) 04:49:56.25ID:L+B8OP2P
なんで>>765みたいな質問が来るのかを推測したが、
提示したコードはそれで「完成したコード」で
そのコードを修正した「応用」は存在しないとか思ってないか?
違うことをしたいならそれに応じて変えればよかろう?
2019/08/10(土) 04:50:45.96ID:lTTXvTcQ
>>782
>>786で一応答えを頂いたので,>>768への回答をば。
https://www.in-ulm.de/~mascheck/various/bourne_args/
ここの
These shells behave the old way and need ${1+"$@"}:
に色々載ってるぜ
俺が知らないシェルもあって勉強になったわ。
2019/08/10(土) 04:57:52.03ID:lTTXvTcQ
>>785
うーむ。自省という言葉を教えてあげたいw
まあある程度シェルスクリプトの能力はありそうだが
それ以外が致命的とお見受けするわ……。

ていうかシェルスクリプトの能力ってそんな高める必要ある?
>>713程度が書ければそれで十分。
より高度な,それこそJSONやXMLみたいな階層構造のある
「1行1データ」とは限らない形式のファイルを読み込みたけりゃ,
CなりPerlなりを使えばよろしい。
もしくはjqやらxmllintやらで適切に処理して
シェルスクリプトに掛ければよろしい。
2019/08/10(土) 05:00:56.32ID:L+B8OP2P
>>788
それを探してきたかw

じゃあそこに書いてない情報を。
poshは<0.10(8年前)ということになってるが、未だ最新版(9ヶ月前)の0.13.2でも修正されていない
だから「古いシェル」は実は間違い

バグ報告はでてるんだがねぇ

posh: set -u prevents using empty argument list
Date: Wed, 3 May 2017 12:24:01 UTC
Found in version posh/0.12.6
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=861743

posh can not use "$@" together with set -u
Date: Wed, 14 Nov 2018 10:00:01 UTC
Found in version posh/0.13.2
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=913718
2019/08/10(土) 05:03:11.51ID:L+B8OP2P
>>789
> ていうかシェルスクリプトの能力ってそんな高める必要ある?

俺がやりたいことを実現するのに必須だったから
自然と高くなっただけ
2019/08/10(土) 05:19:53.11ID:YdwKfvKq
>>789
無駄だろう、最初から偉ぶりたいのが目的なんだから
他人と同等になっただけでも負けとかなんとか思ってるのだろう
2019/08/10(土) 06:27:36.08ID:lTTXvTcQ
>>790
うーん。
まあそうなのかもしれないが
poshを「無意識に」使ってしまう環境なんてあるのだろうか?
例えば#!/bin/shが/usr/bin/bashにリンクされてる環境であれば,
BashのPOSIX互換モード特有のバグには注意しなくてはいけないし,
/bin/shの実体が/usr/bin/bashになってる環境は多いので,
多くの利用者が「今 自分が使っている/bin/shが実はBashだ」と意識することなく
POSIX shで正しく動く筈のシェルスクリプトを走らせることがあると想定できる。
でもposhが既定で/bin/shにリンクされてたりする環境があるとは思えない…。
2019/08/10(土) 08:53:06.96ID:x0rFB4wI
>>751
この書き方が分かりやすくて良いと思うんだけど何か問題あるの?
2019/08/10(土) 09:44:59.99ID:L+B8OP2P
>>794
その話はもう終わってる
2019/08/10(土) 09:50:56.01ID:L+B8OP2P
>>793
何が言いたいのかわからん。

set -uで動かないシェル(例 posh)があると言い出した(>>763)のはあんただろ?

なんで俺が書いたコードがset -uで動かないと言い出した本人が
set -uで動かないシェルを使う環境なんてあるとは思えないって言ってるんだよw
2019/08/10(土) 09:52:55.77ID:lTTXvTcQ
>>794
もう触れるな。
2019/08/10(土) 09:55:34.95ID:L+B8OP2P
>>796に対する返答は?
2019/08/10(土) 10:06:01.28ID:x0rFB4wI
引数を置換するってだけで何をぐだぐだ言ってるんだかw
2019/08/10(土) 10:15:01.29ID:L+B8OP2P
だから>>751は「引数を置換する」コードになってないだろ?
2019/08/10(土) 10:20:30.35ID:x0rFB4wI
オリジナルの引数を置換するのはプログラマーの本能が止めろと言っているw
普通は置換したもの別の変数に入れて使うよな
2019/08/10(土) 10:31:58.19ID:L+B8OP2P
>>801
そのルールを守りつつ、IFS=,でjoinするというテクニックを使って(必須です。カンマ区切りをするときに使用します)
引数 a b c (例です。引数の内容、個数は変わることがあります)から
xaz,xbz,xcz (例です。引数の前後にxとzをつけてカンマ区切りにするという意味です)
という出力を得るコードを書くところまでやるのが君の仕事。
それができれば一人前だ!
2019/08/10(土) 10:37:28.54ID:L+B8OP2P
「POSIX準拠で」をつけ忘れたなw
そこまで文脈読めてないやつじゃないだろうが
2019/08/10(土) 10:43:31.28ID:x0rFB4wI
マウントとらないと死んじゃう病気なのかw
2019/08/10(土) 10:47:01.43ID:L+B8OP2P
>>804


俺はシェルスクリプトではやらないが、
他の言語で引数を置換するのはやめろというのはわかるから
その理屈は間違いじゃないとして、じゃあそれをシェルスクリプトでやるには
どうすればいいだろうか?という新たな出題に変えただけだけど?

いや、できるでしょ?これ。
2019/08/10(土) 10:48:10.57ID:L+B8OP2P
もちろんトリッキーなコードになるだろうけど
(こういうのこそトリッキーというべきだろう)
2019/08/10(土) 10:49:05.37ID:x0rFB4wI
え?
だから>>751でいいじゃん
何か問題あるのか?
2019/08/10(土) 10:49:46.44ID:L+B8OP2P
>>807
自分でルールを守ってない

> 普通は置換したもの別の変数に入れて使うよな
2019/08/10(土) 10:51:11.39ID:x0rFB4wI
>>808
は?
だから出力を変数に入れて使えばいいんだろ
2019/08/10(土) 10:51:49.42ID:L+B8OP2P
それから >>751 に関しては
引数をIFS=,でjoinするならばどうすればいいだろうか?という
出題のルールを守ってないよねってことで>>694に反してる。
2019/08/10(土) 10:52:52.04ID:L+B8OP2P
>>809
また書くのが遅れたけど、>>751>>694のルールを守ってないのでだめなんだよ。
その話は終わったって言ってるでしょw
2019/08/10(土) 10:54:58.72ID:L+B8OP2P
>>809
「置換したものを別の変数に入れて」使わなければだめ
「出力したものを別の変数に入れる」のは自分で作ったルールに違反してるw
2019/08/10(土) 10:58:02.57ID:x0rFB4wI
やりたいことができればそれでいいじゃん
2019/08/10(土) 11:22:44.90ID:L+B8OP2P
「やりたいこと」は>>694に書いてあるとおり
「IFS=,でjoinするために引数を置き換える」がやりたいこと(解答はすでに出してる)

んで、新しい問題の「やりたいこと」は>>802に書いてあるとおり
2019/08/10(土) 11:44:27.56ID:x0rFB4wI
手段が目的化する典型的な例だな
そんな縛りプレイに付き合う気になれんな

で、後からコード出して
こんなのも分からんのか?大したことねえな
ってやりたいんだろ?

それはな、
その問題がつまらないから誰もやらないんだよw
2019/08/10(土) 12:08:44.58ID:Du6eKhDT
>>798
「コードがset -uで動かない」という発言と
「poshを「無意識に」使ってしまう環境なんてあるのだろうか?」という発言は
ほぼ矛盾しないと思うんだけど。

set -uで"$@"が空のとき失敗するシェルはposhだけじゃない。
>>788で示したリンク先を見てくれ。
なぜかあなたはposhに拘ってるけど(最近になっても解決してないからか?)。

poshに限った話じゃないのに,なぜかposhに限定して話を進めてるから困るわ。
2019/08/10(土) 12:09:45.60ID:Du6eKhDT
あ,ごめん。ID変わってるけど>>797とかです。
2019/08/10(土) 12:22:13.64ID:L+B8OP2P
>>816
あんたはposhが使われる環境があるとは思えないが
古いシェルが使われる環境はあると思ってset -uの話をしたってこと?

> bash-4.0.0 ... -4.0.27
> dash-0.4.6 ... -0.4.18
> all ksh88
> ksh93 until release t+20090501
> pdksh-5.1.3, -5.2.14
> mksh before R39 (as pdksh descendant)
> posh < 0.10 (as pdksh descendant)
> NetBSD 2 ff. /bin/sh
> all traditional Bourne shells

bash 4.0といえば2009年だね。10年近く前のシェルで動かないからって何?
そんなシェルのことまで考えろって言いたかったの?
2019/08/10(土) 12:23:33.86ID:L+B8OP2P
>>815
俺に出されるのが嫌なら、お前が先に出せばいいやんw
2019/08/10(土) 12:31:02.29ID:x0rFB4wI
>>819
問題がつまらないって言ってるだけだ
なんで俺が問題出さなきゃならんのよ
お題スレでも行けや
2019/08/10(土) 12:37:04.59ID:L+B8OP2P
な?日本語の読解力に問題があるやろ?

俺は>>815にレスをしていて、その>>815
> で、後からコード出して
と書いてあるように、"出す"のは"コード"という話をしてるのに
"問題"を出す話だと勘違いしてくる。

もうね。日本語のレベルでおかしいから、会話にならんのよ。
2019/08/10(土) 12:42:22.81ID:x0rFB4wI
>>821
お前の言葉が足りないだけだ
エスパー期待するなよアホ
2019/08/10(土) 12:43:50.43ID:L+B8OP2P
足りないなら足りない部分を指摘するべき。
自分で勘違いしておいて、後から足りなかったんだっていうなよw
2019/08/10(土) 12:46:05.58ID:x0rFB4wI
誤解されたくないならちゃんとした日本語書けや
2019/08/10(土) 12:48:05.67ID:x0rFB4wI
まあどっちでも同じことだけどなw
2019/08/10(土) 13:00:05.30ID:6d2gRK68
お前らいつ寝てるん?
827デフォルトの名無しさん
垢版 |
2019/08/10(土) 13:04:34.25ID:C/8mgJdF
プロのグラマーなら半球睡眠はコモンスキル
2019/08/10(土) 13:35:44.59ID:lTTXvTcQ
>>826
???「24時間働けますか?」
2019/08/10(土) 13:37:08.94ID:lTTXvTcQ
>>818
うん。
だって>>685でbash 2.xの話をしてるということは
少なくともBashがそのバージョンであった時代くらいまでは考えるべきなんでしょ?
2019/08/10(土) 13:40:51.55ID:4go3Z6Df
OSXのデフォルトシェルがBash3だったはずと思ったら、最新のOSXだとZshになってるんだな
ま、LTSの古いOSとか、BSD系だとBash4じゃないのも結構あってまだ動いてると思う
2019/08/10(土) 14:00:29.15ID:8bQWJq+q
実務だとプログラミングって才能とかよりどれだけ知識を蓄えてるかの方が重要だよね?
このスレに居る猛者はどうやって強くなったんすか
2019/08/10(土) 14:31:51.55ID:/e4xqllv
才能のないのはまず脱落する。
体力のないのもすぐ脱落する。
あとは下積みあるのみ。
2019/08/10(土) 14:39:24.77ID:lTTXvTcQ
シェルスクリプトの才能ってなに?
驕り高ぶらないこと?w
↑半分本気
2019/08/10(土) 14:42:35.88ID:PeAU5cUa
シェルスクリプトって5行以内で使うルールで使ってるけど
引数をたくさん使いたいっていう有用なケースってある?
2019/08/10(土) 16:16:23.61ID:L+B8OP2P
>>829
その時代まで考えることと、poshが最新版でも
直ってないことは矛盾しないんだがw
2019/08/10(土) 16:17:39.49ID:L+B8OP2P
>>834
引数に * を使いたいときw
2019/08/10(土) 16:22:27.62ID:L+B8OP2P
>>830
>>2にも書いてあるが、/bin/shの実体が何かわからん時代になったからな

>  FreeBSD ユーザーは /bin/sh の実体が ash なので注意。
>  Solaris, OpenBSD ユーザーは /bin/sh の実体が ksh なので注意。
>  macOS 10.15以降のユーザーは/bin/sh の実体が zsh なので注意。
>  android ユーザーは /bin/sh の実体が mksh なので注意。

bashで動けば良いんでしょ?という時代は終わった。
POSIX準拠で書かないと多くの環境で動かない。
2019/08/10(土) 16:56:21.94ID:62yvq4d3
多くの環境で動くための何を作っているのかね
2019/08/10(土) 17:00:18.98ID:lTTXvTcQ
840デフォルトの名無しさん
垢版 |
2019/08/10(土) 17:01:40.37ID:tdOS9ehT
>>834
複数ファイルに対して同一の処理をする時。
例えば特定の文字コードに変換するとか。
2019/08/10(土) 17:04:52.26ID:4go3Z6Df
クロスプラットフォーム必要なケースで、シェルスクリプトで作り込んだりしないよ
PerlかPythonか、Windowsも対応するならGoとか使う
2019/08/10(土) 17:10:57.28ID:L+B8OP2P
>>838
逆じゃね? 何かをシェルスクリプトで作ったとして
多くの環境で使うなら、多くの環境で動かんとだめでしょw
2019/08/10(土) 17:14:02.55ID:L+B8OP2P
>>841
例えば組み込み機器でPerlやPythonも入ってない、入れられないときはどうする?
シェルスクリプトはかろうじて使える(最初から入ってるから)
Goはバイナリがでかいから、空き容量も制限されてる組み込み機器には入れたくない
今はIoT時代ですよ(笑)
2019/08/10(土) 17:24:27.35ID:leF4BPLu
>>843
シェルスクリプトってすごいんだな
そんな組み込みでも走るとは
2019/08/10(土) 17:35:44.47ID:L+B8OP2P
>>844
組み込みLinux用に作られたBusyBoxっていうのがあって、
一つのバイナリに様々な外部コマンド(catとかsedとかwcとか)が詰め込まれてる。
そのBusyboxにashも組み込まれてる。

ただし様々な外部コマンドが組み込まれてるといっても、POSIX完全準拠を
目指しているわけじゃなくて、容量節約のためあまり使われないオプションを実装していない。
それでもシェル(ash)はPOSIX準拠になってる。

BSDなどでもそうなんだが外部コマンドはオプションが違うことがある。
オプションの違いでLinuxで動いたものがMacで動かなかったりするが
シェルスクリプトで実装していればそういうこともない。
2019/08/10(土) 17:37:10.25ID:L+B8OP2P
(Busyboxは組み込み用ではあるが、組み込みLinux用とは限らんかw)
2019/08/10(土) 17:46:25.47ID:6d2gRK68
(´-`).。oO(IoT機器で文字列くっつけたりTSVファイルを混ぜたりしているのか…
2019/08/10(土) 17:53:19.49ID:L+B8OP2P
そりゃすることもあるだろw

IoTはモノのインターネットの略なんだから
インターネットにあるものと連携してるよ。

TSVやCSVだけじゃなくJSONやXMLやYAMLも扱いたい
(簡易なことならsedなどで対応できるが)
849デフォルトの名無しさん
垢版 |
2019/08/10(土) 17:56:06.44ID:C/8mgJdF
やっぱりどこでも動くシェルスクリプトなんて幻想なんだね…
2019/08/10(土) 17:56:37.22ID:6d2gRK68
(´-`).。oO(心の声に反応しないで欲しい…w
2019/08/10(土) 18:04:41.45ID:L+B8OP2P
>>849
POSIX準拠でシェルスクリプトで書けば可能だって言ってんだろw
852デフォルトの名無しさん
垢版 |
2019/08/10(土) 18:30:59.43ID:SA5rOGgq
今現在でも世界中で書かれているシェルスクリプトの一体何%がPOSIX準拠なのか。
ま、実質幻想だね。
2019/08/10(土) 18:31:19.35ID:4go3Z6Df
まあ無理だね
2019/08/10(土) 18:38:02.19ID:6d2gRK68
(´-`).。oO(心は常に幻想を追い求める…原理主義者の業の深さよ…
2019/08/10(土) 19:05:33.96ID:blTYOOvx
具体性ゼロだな。単なる可能性想像上だけの話だな
多くは限られた環境しか使わんし、それで動けばいい、何か他で使うようなときに問題があったら考えようで十分だろな
使ってる環境(OS)にデフォで入っている汎用スクリプトもそのOSでしか動きませんというのもそんなもんだし
2019/08/10(土) 19:15:08.08ID:L+B8OP2P
例えば、gitはいろんな環境で使うが、35.7%がシェルスクリプトである

https://github.com/git/git
2019/08/10(土) 19:24:04.14ID:gKKk3ZAT
(´-`).。oO(いつからgitはPOSIXコマンドになったんだろう)
2019/08/10(土) 19:26:31.61ID:6d2gRK68
シェルスクリプトと言いつつ Perl もご使用の様子

https://github.com/git/git/blob/master/git-filter-branch.sh#L284
2019/08/10(土) 19:29:59.92ID:L+B8OP2P
35.7%っていってるんだから、探すまでもなく他の使ってるってわかるだろw
2019/08/10(土) 19:30:21.32ID:L+B8OP2P
>>857
gitがPOSIXコマンドだって誰も言ってない
2019/08/10(土) 19:34:35.69ID:6d2gRK68
少なくとも git-filter-branch.sh は perl がインストールされていない環境では
動作しない…それに、シェルスクリプトの表現能力が(他の言語に比べて相
対的に)低いために全体の占める割合が高くなってしまっているという可能性
も否定できない。別段それが悪いわけではないが。
2019/08/10(土) 19:49:03.72ID:lTTXvTcQ
gitコマンドの話(しかも実装の話)を延々とされても困るわ
2019/08/10(土) 19:51:14.48ID:L+B8OP2P
そりゃ具体例があるという話をされると困るやろなw
2019/08/10(土) 19:52:40.23ID:L+B8OP2P
じゃあ続いての具体例、rbenv。Shellが96.5%
https://github.com/rbenv/rbenv
2019/08/10(土) 19:56:39.76ID:6d2gRK68
shbang が全部 #!/usr/bin/env bash だな。個人的にはこの方がいいけどw
2019/08/10(土) 19:58:18.27ID:gKKk3ZAT
(´-`).。oO(gitを使うシェルスクリプトはPOSIX準拠じゃないだろ)
2019/08/10(土) 19:59:11.41ID:L+B8OP2P
gitを使うシェルスクリプトってなんのこと?
2019/08/10(土) 20:01:14.55ID:gKKk3ZAT
gitを呼び出すシェルスクリプト...
2019/08/10(土) 20:03:00.81ID:N6maMe0S
まさかと思ったが具体性のために git を出したのか。誰がそんなことを聞いているねん
ここにいるどんだけの人がそういう多くの人が使うのを書いているねん。今までのでもほとんど「私用」だろに
2019/08/10(土) 20:03:07.19ID:L+B8OP2P
gitを呼び出すシェルスクリプトの話は誰もしてない
2019/08/10(土) 20:04:38.53ID:L+B8OP2P
>>869
世界の話をするな。ここにいる人たちだけの話をしろ
俺たちの村の話だ。って言いたいわけ?
2019/08/10(土) 20:07:18.63ID:N6maMe0S
私用で限られた環境で動けばいいのならPOSIXにこだわる必要性はほぼゼロだな
そしてこのスレでの限られた人を除いては、あくまでも私用範囲といういたって普通の話だろう

だから、あなたがgitレベルの何を書いているのかね?そういう具体性。自分でそういうの書いていないのに?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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