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

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

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

シェルスクリプト総合 その33
https://mevius.5ch.net/test/read.cgi/tech/1584893550/
2020/09/10(木) 02:57:03.19ID:wmlkkGXD
>>71
command -p (もしくはただのcommand)って
シェルで微妙に動作が違うんだよな

ちゃんとまとめてないからきっちりとは言えんけど
例えば dash や ksh だと command -p printf --help は
ビルトインコマンドが実行される

zshだと外部コマンド
zsh で command -p : がエラーになるのはそのせい
2020/09/10(木) 03:02:01.02ID:wmlkkGXD
なんで昔の人って

command ・・・ 外部コマンドを実行する
builtin ・・・ ビルトインコマンドを実行する
function ・・・ シェル関数を実行する

みたいに全部作ろうと思わなかったんだろうな?
ユースケースを思いつかなかったということなんかな
2020/09/10(木) 03:19:24.10ID:Imxe+iF3
zsh
% type command
command is a shell builtin

https://linux.die.net/man/1/zshbuiltins
command [ -pvV ] simple command
The simple command argument is taken as an external command instead of a function or builtin and is executed. If the POSIX_BUILTINS option is set, builtins will also be executed but certain special properties of them are suppressed. The -p flag causes a default path to be searched instead of that in $path. With the -v flag, command is similar to whence and with -V, it is equivalent to whence -v.
See also the section 'Precommand Modifiers'.
2020/09/10(木) 04:00:38.67ID:MVNZ6OMc
zshにしたら今まで使ってたbashがぶっ壊れることって結構ありますか?
2020/09/10(木) 05:24:13.89ID:krA4WMn4
bashがぶっ壊れるって何?
両方入れるだけでしょ?

bash消してzsh入れるっていうのならぶっ壊れる可能性が高い
もしくは最初からbashが入ってない(必要ない)システムを使うとかね
例えばdashを採用しているdebian/ubuntuとか

そういうシステムでもdashを消してzshにしたらぶっ壊れる
zshをPOSIXモードで実行すればワンチャンあるかもしれんけど
2020/09/10(木) 08:23:53.97ID:gaq4bikN
bash用スクリプトはzshで動かすことを考えて作っていない限り動かない
sh用スクリプトであってもzshでは動かない可能性がある
2020/09/10(木) 09:30:12.19ID:KfHzrxU8
カタリナにしてからmacのターミナル起動するたびに出てくる
`chsh -s /bin/zsh`って実行したらbash使えなくなるよね?
79デフォルトの名無しさん
垢版 |
2020/09/10(木) 13:51:29.36ID:a+RPoaYl
>>73
zshを基準に見ているからそうなる。
80デフォルトの名無しさん
垢版 |
2020/09/10(木) 13:53:05.81ID:a+RPoaYl
シェルとコマンドの関係はOS依存たぞ
2020/09/10(木) 14:42:26.26ID:aa4WTOXX
>>79
意味不

>>80
意味不w
2020/09/10(木) 14:47:37.11ID:aa4WTOXX
>>78
ならない。
macは最初からbashとzshの両方がインストールされてる。容量の無駄遣い
macOSでbashは/bin/shとして使われてる。Debianで使われてるdashよりも重い

最新のbashは5系だがmacOSの/bin/shのbashは3系で古い。
ライセンスのせいで新しいbashにアップデートできない
しかしPOSIX準拠のdashにしようと思っても
bash依存してるスクリプトがあって互換性の問題が出るからdashにもできない

つまりmacOSの/bin/shはPOSIX準拠のdashでもない上に
古いbashという中途半端な状態
2020/09/10(木) 14:49:08.50ID:aa4WTOXX
>>77
> `chsh -s /bin/zsh`って実行したらbash使えなくなるよね?
さっさと実行しろ。どうせシェルスクリプトの類はbashで動く
明示的にしていて無い限りmacOSでは古いbashでスクリプトを動かすことになる
最新のbashの機能も使えない
84デフォルトの名無しさん
垢版 |
2020/09/10(木) 15:45:56.05ID:uhPbYbU6
>>81
コマンドについてはデフォルトのシェル用に作られたものを、別のシェルでは動きを変えて対応している。

だから同じ名前のシェルでもOSが異なれば、動きが変わる。

Linuxのshはbashがsh風に動かしているだけで、いろんなところがshではない。
2020/09/10(木) 16:58:53.57ID:aa4WTOXX
>>84
それが>>73のレスと何の関係があるの?
どういうつながりでそういう発言をしたのかを聞いてる
86デフォルトの名無しさん
垢版 |
2020/09/10(木) 18:11:40.04ID:uhPbYbU6
>>85
UNIXは体系的に作られたものではないということ。

