シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
シェルスクリプト総合 その32
■ このスレッドは過去ログ倉庫に格納されています
2019/10/25(金) 00:08:45.53ID:6btPTvif
218デフォルトの名無しさん
2019/12/12(木) 19:04:56.67ID:AVYkL4QT219デフォルトの名無しさん
2019/12/12(木) 19:06:01.30ID:CkUjiG2X220デフォルトの名無しさん
2019/12/12(木) 19:23:11.97ID:AVYkL4QT 語彙がおかしくなってる(笑)
221デフォルトの名無しさん
2019/12/12(木) 19:24:18.99ID:CkUjiG2X こういうやつwww
222デフォルトの名無しさん
2019/12/12(木) 22:51:40.18ID:1H8k0UmA223デフォルトの名無しさん
2019/12/13(金) 02:20:43.65ID:ysGzQi5M >>222
書いていて思ったけど、リンク先のやつ
s=$s" -negate" のsの使い方がわからんのよね
その後どう処理するか
それを入れるともっと複雑になるはずだが
それが書いてないからシンプルに見えちゃう
シェルスクリプトに限らないけど、オプション解析ライブラリはヘルプを
自動で作ろうとするけどそのヘルプを詳しく書こうとするととたんに見づらくなる気がする。
横にに長くなるんだよね。
逆の発想でPythonではヘルプを解析してオプション解析コードを生成するdocoptというものがある。
これのシェルスクリプト版でdocoptsというのもあるけど内部でgoバイナリを呼び出してて
シェルスクリプトネイティブじゃないのでちょっとダサい実装だったはず
https://github.com/docopt/docopts
こっちのほうが良い気がしてるがやっぱりヘルプにこだわりだすと、うーんって感じなので
結局、catで出力する方法で落ち着いてる。↓これね
cat<<HERE
Usage: ・・・
-a, --aaa aaaaaa
HERE
書いていて思ったけど、リンク先のやつ
s=$s" -negate" のsの使い方がわからんのよね
その後どう処理するか
それを入れるともっと複雑になるはずだが
それが書いてないからシンプルに見えちゃう
シェルスクリプトに限らないけど、オプション解析ライブラリはヘルプを
自動で作ろうとするけどそのヘルプを詳しく書こうとするととたんに見づらくなる気がする。
横にに長くなるんだよね。
逆の発想でPythonではヘルプを解析してオプション解析コードを生成するdocoptというものがある。
これのシェルスクリプト版でdocoptsというのもあるけど内部でgoバイナリを呼び出してて
シェルスクリプトネイティブじゃないのでちょっとダサい実装だったはず
https://github.com/docopt/docopts
こっちのほうが良い気がしてるがやっぱりヘルプにこだわりだすと、うーんって感じなので
結局、catで出力する方法で落ち着いてる。↓これね
cat<<HERE
Usage: ・・・
-a, --aaa aaaaaa
HERE
224デフォルトの名無しさん
2019/12/13(金) 02:37:48.49ID:r2S5lo/C HERE よりその文章全体の要約がUSAGEなので
END_USAGE とかにしたほうがちょっと読みやすい
END_USAGE とかにしたほうがちょっと読みやすい
225デフォルトの名無しさん
2019/12/13(金) 03:28:44.87ID:ysGzQi5M END_USAGEからはじまるで?
226デフォルトの名無しさん
2019/12/13(金) 12:27:46.56ID:aQIhFndX 素人がここで訊くのはアレだがコマンドのオプションってなんでああもガバガバなの
lsは-hvlみたいにまとめられるしどこにでも指定できるじゃない
shortとlongで仕様を決めたらしいがfindからして従ってないし
ddはそもそも出自が違うらしいから異質でも納得だけども
lsは-hvlみたいにまとめられるしどこにでも指定できるじゃない
shortとlongで仕様を決めたらしいがfindからして従ってないし
ddはそもそも出自が違うらしいから異質でも納得だけども
227デフォルトの名無しさん
2019/12/13(金) 16:35:44.26ID:oSsH2Kni >>222
偉そうな言い方になるけど,もしあのスクリプトの
[ ${_helpcnt:-0} -ge 1 ] && \
{ optdoc 'オプションtの解説'; continue; }
という部分が
helpdoc 'オプションtの解説'
みたいに一コマンドで完結していれば使いたくなったかも。
ところが関数の中でcontinueを使うと効果なくなるのよね……w
偉そうな言い方になるけど,もしあのスクリプトの
[ ${_helpcnt:-0} -ge 1 ] && \
{ optdoc 'オプションtの解説'; continue; }
という部分が
helpdoc 'オプションtの解説'
みたいに一コマンドで完結していれば使いたくなったかも。
ところが関数の中でcontinueを使うと効果なくなるのよね……w
228デフォルトの名無しさん
2019/12/13(金) 18:58:27.09ID:ysGzQi5M 個人的にはgetoptsはロングオプションが使えないから
それだけで候補にはならんなぁ
かと言ってgetoptはロングオプション使えるけど、
数を増やすと一行がどんどん長くなってしまうw
それだけで候補にはならんなぁ
かと言ってgetoptはロングオプション使えるけど、
数を増やすと一行がどんどん長くなってしまうw
229デフォルトの名無しさん
2019/12/13(金) 19:44:00.66ID:oSsH2Kni 寧ろgetoptはPOSIXに準拠しなくなってしまうから嫌だな。
コマンドの主要な部分でどうしても非POSIXコマンドに頼らざる得ないとかならともかく
オプション解析っていう割と副次的な部分の機能を高めるが為にわざわざ標準から逸脱したくない。
(あんまり拘るとキリないけどw)
コマンドの主要な部分でどうしても非POSIXコマンドに頼らざる得ないとかならともかく
オプション解析っていう割と副次的な部分の機能を高めるが為にわざわざ標準から逸脱したくない。
(あんまり拘るとキリないけどw)
230デフォルトの名無しさん
2019/12/13(金) 19:51:43.71ID:ysGzQi5M あ、getoptが良いって言ってるわけじゃないよw
getoptはロングオプションが使えるってのは
一見良いように思えるけど、引数が長くなるから
getoptsが一文字なのは、あえてそうなってるかもなってこと
getoptはロングオプションが使えるってのは
一見良いように思えるけど、引数が長くなるから
getoptsが一文字なのは、あえてそうなってるかもなってこと
231デフォルトの名無しさん
2019/12/13(金) 19:55:08.60ID:ysGzQi5M あとgetoptsもgetoptもだけどさ
使うことでオプション解析って楽になってる?
使わないで独自解析してるのも見かけるけどそれと大差ないように感じる
何が嬉しくてgetoptsもgetoptを使うんだろう?
使うことでオプション解析って楽になってる?
使わないで独自解析してるのも見かけるけどそれと大差ないように感じる
何が嬉しくてgetoptsもgetoptを使うんだろう?
232デフォルトの名無しさん
2019/12/13(金) 21:32:49.16ID:oSsH2Kni そりゃ多少なりとも手間が省けるからじゃない?
たしかに結局whileやらcase文やら多用してるから大差ないように思えるけど
-abc←こういう一つのハイフンの後に複数のオプションが指定されている場合を考慮したり
オプション引数があるときはshiftする個数変えたり……
みたいなことは少なくとも俺のような頭の弱い人間には保守・管理しにくい。
経験上,getoptsが使われている場合は,
自前でオプション解析してる場合よりも常套的な構文が使われてる(もうほぼほぼwhileとcaseの入れ子)
から,gettoptsによるオプション解析の部分は読み飛ばしてもOKっていうのは気分が楽w
たしかに結局whileやらcase文やら多用してるから大差ないように思えるけど
-abc←こういう一つのハイフンの後に複数のオプションが指定されている場合を考慮したり
オプション引数があるときはshiftする個数変えたり……
みたいなことは少なくとも俺のような頭の弱い人間には保守・管理しにくい。
経験上,getoptsが使われている場合は,
自前でオプション解析してる場合よりも常套的な構文が使われてる(もうほぼほぼwhileとcaseの入れ子)
から,gettoptsによるオプション解析の部分は読み飛ばしてもOKっていうのは気分が楽w
233デフォルトの名無しさん
2019/12/14(土) 11:52:21.09ID:gTK06/8e POSIX man(開発段階)の仕様書に
各企業が「よりよいヘルプ体系」(“better help system”)を付け加えることに意欲的である
っていう文章があるんだけど
このよりよいヘルプ体系について具体的に論じてるページとか知りませんか。
各企業が「よりよいヘルプ体系」(“better help system”)を付け加えることに意欲的である
っていう文章があるんだけど
このよりよいヘルプ体系について具体的に論じてるページとか知りませんか。
234デフォルトの名無しさん
2019/12/14(土) 12:02:40.53ID:q2HhYeOb ドキュメントはもうウェブサイトで用意したほうが良いよ
235デフォルトの名無しさん
2019/12/14(土) 20:55:20.00ID:gTK06/8e236デフォルトの名無しさん
2019/12/14(土) 21:20:20.57ID:6YH7rFov オフラインダウンロード機能でもあればいいだけじゃん
manの表現力は低いわけだし、いまどき画像表示できるマシンを
誰だって持ってるのに、テキストベースに拘る必要はない
開発者とかろくにメンテしないし、多言語化なんてまず無理
wikipediaのマニュアル特化型みたいにして一元管理
MDNが特定のブラウザの特定バージョンでの実装まで書いてあるのと同じように
バージョン違いもLinux版とかBSD版の違いも全部網羅したほうが良いよ。
古いバージョンのドキュメントは、新しい機能のことまで書いてないしね。
ドキュメントは分離して最新のものを常に更新していったほうが良い
manの表現力は低いわけだし、いまどき画像表示できるマシンを
誰だって持ってるのに、テキストベースに拘る必要はない
開発者とかろくにメンテしないし、多言語化なんてまず無理
wikipediaのマニュアル特化型みたいにして一元管理
MDNが特定のブラウザの特定バージョンでの実装まで書いてあるのと同じように
バージョン違いもLinux版とかBSD版の違いも全部網羅したほうが良いよ。
古いバージョンのドキュメントは、新しい機能のことまで書いてないしね。
ドキュメントは分離して最新のものを常に更新していったほうが良い
237デフォルトの名無しさん
2019/12/14(土) 23:05:33.87ID:gTK06/8e まあ「いつのバージョンについていつ書かれたものか」みたいなのは簡単に確認できるようになるといいね。
RDFとか利用するとWebとの相性も良さそう。
RDFとか利用するとWebとの相性も良さそう。
238デフォルトの名無しさん
2019/12/15(日) 02:19:32.16ID:a0yEED8b >>237
バージョン間で違いが大きすぎるのは別として、
ドキュメント一つで全バージョンを網羅すべきだと思う
このオプションはバージョンいくつ以上から使用可能ですとか
ドキュメントにおいて存在すべきなのは最新のドキュメント一つのみ
バージョンや特定の実装に依存しない。
シェルでもdash用とかbash用とか別々に作るのは無駄だよ。
この機能はbash専用ですとか書いてあれば、一つ見るだけでよくなるし注意点もわかる
別々に作られてたら、あれこれdashで使えるんだっけ?とかなるし
バージョン間で違いが大きすぎるのは別として、
ドキュメント一つで全バージョンを網羅すべきだと思う
このオプションはバージョンいくつ以上から使用可能ですとか
ドキュメントにおいて存在すべきなのは最新のドキュメント一つのみ
バージョンや特定の実装に依存しない。
シェルでもdash用とかbash用とか別々に作るのは無駄だよ。
この機能はbash専用ですとか書いてあれば、一つ見るだけでよくなるし注意点もわかる
別々に作られてたら、あれこれdashで使えるんだっけ?とかなるし
239デフォルトの名無しさん
2019/12/15(日) 03:19:52.38ID:woT0VW+T240デフォルトの名無しさん
2019/12/15(日) 04:20:02.09ID:3SLEzfiL241デフォルトの名無しさん
2019/12/15(日) 04:35:07.70ID:a0yEED8b >>240
wikipedia方式で良いんじゃね?
wikipedia方式で良いんじゃね?
242デフォルトの名無しさん
2019/12/15(日) 10:01:39.28ID:E44EqLgR Wikipedia方式ってのがよく分からんけど
かなり自由に編集できて,既定で最新版が表示されるけど変更履歴が辿れるっていう方式ならいいね。
↑これはwiki全般に言えることだから寧ろコマンドwikiって言ったほうが適切か。
で,Wikipediaの方針をもっと厳しくして
様式を完全に統一したり典拠や変更コメントを必須にしたりしたら
自由に編集できる利点はそのまましっかりした文書になりそう。
という訳で誰かそういうwiki作ってw
かなり自由に編集できて,既定で最新版が表示されるけど変更履歴が辿れるっていう方式ならいいね。
↑これはwiki全般に言えることだから寧ろコマンドwikiって言ったほうが適切か。
で,Wikipediaの方針をもっと厳しくして
様式を完全に統一したり典拠や変更コメントを必須にしたりしたら
自由に編集できる利点はそのまましっかりした文書になりそう。
という訳で誰かそういうwiki作ってw
243デフォルトの名無しさん
2019/12/15(日) 11:36:59.02ID:pTp+dpJs 必要性を感じた者がやるんだよ! 頑張れ!
244デフォルトの名無しさん
2019/12/16(月) 00:44:09.03ID:5wUpgmce 日本語manだけ更新日が1990年代
英語manだけなぜかBSD版
--helpと言ってることが違う
これ食らってから正直manには期待していない
infoの日本語化って無理なのか?あっちも使いにくいが
英語manだけなぜかBSD版
--helpと言ってることが違う
これ食らってから正直manには期待していない
infoの日本語化って無理なのか?あっちも使いにくいが
245デフォルトの名無しさん
2019/12/16(月) 07:48:45.99ID:4GuGuHT1 逆になぜinfoは信頼できると思ったのか
246デフォルトの名無しさん
2019/12/17(火) 13:48:36.21ID:BxEORdhA infoを使用すると完全なマニュアルを読むことができるはずだ。ってmanにあるくせにそれ言うのか
247デフォルトの名無しさん
2019/12/17(火) 22:02:31.85ID:kdkfgKcy >>244
なければ作るとよい
なければ作るとよい
248デフォルトの名無しさん
2019/12/18(水) 18:56:56.67ID:Cw3S1jU2 manはそんなに難しい英語ではない
マニュアルとしてはとてもよく書けている
これを英語で読めないんだと、そもそもマニュアルを
読み取るのが難しい国語レベルかと
マニュアルとしてはとてもよく書けている
これを英語で読めないんだと、そもそもマニュアルを
読み取るのが難しい国語レベルかと
249デフォルトの名無しさん
2019/12/18(水) 19:39:48.69ID:uFDqtnkl 日本語の問題とman自身の問題は別の話でしょう?
英語圏の人がmanを使ったときの問題は
テキストベースだから使いづらい。
HTMLではないから使いづらい。
画像がないから分かりづらい。
そういった点でしょう?
日本語の問題はワークフローの問題だよ。
まず世の中英語と日本語だけじゃない無数に言語がある。
アプリの新バージョンを作ったときに翻訳してからじゃないとリリースできない
ってのは無いと思うし、翻訳だけしたらバージョンアップというのもおかしな話
(例えば--helpの内容とか)
アプリとそのマニュアルは本来別でリリースすべきなんだろう
英語圏の人がmanを使ったときの問題は
テキストベースだから使いづらい。
HTMLではないから使いづらい。
画像がないから分かりづらい。
そういった点でしょう?
日本語の問題はワークフローの問題だよ。
まず世の中英語と日本語だけじゃない無数に言語がある。
アプリの新バージョンを作ったときに翻訳してからじゃないとリリースできない
ってのは無いと思うし、翻訳だけしたらバージョンアップというのもおかしな話
(例えば--helpの内容とか)
アプリとそのマニュアルは本来別でリリースすべきなんだろう
250デフォルトの名無しさん
2019/12/19(木) 10:03:23.50ID:y7Q/2NKF マニュアルとプログラム本体が一緒くたにされてる今でもマニュアルの内容が古いとか
書いてることと実際の動作が違うとか問題が多発してるのに
分けようなんて言いだしたらもはや二者の乖離が酷すぎて、だれもマニュアルなんて読もうとしなくなる
……っは!もしやそれが狙いか?w
書いてることと実際の動作が違うとか問題が多発してるのに
分けようなんて言いだしたらもはや二者の乖離が酷すぎて、だれもマニュアルなんて読もうとしなくなる
……っは!もしやそれが狙いか?w
251デフォルトの名無しさん
2019/12/19(木) 11:24:35.20ID:belDjs1+ まぁ指摘される度にお前がやれだの英語で読めだの言うけどそれ諦めてるよね
逃げ口上というか捨て台詞というか負け惜しみというか
逃げ口上というか捨て台詞というか負け惜しみというか
252デフォルトの名無しさん
2019/12/19(木) 16:35:50.82ID:jArWapvD OSS
言い出しっぺがやるというだけだろ
指摘ってなにが目的なんだか。俺がか?
言い出しっぺがやるというだけだろ
指摘ってなにが目的なんだか。俺がか?
253デフォルトの名無しさん
2019/12/19(木) 18:30:09.45ID:4hkxYlHE bashで関数名に使える文字と使えない文字ってこれであってる?
・使える
アルファベット、ASCII文字以外 (制御文字は知らんw)
- = ~ [ ] : , . _ /
% (ジョブ機能が有効だと呼び出せない?)
数字 @ (単体はダメ)
# ^ { } (始まっているものはダメ)
+ * ?(終わるものはダメ)
・使えない
! " $ & ' ( ) \ | ` < > ; スペース
何だこのカオスwww
・使える
アルファベット、ASCII文字以外 (制御文字は知らんw)
- = ~ [ ] : , . _ /
% (ジョブ機能が有効だと呼び出せない?)
数字 @ (単体はダメ)
# ^ { } (始まっているものはダメ)
+ * ?(終わるものはダメ)
・使えない
! " $ & ' ( ) \ | ` < > ; スペース
何だこのカオスwww
254デフォルトの名無しさん
2019/12/19(木) 18:38:08.39ID:UoMpZOx6 関数名には記号を使わないのが基本だ
使っていいのは _ ぐらい
あとは紛らわしくてしょうがない
可読性が著しく下がる
使っていいのは _ ぐらい
あとは紛らわしくてしょうがない
可読性が著しく下がる
255デフォルトの名無しさん
2019/12/21(土) 20:28:47.93ID:X9+p8H27 func() {
foo "123$@"
}
って書いて、func a b c と実行すると
foo 123a b c という呼び出しになるという仕様
奇妙だなって思ってたけど理由に気づいた
func() {
tar "v$@"
}
func zxf file.tar.gz ってやった時
tar vzxf file.tar.gz とするために必要な仕様なんだ
はー、よくできてんなー。
シェルスクリプトってなんとなくいきあたりばったりで
作られたように見えるのによく練られた仕様だと思うよ
foo "123$@"
}
って書いて、func a b c と実行すると
foo 123a b c という呼び出しになるという仕様
奇妙だなって思ってたけど理由に気づいた
func() {
tar "v$@"
}
func zxf file.tar.gz ってやった時
tar vzxf file.tar.gz とするために必要な仕様なんだ
はー、よくできてんなー。
シェルスクリプトってなんとなくいきあたりばったりで
作られたように見えるのによく練られた仕様だと思うよ
256デフォルトの名無しさん
2019/12/22(日) 11:21:06.45ID:JDtuJK73 むしろそうじゃない方が例外的な動作で奇妙に見えるけど
""の内側で$@は引数に展開されるし
"str$var"←こういう引用符だったら文字列と引数はくっ付いて表示される。
""の内側で$@は引数に展開されるし
"str$var"←こういう引用符だったら文字列と引数はくっ付いて表示される。
257デフォルトの名無しさん
2019/12/22(日) 11:45:14.20ID:JDtuJK73 sedでC言語中の#includeディレクティブを無効化したいんだけど
sed \
-e ':a' -e '/^#[[:blank:]]*include.*\\$/N;/\\\n/d;ta' \
-e '/^#[[:blank:]]*include.*/d'
↑これで対処できるかな。
sed \
-e ':a' -e '/^#[[:blank:]]*include.*\\$/N;/\\\n/d;ta' \
-e '/^#[[:blank:]]*include.*/d'
↑これで対処できるかな。
258デフォルトの名無しさん
2019/12/22(日) 12:51:34.17ID:O05uH48x259デフォルトの名無しさん
2019/12/22(日) 15:12:02.64ID:JDtuJK73 >>258
なるほど。
ただ、$@って配列変数じゃない気がするわ。
単に引数が空白区切りで格納されてるだけで。
↑じゃあ配列と何が違うんだと言われると難しいけどw
配列だとおこりえない挙動を示せるいい例が思い付かないので。
なるほど。
ただ、$@って配列変数じゃない気がするわ。
単に引数が空白区切りで格納されてるだけで。
↑じゃあ配列と何が違うんだと言われると難しいけどw
配列だとおこりえない挙動を示せるいい例が思い付かないので。
260デフォルトの名無しさん
2019/12/22(日) 15:49:52.02ID:9GUBQyj0 >>257
t は s の結果に依存するのでそこで使うのは適切ではないと思われる。
sed でやるならこんな感じか。
#!/bin/sed -f
/^#[[:blank:]]*include/!b
:L0
/\\$/{N;b L0}
d
t は s の結果に依存するのでそこで使うのは適切ではないと思われる。
sed でやるならこんな感じか。
#!/bin/sed -f
/^#[[:blank:]]*include/!b
:L0
/\\$/{N;b L0}
d
261デフォルトの名無しさん
2019/12/22(日) 16:03:17.69ID:XO28QfbO 削除じゃなくてコメントにしちゃうとか
sed -e '/^#[[:blank:]]*include.*\\$/,/[^\\]$/s:^://:' \
-e 's:^#[[:blank:]]*include://&:'
sed -e '/^#[[:blank:]]*include.*\\$/,/[^\\]$/s:^://:' \
-e 's:^#[[:blank:]]*include://&:'
262デフォルトの名無しさん
2019/12/22(日) 17:46:01.65ID:O05uH48x263デフォルトの名無しさん
2019/12/22(日) 18:25:06.92ID:M+q9E136 >>255
必要な仕様というよりシンプルな文字列展開としてはそうなるというだけでは
その例はたまたまそういうように使えるというだけのような
あえて賢い対応してるなと言うなら "v""$@" とか書く必要がないとこかな
必要な仕様というよりシンプルな文字列展開としてはそうなるというだけでは
その例はたまたまそういうように使えるというだけのような
あえて賢い対応してるなと言うなら "v""$@" とか書く必要がないとこかな
264デフォルトの名無しさん
2019/12/23(月) 15:40:09.98ID:YJsAIsu8 シェル組み込みのgetoptsを同一処理内で二回以上用いるときに
$OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる
dashみたいにgetoptsを内蔵していないシェルでは
外部コマンドとしてgetopts(1)を起動した瞬間に$OPTIND変数が初期化されるみたい。
BashやらKshみたく組込みgetoptsを内蔵してるシェルの、
それも関数を跨がない処理
(getoptsを使ってる関数から一度も抜けることなく再度使用)
の時だけ$OPTIND変数が初期化されないみたいで、
そのせいで不本意な挙動の原因が掴めず半時間ほど無駄にしたw
(dashだと問題ないし、Bashでも特定の箇所でだけ不具合が生じるから)
$OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる
dashみたいにgetoptsを内蔵していないシェルでは
外部コマンドとしてgetopts(1)を起動した瞬間に$OPTIND変数が初期化されるみたい。
BashやらKshみたく組込みgetoptsを内蔵してるシェルの、
それも関数を跨がない処理
(getoptsを使ってる関数から一度も抜けることなく再度使用)
の時だけ$OPTIND変数が初期化されないみたいで、
そのせいで不本意な挙動の原因が掴めず半時間ほど無駄にしたw
(dashだと問題ないし、Bashでも特定の箇所でだけ不具合が生じるから)
265デフォルトの名無しさん
2019/12/23(月) 15:55:18.14ID:YJsAIsu8 >>262
どういう要件を見たせば
ある変数が配列変数だって言えるのか知ってる?
(俺は知らん。でもプログラミング言語論とかで定義されてそう)
$@がその要件を満たしてれば配列に違いないね。
でもそういう明確な定義が無いなら
もう個人の勝手なんじゃないかな。
どういう要件を見たせば
ある変数が配列変数だって言えるのか知ってる?
(俺は知らん。でもプログラミング言語論とかで定義されてそう)
$@がその要件を満たしてれば配列に違いないね。
でもそういう明確な定義が無いなら
もう個人の勝手なんじゃないかな。
266デフォルトの名無しさん
2019/12/23(月) 16:20:51.38ID:CGg4xw4r >>264
> $OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる
当たり前だな。どこに状態を保存してるのかと
> dashみたいにgetoptsを内蔵していないシェルでは
は?内蔵してるが?おそらく初期版から。
getoptsを内蔵してないのはbusyboxで
意図的に外してビルドした場合ぐらいだろ
> $OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる
当たり前だな。どこに状態を保存してるのかと
> dashみたいにgetoptsを内蔵していないシェルでは
は?内蔵してるが?おそらく初期版から。
getoptsを内蔵してないのはbusyboxで
意図的に外してビルドした場合ぐらいだろ
267デフォルトの名無しさん
2019/12/23(月) 16:22:45.93ID:CGg4xw4r >>264
何を言ってるのかわからんが、検証が間違ってる
何を言ってるのかわからんが、検証が間違ってる
268デフォルトの名無しさん
2019/12/23(月) 16:36:13.95ID:YJsAIsu8 >>267
あ、そうなの。
じゃあdashの組み込みgetoptsが何らかの
形でBashやKshのそれと$OPTIND変数に対する処理が違うんだな。
ともあれ単純に初期化すればいいだけなんで、
事もないよ。
あ、そうなの。
じゃあdashの組み込みgetoptsが何らかの
形でBashやKshのそれと$OPTIND変数に対する処理が違うんだな。
ともあれ単純に初期化すればいいだけなんで、
事もないよ。
269デフォルトの名無しさん
2019/12/23(月) 16:37:34.35ID:CGg4xw4r だいたい$OPTINDはシェル変数なんだから、
getoptsは外部コマンドとして実装するのは不可能なんだよ
どうやってシェルスクリプトから実行された外部コマンドから
呼び出し元シェルスクリプトの
プロセス内のメモリを書き換えるんだよw
getoptsは外部コマンドとして実装するのは不可能なんだよ
どうやってシェルスクリプトから実行された外部コマンドから
呼び出し元シェルスクリプトの
プロセス内のメモリを書き換えるんだよw
270デフォルトの名無しさん
2019/12/23(月) 16:40:45.68ID:CGg4xw4r >>268
geoptsを何回も呼び出したいなら、OPTINDを1にして初期化しろ仕様で決まってる
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html
> If the application sets OPTIND to the value 1, a new set of parameters can be used:
> either the current positional parameters or new arg values. Any other attempt to
> invoke getopts multiple times in a single shell execution environment with
> parameters (positional parameters or arg operands) that are not the same in all invocations,
> or with an OPTIND value modified to be a value other than 1, produces unspecified results.
geoptsを何回も呼び出したいなら、OPTINDを1にして初期化しろ仕様で決まってる
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html
> If the application sets OPTIND to the value 1, a new set of parameters can be used:
> either the current positional parameters or new arg values. Any other attempt to
> invoke getopts multiple times in a single shell execution environment with
> parameters (positional parameters or arg operands) that are not the same in all invocations,
> or with an OPTIND value modified to be a value other than 1, produces unspecified results.
271デフォルトの名無しさん
2019/12/23(月) 16:43:06.84ID:CGg4xw4r bashやkshはローカル変数にでもなってるんだろ
272デフォルトの名無しさん
2019/12/23(月) 20:47:02.60ID:sS1JWXeN ぷぷぷ、ぷろぐらみんぐ言語論wwwww
273デフォルトの名無しさん
2019/12/23(月) 20:50:03.01ID:YJsAIsu8 >>269
え、そうなん?
じゃあ
https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
↑getoptsはここには載ってるけれども
実質としては組み込みコマンドとして実装するしかないのか。
ありがとう!勉強になったわ。
え、そうなん?
じゃあ
https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
↑getoptsはここには載ってるけれども
実質としては組み込みコマンドとして実装するしかないのか。
ありがとう!勉強になったわ。
274デフォルトの名無しさん
2019/12/23(月) 22:11:39.28ID:gENEPh5i >>273
そこに乗ってるのは確かに気持ち悪さがあるけどね。alias、cd、readあたりも。
まあプロセス間通信などを使えば、外部コマンドとして作るのは
絶対に不可能というわけじゃないがまずやらんだろうなw
そこに乗ってるのは確かに気持ち悪さがあるけどね。alias、cd、readあたりも。
まあプロセス間通信などを使えば、外部コマンドとして作るのは
絶対に不可能というわけじゃないがまずやらんだろうなw
275デフォルトの名無しさん
2019/12/23(月) 22:26:33.99ID:EXKdfS/F 大昔は cd が外部コマンドだったと知って吃驚仰天
276デフォルトの名無しさん
2019/12/24(火) 11:07:35.47ID:mQqeuoCV そんなバナナ
277デフォルトの名無しさん
2019/12/24(火) 11:10:44.79ID:8h2rOUkn https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32549&forum=6
Cシェル(csh)上に、/usr/bin/cdと書くと、チェンジディレクトリがうまくいかず、普通にcd〜〜と書くと正しくチェンジディレクトリされます。
shellのカレントディレクトリを変更したいのなら、組み込みコマンドを使わないとダメです。
# にもかかわらず外部コマンドのcdを持っているUnixがあるのは何故だろう?
# joke ?
Cシェル(csh)上に、/usr/bin/cdと書くと、チェンジディレクトリがうまくいかず、普通にcd〜〜と書くと正しくチェンジディレクトリされます。
shellのカレントディレクトリを変更したいのなら、組み込みコマンドを使わないとダメです。
# にもかかわらず外部コマンドのcdを持っているUnixがあるのは何故だろう?
# joke ?
278デフォルトの名無しさん
2019/12/24(火) 11:11:40.76ID:8h2rOUkn https://tutorialmore.com/questions-292990.htm
この素晴らしい回答で参照されているように、POSIXシステムには外部バイナリ cd があります
シェル組み込みに加えて。 OS X 10.8では /usr/bin/cd です 。組み込みの cd のように
使用することはできません 独自の作業ディレクトリを変更するとすぐに終了するためです。どんな目的に役立つのですか?
解決した方法 # 1
主に、シェルの
この素晴らしい回答で参照されているように、POSIXシステムには外部バイナリ cd があります
シェル組み込みに加えて。 OS X 10.8では /usr/bin/cd です 。組み込みの cd のように
使用することはできません 独自の作業ディレクトリを変更するとすぐに終了するためです。どんな目的に役立つのですか?
解決した方法 # 1
主に、シェルの
279デフォルトの名無しさん
2019/12/24(火) 13:50:24.53ID:lTGNfo7C POSIXシステムには外部バイナリ cd があります
ないけど…?
ないけど…?
280デフォルトの名無しさん
2019/12/24(火) 17:56:12.00ID:O0jTO9nR WSLのUbuntuにもない。
281デフォルトの名無しさん
2019/12/24(火) 18:31:17.89ID:mQqeuoCV というか、あったとしてどうやって使うのか?
282デフォルトの名無しさん
2019/12/24(火) 18:35:06.35ID:mQqeuoCV カレントディレクトリを移動してから何か実行させたいならそのcdコマンドからexecしない限りできんよな?
とするとそのcdコマンドはディレクトリだけでなく実行するコマンドを引数として受け取るのか?
とするとそのcdコマンドはディレクトリだけでなく実行するコマンドを引数として受け取るのか?
283デフォルトの名無しさん
2019/12/24(火) 20:48:55.98ID:uCBqTgFr >>278 が出ているのに。あまり使い道がない例だけどな
284デフォルトの名無しさん
2019/12/24(火) 21:07:13.05ID:uCBqTgFr https://pubs.opengroup.org/onlinepubs/009695399/utilities/cd.html
APPLICATION USAGE
最初にビルトインに決まってるという説明の後で、ほぼ同じこと書いてあるやん
例が実行できるようにするには必要で、これはできないとは書いてないからあるのが仕様内だろう、たぶん
こんな使い方しねーよで無いんじゃないの、Ubuntu(Debian?)などは
APPLICATION USAGE
最初にビルトインに決まってるという説明の後で、ほぼ同じこと書いてあるやん
例が実行できるようにするには必要で、これはできないとは書いてないからあるのが仕様内だろう、たぶん
こんな使い方しねーよで無いんじゃないの、Ubuntu(Debian?)などは
285デフォルトの名無しさん
2019/12/25(水) 17:49:11.61ID:DcKuxkE0 なるほど
286デフォルトの名無しさん
2019/12/25(水) 18:50:00.73ID:N+K1pmuB シェルのバックグラウンドジョブとtrapとシグナルについての理解がしたいです。
手許の環境はBashですが、コマンドライン自体はPOSIXに準じているつもりです。
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }&
↑このコマンドラインを実行すると
すぐにプロンプトが帰ってきて
start
# 5秒後
end
↑などと出力されます。
一方で
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& sleep 1; kill -s QUIT $!
↑このコマンドラインを実行すると
start
# 1秒後
trapped
↑と出力されますが(少なくとも手許では)、
バックグランドジョブに回した直後のsleepを除去すると↓
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& kill -s QUIT $!
何も出力されなくなります。
最後のコマンドラインでもsleep 1を挿入した時と同じ挙動(start→#1秒後→trappedと表示)に
させるにはどうすればいいでしょうか。
どうかご教示ください。
手許の環境はBashですが、コマンドライン自体はPOSIXに準じているつもりです。
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }&
↑このコマンドラインを実行すると
すぐにプロンプトが帰ってきて
start
# 5秒後
end
↑などと出力されます。
一方で
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& sleep 1; kill -s QUIT $!
↑このコマンドラインを実行すると
start
# 1秒後
trapped
↑と出力されますが(少なくとも手許では)、
バックグランドジョブに回した直後のsleepを除去すると↓
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& kill -s QUIT $!
何も出力されなくなります。
最後のコマンドラインでもsleep 1を挿入した時と同じ挙動(start→#1秒後→trappedと表示)に
させるにはどうすればいいでしょうか。
どうかご教示ください。
287デフォルトの名無しさん
2019/12/25(水) 19:25:32.89ID:GfHtMQ6w シグナルハンドラはデフォルトの動作があらかじめ決まってる
SIGQUITだとコアダンプ吐いて強制終了かな。SIGUSR1/SIGUSR2もなんかあったな
シグナルハンドラを設定しようとするスクリプト(trap)が実行される前にはそのデフォルトのが動いてしまう
シグナルハンドラを設定するスクリプトが実行されるであろうまでsleepで待つか、設定した準備できたと知らせる(親プロセスにシグナル投げるなり)じゃないかな
onhandling=0; trap -- 'onhandling=1' USR1; { trap -- 'echo trapped; exit' QUIT; kill -USR1 $$; echo start; sleep 5& wait $!; echo end; }& while [ $onhandling -eq 0 ]; do sleep 0.1; done; kill -s QUIT $!
とか
シグナル実行抑止遅延とかあったかなあ
SIGQUITだとコアダンプ吐いて強制終了かな。SIGUSR1/SIGUSR2もなんかあったな
シグナルハンドラを設定しようとするスクリプト(trap)が実行される前にはそのデフォルトのが動いてしまう
シグナルハンドラを設定するスクリプトが実行されるであろうまでsleepで待つか、設定した準備できたと知らせる(親プロセスにシグナル投げるなり)じゃないかな
onhandling=0; trap -- 'onhandling=1' USR1; { trap -- 'echo trapped; exit' QUIT; kill -USR1 $$; echo start; sleep 5& wait $!; echo end; }& while [ $onhandling -eq 0 ]; do sleep 0.1; done; kill -s QUIT $!
とか
シグナル実行抑止遅延とかあったかなあ
288デフォルトの名無しさん
2019/12/25(水) 19:36:59.98ID:N+K1pmuB >>287
ありがとうございます!
無事解決しました。
ところで (すでに問題は解決できたので)単なる興味本位なのですが、
trap -- 'kill -s QUIT $!' USR1; { trap -- 'echo trapped; exit' QUIT; kill -s USR1 $$; echo start; sleep 5& wait $!; echo end;
}&
↑これだと問題ありますか。
素人目線では上手くいくような気がしますが、子プロセスを殺すtrapを親プロセスの前に仕掛けてるあたりが
マズい気がします……。
(ちなみに手許では>>287様が示してくださったものと同様上手くいきました)
ありがとうございます!
無事解決しました。
ところで (すでに問題は解決できたので)単なる興味本位なのですが、
trap -- 'kill -s QUIT $!' USR1; { trap -- 'echo trapped; exit' QUIT; kill -s USR1 $$; echo start; sleep 5& wait $!; echo end;
}&
↑これだと問題ありますか。
素人目線では上手くいくような気がしますが、子プロセスを殺すtrapを親プロセスの前に仕掛けてるあたりが
マズい気がします……。
(ちなみに手許では>>287様が示してくださったものと同様上手くいきました)
289デフォルトの名無しさん
2019/12/25(水) 19:39:42.14ID:N+K1pmuB290デフォルトの名無しさん
2019/12/25(水) 19:59:14.64ID:GfHtMQ6w notif=/tmp/$$.fifo; mkfifo $notif; { trap -- 'echo trapped; exit' QUIT; echo read > $notif; echo start; sleep 5& wait $!; echo end; }& read a < $notif; kill -s QUIT $!; rm $notif
通知はFIFO使って、ループが無くなってちょっとスッキリ版
通知はFIFO使って、ループが無くなってちょっとスッキリ版
291デフォルトの名無しさん
2019/12/25(水) 20:09:25.33ID:v8ePSHs/ >>286
> { trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& kill -s QUIT $!
> 何も出力されなくなります。
コアダンプって出力されるよな?
> { trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& kill -s QUIT $!
> 何も出力されなくなります。
コアダンプって出力されるよな?
292デフォルトの名無しさん
2019/12/25(水) 21:22:56.22ID:rkHGbRnb 一行で書くから見づらいったらありゃしないw
そんなごちゃごちゃやらなくても、これでいいやろ?
#!/bin/sh
sleep 1& SLEEP=$!
{
trap -- 'echo trapped; exit' QUIT
kill $SLEEP
echo start
sleep 5& wait $!
echo end
}&
wait $SLEEP
kill -s QUIT $!
一行に戻すでー
sleep 1& SLEEP=$!; { trap -- 'echo trapped; exit' QUIT; kill $SLEEP; echo start; sleep 5& wait $!; echo end; }& wait $SLEEP; kill -s QUIT $!
そんなごちゃごちゃやらなくても、これでいいやろ?
#!/bin/sh
sleep 1& SLEEP=$!
{
trap -- 'echo trapped; exit' QUIT
kill $SLEEP
echo start
sleep 5& wait $!
echo end
}&
wait $SLEEP
kill -s QUIT $!
一行に戻すでー
sleep 1& SLEEP=$!; { trap -- 'echo trapped; exit' QUIT; kill $SLEEP; echo start; sleep 5& wait $!; echo end; }& wait $SLEEP; kill -s QUIT $!
293デフォルトの名無しさん
2019/12/25(水) 22:03:53.28ID:N+K1pmuB294デフォルトの名無しさん
2019/12/25(水) 22:28:14.59ID:iUDS0c82 ulimit -c unlimited
295デフォルトの名無しさん
2019/12/25(水) 22:29:25.06ID:ixBqsT77 このスレにtrapでソフトタイマを作ったのが載ってるよ。
296デフォルトの名無しさん
2019/12/25(水) 22:40:18.77ID:rkHGbRnb >>295
もうやめたれwww
もうやめたれwww
297デフォルトの名無しさん
2019/12/26(木) 00:40:43.87ID:uF/G2OAQ いちゃもんつけながらでないと自己表現できない自分が確認できない、いつものやつ
298デフォルトの名無しさん
2019/12/26(木) 00:57:23.99ID:0kHOyMkL >>297
わかるように結構工夫して書いてるんだぜw
わかるように結構工夫して書いてるんだぜw
299デフォルトの名無しさん
2019/12/26(木) 00:58:24.91ID:uF/G2OAQ 質問主も応えてるのもわかってるけどな
300デフォルトの名無しさん
2019/12/26(木) 00:58:56.93ID:0kHOyMkL301デフォルトの名無しさん
2019/12/26(木) 01:01:09.61ID:uF/G2OAQ 自己満wキモいわ自分で言うか
すげえな。これ以上何を言っても通じないな
すげえな。これ以上何を言っても通じないな
302デフォルトの名無しさん
2019/12/26(木) 01:03:25.32ID:0kHOyMkL そうそう俺を叩いた所で無駄やで。煽り耐性レベルMAXだからな
そんなくだらないことよりレス(シェルスクリプト)の話をしようや
そんなくだらないことよりレス(シェルスクリプト)の話をしようや
303デフォルトの名無しさん
2019/12/26(木) 10:54:33.00ID:zbYMFUyq304デフォルトの名無しさん
2019/12/26(木) 12:41:29.91ID:MI1/ojN2305デフォルトの名無しさん
2019/12/26(木) 12:47:29.21ID:zbYMFUyq306デフォルトの名無しさん
2019/12/26(木) 12:51:43.96ID:zbYMFUyq 仮にwaitする前にsleepが(一瞬で)killされたとしても
wait ${すでにいないPID} を実行してもエラーにならないんだよね
wait ${すでにいないPID} を実行してもエラーにならないんだよね
307デフォルトの名無しさん
2019/12/26(木) 13:26:19.54ID:zbYMFUyq >>287も>>292もQUITだとdashで想定どおりに動かないからTERMに変更したけど
timeで測りやすくスクリプトにして実行した結果はこんな感じ
$ time sh 287.sh
start
trapped
real 0m0.103s
user 0m0.001s
sys 0m0.002s
$ time sh 292.sh
start
trapped
real 0m0.002s
user 0m0.002s
sys 0m0.000s
>>287は多くの場合、最初の [ $onhandling -eq 0 ]; を満たさないのでsleep 0.1をすることになる。
なので↓のsleep 1を取っ払いたい要望に対して、sleep 0.1に変えたのと大差なくなってる。
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& sleep 1; kill -s QUIT $!
timeで測りやすくスクリプトにして実行した結果はこんな感じ
$ time sh 287.sh
start
trapped
real 0m0.103s
user 0m0.001s
sys 0m0.002s
$ time sh 292.sh
start
trapped
real 0m0.002s
user 0m0.002s
sys 0m0.000s
>>287は多くの場合、最初の [ $onhandling -eq 0 ]; を満たさないのでsleep 0.1をすることになる。
なので↓のsleep 1を取っ払いたい要望に対して、sleep 0.1に変えたのと大差なくなってる。
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& sleep 1; kill -s QUIT $!
308デフォルトの名無しさん
2019/12/26(木) 14:16:08.46ID:MI1/ojN2309デフォルトの名無しさん
2019/12/26(木) 15:10:05.95ID:W7puUhWv 自演w連投ぶりからいつもの
310デフォルトの名無しさん
2019/12/26(木) 17:04:03.21ID:uIk/XshQ 自称神様の降臨か
311デフォルトの名無しさん
2019/12/26(木) 17:46:42.36ID:W7puUhWv ずっと居ついているだろ
312デフォルトの名無しさん
2019/12/26(木) 20:40:26.24ID:VT4/hGaE ただいま。ってかお前ら何やってんの?w
また俺じゃない人に絡んでるようだが
また俺じゃない人に絡んでるようだが
313デフォルトの名無しさん
2019/12/26(木) 20:57:57.00ID:GKWkZChC わざとらしすぎてわろた
314デフォルトの名無しさん
2019/12/26(木) 20:59:56.60ID:VT4/hGaE 違うから違うって言ってるんだけどなw
315デフォルトの名無しさん
2019/12/26(木) 21:06:21.96ID:GKWkZChC はいはい
同じ反応速度、普通のスクリプトでわいわいなレスに対していきなりな同じ態度レスで絡む
同一人物でいいだろ。そんな辺なやつはそう居ないと思うけど
同じ反応速度、普通のスクリプトでわいわいなレスに対していきなりな同じ態度レスで絡む
同一人物でいいだろ。そんな辺なやつはそう居ないと思うけど
316デフォルトの名無しさん
2019/12/26(木) 21:08:13.76ID:VT4/hGaE 意訳 俺以外はみんなあいつ
317デフォルトの名無しさん
2019/12/26(木) 21:08:43.19ID:VT4/hGaE 俺の敵はみんなあいつ
の方が良いか
の方が良いか
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「脅迫だ」国分太一に同情論 音声データ削除要求など日テレの対応を疑問視する声ネットに噴出「それこそコンプラ違反では」★2 [muffin★]
- 【国際法を無視】日本での「中華人民共和国に台湾問題を論じる資格なし」との声に 中国外交部が厳しく反論… ★2 [BFU★]
- 【工作員】「X」のアカウント所在地公開機能が暴いた世論操作の実態 MAGA支持著名アカウントの多くが米国外から運営 日本にも波及 ★3 [ごまカンパチ★]
- 生クリームだけの真っ白なクリスマスケーキ 大手メーカーが販売、その理由は…フルーツなしで価格は半額以下に ★3 [おっさん友の会★]
- 【文春】元TOKIO・国分太一(51)「女性スタッフ2名への“わいせつ事案”」日テレ事情聴取の全貌が分かった! ★5 [Ailuropoda melanoleuca★]
- 首相答弁「スパイ防止法、外国代理人登録法、ロビー活動公開法などについて速やかに法案を策定する」 [1ゲットロボ★]
- 中国外務省「全く不十分だ。ごまかすような手口を使うべきではない」高市答弁を批判 [834922174]
- まったりまったりおじゃる丸待機スレ🏡
- GeForceのグラボ値上げwwwwwwwwwwwwwwwwwwww
- 夜勤の休憩中やで~🕺🕺🕺
- 高速道路でスピード出してる軽見ると笑ってしまうんだが
- 合法の範囲でできることをやり尽くした人間は犯罪行為に興味を持ちがち