それぞれが他人によって作られ、それらを統合しているため、一貫性がないのが普通。

細かい規格も存在していないので、コマンド、スクリプトは環境に依存する。
2020/09/10(木) 18:21:46.36ID:aa4WTOXX
>>86
だからそれが何の関係があるの?
2020/09/10(木) 19:21:59.58ID:aD+veWb6
>>87
>>73
後出しの思い付きを垂れたからやろ。
2020/09/10(木) 19:37:41.08ID:pjCowNAw
なんでだろう?→疑問に思うな!

思考停止か
2020/09/10(木) 22:48:02.68ID:QyeHeLUF
>>86 って言ってるのに、疑問に思うな思考停止とか読めないやつなんだろな
91デフォルトの名無しさん
垢版 |
2020/09/10(木) 23:37:28.48ID:a+RPoaYl
そもそもUNIXは、たまたまこうなったんじゃなくて、合理的な理由があるんだけど、なんでそれを知ろうとしないの?

UNIXはこういう思想で物を作ってますと宣言してるのに。
2020/09/11(金) 01:22:31.38ID:hZ3Ldf5L
いやー、たまたまやろ。
根っこにポリシーはあっても、それ以外はかなりのいきあたりばったり。
2020/09/11(金) 03:59:13.43ID:d1DTUP2t
>>92
それな。"$1" みたいにダブルクォートでくくらないといけないのは
明らかな仕様の失敗だって言われてるし
他の言語と同じようにPOSIXシェル以前やBourneシェル以前との
互換性をある程度保ちながら改良を続けてきた
必ずしも合理的な理由があるわけじゃないよ。作者がたまたま必要だった
必要と思いつかなかった。それだけだろ
2020/09/11(金) 08:15:02.44ID:xA9OFzcD
>>93
二重引用符で囲まない場合,
どういう利点があるの?
あとそれを説明した記事とかある?
2020/09/11(金) 08:49:14.16ID:5RqPMo1H
>>94
> 二重引用符で囲まない場合,
> どういう利点があるの?
ない

やりたいことはevalで代用できる
96デフォルトの名無しさん
垢版 |
2020/09/11(金) 11:23:25.35ID:oZv/fWa7
ぬるぽ
2020/09/11(金) 11:48:58.51ID:+wXdjlpn
>>94
あるというか、そうしなければならない場合も。
引数がなかったときに、クォートされてると、空文字列になってしまうので、意味が変わる。

make $1
みたいなスクリプトだとクォートしてはいけない。
2020/09/11(金) 13:38:53.46ID:2ygR8GWv
>>97もクォートしないと駄目。嘘を教えるな
2020/09/11(金) 13:45:46.53ID:GM+a9m1V
>>98
試してから言え。
簡単に嘘呼ばわりすんな。
2020/09/11(金) 14:05:53.38ID:2ygR8GWv
>>97
だと makeに "install uninstall" という文字を渡すと
エラーにならずに実行できるから駄目
試さなくてもわかる
2020/09/11(金) 14:32:38.68ID:GM+a9m1V
>>100
じゃあ引数がないときは?
2020/09/11(金) 14:36:02.66ID:FL1BL0eE
>>101
引数がないのに$1を参照してたら

bash: $1: 未割り当ての変数です

っていうエラーが出るだろ
アホかw
2020/09/11(金) 15:18:28.07ID:GM+a9m1V
>>102
でねえわ。
-uを前提にすんな。
クズ。
2020/09/11(金) 15:22:36.50ID:ClWA61Ey
>>103
お前のようなやつが rm -rf "$path/" とか書いて痛い目見るんだろ
ベストなやり方前提にしろ。ベストなやり方で使えない方法を持ってくるな
2020/09/11(金) 17:22:23.47ID:GM+a9m1V
>>104
勝手に-uをベストに決めつけんな。クズ。
オプションは使うべきときに使え。クズ。

makeみたいな、引数の有無で挙動が変わるコマンドがあって、考えなしに変数をクォートすりゃあいいってもんじゃない、って話をしてんだよ。クズ。
2020/09/11(金) 17:26:30.94ID:rpshaWn6
考えなしにクォートしなかったから
バグが増え危険なコードになってんだろが
107デフォルトの名無しさん
垢版 |
2020/09/11(金) 17:39:34.54ID:cQZtEKri
ガッ
108デフォルトの名無しさん
垢版 |
2020/09/11(金) 17:48:50.71ID:oZv/fWa7
make組のスクツか
2020/09/11(金) 17:53:09.84ID:JEMEP9MD
ガッ
なコード書きたいただの甘えん坊だな ID:GM+a9m1V は
2020/09/11(金) 18:41:08.82ID:GM+a9m1V
>>108
lsでも同じ。
2020/09/11(金) 19:09:02.73ID:JEMEP9MD
シェルスクリプト書くうえで、
command
command arg
どちらも(前にチェック無しで)書きたいなんてほとんどないだろうに。ほとんどないのはあげつらってるのはお前だけという点で明らかだな

ls で言えば
ls target
ls
結果が違うんだから目的も違う
ls ''
でエラーになる方が大体の目的にあっているだろうにとしか思えない
112デフォルトの名無しさん
垢版 |
2020/09/11(金) 21:09:13.16ID:GJYer3nV
>>92
だから、そう説明してるんだよ。わざわざ作り直したり、同じようなものを作らないのがUNIXの考え方。
2020/09/11(金) 21:25:03.10ID:GM+a9m1V
>>111
文盲どもめ。
もともと頻度の話ではない。
クォートしないことにも意義がある、というだけ。

実際、既存コマンドのラッパーみたいなものを書くときなんかでは活用できる。
2020/09/11(金) 21:30:01.59ID:xA9OFzcD
そこでPlan 9 rcですよ。

引用符の種類が一つしかない。
そしてクソほど使いにくいw
2020/09/11(金) 22:09:45.47ID:JEMEP9MD
>>113
文盲と他人をあげつらってるくせにの文盲はお前じゃ
>クォートしないことにも意義がある
誰も意義がないなんて言ってないだろが

発端は
>それな。"$1" みたいにダブルクォートでくくらないといけないのは
>明らかな仕様の失敗だって言われてるし
だからな。その流れ中にクォートありだけをあげつらっている(?)のは、クォートしないことにも意義があるじゃなく読まれてもしょうがないな
2020/09/11(金) 22:26:19.12ID:JEMEP9MD
失敗だって言われてるってその例では「全く」wピンと来ないが、

今時名前の中にスペースが入っているの当たり前で、ほぼ必ずダブルクォートで囲まなければならないのがメンドくさいのは確かだな
逆(単にダブルクォート有無の動作が逆ではなく、ダブルクォート無しでもダブルクォート有りの動作、IFSで分かつなら別の表現)っていうのならわかるが、失敗というほどでもねえなとも思われる
多分、伝わってないのは、そういうことだよw
2020/09/11(金) 22:45:29.66ID:GM+a9m1V
>>115
違うわ、文盲。
>>94
これ。
2020/09/11(金) 22:54:33.23ID:JEMEP9MD
>>117
話には流れがあるんだな
で、お前の言うことには言うほどでもないってこともあるだろう、そのしつこく延々と>>94にたいしてって言うのは。自分で案に認めてるように 頻度 はそうないらしいしw
文盲の意味を履き違えてるなwてかよくわかってないだろう
2020/09/12(土) 00:02:20.83ID:8+3Td7f1
$1と書いてるのに$1がないとみなされるのは
利点ではなく欠点
2020/09/12(土) 01:27:02.50ID:cIbo/3Vm
>>119
シェルの変数は、ただのテキスト置換なレベルだからな。
今さらそんな理想を言っても始まらん。
2020/09/12(土) 01:28:06.18ID:cIbo/3Vm
>>118
いや、あきらかに文盲であることがはっきりした。w
2020/09/12(土) 01:28:55.85ID:Q/cMHo3Y
>>120
> シェルの変数は、ただのテキスト置換なレベルだからな。
それはウソ
2020/09/12(土) 01:51:34.41ID:lVvt6egL
>>121
流れに関係なく、俺の突然言い出したことを理解できないのは文盲というのなら、お前から見たら文盲なんだろな
文盲という意味(厳密な意味じゃない)を理解してないアレだと俺は思うけどな
っていうことで明らかに終わりだな、その投げやり言い放ちだけのレスでw
124デフォルトの名無しさん
垢版 |
2020/09/12(土) 03:31:42.22ID:d3hRbJnw
仮にお前が賢い人間だとするじゃん
仮に相手が馬鹿な人間だとするじゃん
その場合だと争いにならないわけだから争いになってるということはその過程は合っていなかったわけだね
つまり
お前らは馬鹿だってことさ
125デフォルトの名無しさん
垢版 |
2020/09/12(土) 04:17:42.56ID:wMTnI8uy
>>122
コードをどう解釈するのかはシェル内部の仕様。

変数名を文字列として指定し、文字列で指定された変数の値を参照する仕組みもシェルの仕様。

これは結果的にわかりにくい表現、使ううえで間違いやすい仕様として認識されている。

UNIXはたいしたことない欠点をあとから変更する文化はない。

マイクロソフトのように次から次へ新しいものを作っては捨て、作っては捨てということはしない。
2020/09/12(土) 05:24:39.89ID:Q/cMHo3Y
単に互換性のために修正できないだけ
欠点は欠点。修正できない可哀想
だからPOSIXに新しい言語も追加できない
2020/09/12(土) 05:39:35.64ID:Q/cMHo3Y
> 変数名を文字列として指定し、文字列で指定された変数の値を参照する仕組み
ウソ
2020/09/12(土) 05:49:23.00ID:UoolulYH
行為主体(発言主体)の意思ではなく事柄の客観的事実に言及したいのであれば、「ウソ」ではなく「間違い」「事実ではない」といった言葉を用いるべし
2020/09/12(土) 05:49:59.50ID:Q/cMHo3Y
わかってていってるからウソだろう
2020/09/12(土) 06:29:49.25ID:UoolulYH
だろうおじさんでしたか...
2020/09/12(土) 07:07:17.20ID:uZ7XE8wK
本人が否定しなければウソだということ
132デフォルトの名無しさん
垢版 |
2020/09/12(土) 13:09:24.18ID:wMTnI8uy
>>126
そうね。でもそれで大成功をおさめているのがUNIX系。もうすべてがUNIXになりつつある。WindowsのUNIX化もとまらない。

そもそもシェルスクリプトに不満があるのなら、別のスクリプト言語を使えばいい。
2020/09/12(土) 13:09:48.29ID:65NtGZ7l
仕事でシェルスクリプトを触りはじめたけどすぐに地雷を踏む
2020/09/12(土) 13:23:20.82ID:6ll5lvdV
macのローカルで作ったシェルをLinuxで動かしたら悲しいことになった
2020/09/12(土) 14:00:32.63ID:Py28fth2
>>132
> そもそもシェルスクリプトに不満があるのなら、別のスクリプト言語を使えばいい。
/bin/shが他のスクリプト言語になることなんてあるんか?
最小構成で他のスクリプト言語が含まれることなんかあるんか?
POSIXが改定して別のスクリプト言語が使えるようになることなんてあるんか?

現実的にありえない話をしても意味がない
2020/09/12(土) 14:01:12.85ID:Py28fth2
>>133
まあ初心者さんは何でもそうだよね

>>134
だからPOSIX準拠しろって話だ
137デフォルトの名無しさん
垢版 |
2020/09/12(土) 14:34:38.84ID:tj7slUn6
>>133
例えば?
2020/09/12(土) 14:58:47.65ID:cIbo/3Vm
>>133
ワナだらけだからね。
しかたないね。
本当に。。。
2020/09/12(土) 15:02:55.76ID:WICsaeqa
自分が無知なのをごまかすためにわなと言ってる
2020/09/12(土) 15:05:52.91ID:cIbo/3Vm
>>135
じゃあPOSIXなんか無視すりゃいいんだよ。
自分で好きなのをインストールすれば。

poshが普及したりはしないかな?w
2020/09/12(土) 15:52:04.79ID:WICsaeqa
自分は良くても他人のイメージを使うときに困るだろ

posh?好きなら自分でイントールしてろw
2020/09/12(土) 15:58:40.31ID:WICsaeqa
>>140
そのposhとかいうのをmacにインストールしたんだが

$ cd /
posh: cd: too many arguments

で動かないんだがwww

こんなバグソフト普及するわけねーだろwww
2020/09/12(土) 16:01:00.14ID:WICsaeqa
poshを終了しようとして

$ exit
posh: exit: bad number

www
2020/09/12(土) 17:12:01.89ID:cIbo/3Vm
>>141
POSIX互換ならなんでもすべて同じ、ではないから、そんな配慮はムダ。

>>142
ツンデレだな?w
まあがんばれ。
145デフォルトの名無しさん
垢版 |
2020/09/12(土) 17:14:06.13ID:l+/2U9kY
https://hoge1http://hoge2https://hoge3

https://hoge1
http://hoge2
https://hoge3
にしようと、sedやperlワンライナーで頑張ってみたけど
https://hoge1http://hoge2
https://hoge3
にしかならないです

どうやればできますか?
2020/09/12(土) 17:37:28.98ID:lYGfHMY4
>>144
全て同じではないから/bin/shはdashかbashしかありえない
2020/09/12(土) 17:39:17.54ID:bxqUAjH/
PS > "https://hoge1http://hoge2https://hoge3"; -split "http"| %{if($_ -ne ""){"http" + $_}}
https://hoge1
http://hoge2
https://hoge3
2020/09/12(土) 18:48:43.31ID:T2sfpjbr
>>145
echo 'https://hoge1http://hoge2https://hoge3' |
sed -e 's/https\{0,1\}:\/\//\
&/g'

いけるけど?
149デフォルトの名無しさん
垢版 |
2020/09/12(土) 22:08:36.54ID:wMTnI8uy
>>135
シェルスクリプトで全部やるなんて言われたら、バークレー校出身者もびっくりだわw
2020/09/12(土) 23:06:50.77ID:T2sfpjbr
https://mrsh.sh/
A minimal POSIX shell
2020/09/13(日) 01:46:19.84ID:adiCUzyX
>>150
This project is a work in progress.

はい撤収w
2020/09/13(日) 01:47:10.49ID:adiCUzyX
>>149
今話をしてるのはシェルスクリプトでやることの話だろ
153デフォルトの名無しさん
垢版 |
2020/09/13(日) 01:59:03.48ID:Z+zAoG6v
よくわからないのが、シェル関数や外部プログラムを作って、呼び出せばいいんじゃないの。

シェルスクリプトの見た目がどうこうという話は不毛だよ。
2020/09/13(日) 02:53:31.51ID:adiCUzyX
シェルスクリプト(の文法)に不満がある
→別のスクリプト使えばいい。あちこちに頼んで入れてもらえ

馬鹿なの?
どこにシェルスクリプト以外のスクリプト言語が
予めインストールされている世界があるというのか
現実を見たほうがいい
2020/09/13(日) 04:07:42.04ID:yf/OpS3O
>>154
「予め」とか言ってるのが馬鹿。
自分でインストールしようと思えばする。
でなければしない。
それだけ。
2020/09/13(日) 06:59:54.51ID:adiCUzyX
だから他人が作ったイメージでは無理だろ
なんでもroot持ってると思うな
157デフォルトの名無しさん
垢版 |
2020/09/13(日) 08:18:10.16ID:Z+zAoG6v
>>154
そのOSの基本シェルがインストールされていないわけがない。

そもそもシェルがなんなのかわかっているのか?
2020/09/13(日) 08:30:33.36ID:723dk/Fa
>>154
だからシェルスクリプト以外を使えないだろって話をしてる
2020/09/13(日) 08:30:53.63ID:723dk/Fa
間違え

>>157
だからシェルスクリプト以外を使えないだろって話をしてる
160デフォルトの名無しさん
垢版 |
2020/09/13(日) 10:56:17.02ID:lPS2EOvv
>>147,148
ありがとう

>>147
PS???は初見だったんで調べてみます

>>147
先頭のhttpを除外しようと、頭が固くなってた
2020/09/13(日) 11:12:17.07ID:gk+8XYjA
>>160
PSはPowerShell、Windowsのやつなので関係ない
調べるだけ時間の無駄
2020/09/13(日) 11:14:43.75ID:lvPQUdaN
>>151
え,開発途中だったら興味ないの?
2020/09/13(日) 11:16:03.05ID:gk+8XYjA
開発断念には興味ないよw
164デフォルトの名無しさん
垢版 |
2020/09/13(日) 13:04:46.28ID:lPS2EOvv
>>161
助かりました
2020/09/13(日) 14:46:18.01ID:fPwxPBWU
>>164
いえいえ
166デフォルトの名無しさん
垢版 |
2020/09/13(日) 17:11:10.48ID:yiIqPN8F
お前じゃない
2020/09/13(日) 18:32:41.62ID:lvPQUdaN
>>163
This project is a work in progress
2020/09/13(日) 18:38:01.19ID:8aNWh6BR
>>167
コミット見てみ。もう飽きてる。
2020/09/13(日) 20:15:09.89ID:lvPQUdaN
>>168
そんなことわかるなんてすごいね。
170デフォルトの名無しさん
垢版 |
2020/09/13(日) 20:50:53.96ID:Z+zAoG6v
>>159
そもそもおまえはUNIX、Linuxをインストールしたことがあるのか?

かなり不思議なことを言っているぞ?

sedやawkは何か説明できる?
171デフォルトの名無しさん
垢版 |
2020/09/13(日) 20:53:16.41ID:qg7N5frC
Ubuntuのインストールを学ぶべき。
172デフォルトの名無しさん
垢版 |
2020/09/13(日) 21:07:19.31ID:Z+zAoG6v
Linuxをインストールしたら、Perlもデフォルトでインストールされることも知らないんだろうな。

そもそもシェルの概念がわかってないと、シェルスクリプトがシェルのスクリプトだとおそらく理解できない。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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