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

■ このスレッドは過去ログ倉庫に格納されています
2019/10/25(金) 00:08:45.53ID:6btPTvif
シェルスクリプトに関する総合スレッドです。

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

シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
2019/12/15(日) 04:20:02.09ID:3SLEzfiL
>>238
昔のバージョンの動作に問題があったとしても、そこに誰が手を加えるのかって話があるのでまとめるのには無理があると思う。
いつ書いた物で、その当時の最善を尽くした、がお互い(作る方と使う方で)
許容できる最善手じゃないのか?まあつまり>>237の言ってることだがw
2019/12/15(日) 04:35:07.70ID:a0yEED8b
>>240
wikipedia方式で良いんじゃね?
2019/12/15(日) 10:01:39.28ID:E44EqLgR
Wikipedia方式ってのがよく分からんけど
かなり自由に編集できて,既定で最新版が表示されるけど変更履歴が辿れるっていう方式ならいいね。
↑これはwiki全般に言えることだから寧ろコマンドwikiって言ったほうが適切か。

で,Wikipediaの方針をもっと厳しくして
様式を完全に統一したり典拠や変更コメントを必須にしたりしたら
自由に編集できる利点はそのまましっかりした文書になりそう。

という訳で誰かそういうwiki作ってw
2019/12/15(日) 11:36:59.02ID:pTp+dpJs
必要性を感じた者がやるんだよ! 頑張れ!
2019/12/16(月) 00:44:09.03ID:5wUpgmce
日本語manだけ更新日が1990年代
英語manだけなぜかBSD版
--helpと言ってることが違う
これ食らってから正直manには期待していない
infoの日本語化って無理なのか?あっちも使いにくいが
2019/12/16(月) 07:48:45.99ID:4GuGuHT1
逆になぜinfoは信頼できると思ったのか
2019/12/17(火) 13:48:36.21ID:BxEORdhA
infoを使用すると完全なマニュアルを読むことができるはずだ。ってmanにあるくせにそれ言うのか
247デフォルトの名無しさん
垢版 |
2019/12/17(火) 22:02:31.85ID:kdkfgKcy
>>244
なければ作るとよい
2019/12/18(水) 18:56:56.67ID:Cw3S1jU2
manはそんなに難しい英語ではない
マニュアルとしてはとてもよく書けている
これを英語で読めないんだと、そもそもマニュアルを
読み取るのが難しい国語レベルかと
2019/12/18(水) 19:39:48.69ID:uFDqtnkl
日本語の問題とman自身の問題は別の話でしょう?

英語圏の人がmanを使ったときの問題は
テキストベースだから使いづらい。
HTMLではないから使いづらい。
画像がないから分かりづらい。
そういった点でしょう?

日本語の問題はワークフローの問題だよ。
まず世の中英語と日本語だけじゃない無数に言語がある。
アプリの新バージョンを作ったときに翻訳してからじゃないとリリースできない
ってのは無いと思うし、翻訳だけしたらバージョンアップというのもおかしな話
(例えば--helpの内容とか)

アプリとそのマニュアルは本来別でリリースすべきなんだろう
2019/12/19(木) 10:03:23.50ID:y7Q/2NKF
マニュアルとプログラム本体が一緒くたにされてる今でもマニュアルの内容が古いとか
書いてることと実際の動作が違うとか問題が多発してるのに
分けようなんて言いだしたらもはや二者の乖離が酷すぎて、だれもマニュアルなんて読もうとしなくなる
……っは!もしやそれが狙いか?w
2019/12/19(木) 11:24:35.20ID:belDjs1+
まぁ指摘される度にお前がやれだの英語で読めだの言うけどそれ諦めてるよね
逃げ口上というか捨て台詞というか負け惜しみというか
2019/12/19(木) 16:35:50.82ID:jArWapvD
OSS
言い出しっぺがやるというだけだろ
指摘ってなにが目的なんだか。俺がか?
2019/12/19(木) 18:30:09.45ID:4hkxYlHE
bashで関数名に使える文字と使えない文字ってこれであってる?

・使える
アルファベット、ASCII文字以外 (制御文字は知らんw)
- = ~ [ ] : , . _ /
% (ジョブ機能が有効だと呼び出せない?)
数字 @ (単体はダメ)
# ^ { } (始まっているものはダメ)
+ * ?(終わるものはダメ)

・使えない
! " $ & ' ( ) \ | ` < > ; スペース

何だこのカオスwww
2019/12/19(木) 18:38:08.39ID:UoMpZOx6
関数名には記号を使わないのが基本だ
使っていいのは _ ぐらい
あとは紛らわしくてしょうがない
可読性が著しく下がる
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 とするために必要な仕様なんだ

はー、よくできてんなー。
シェルスクリプトってなんとなくいきあたりばったりで
作られたように見えるのによく練られた仕様だと思うよ
2019/12/22(日) 11:21:06.45ID:JDtuJK73
むしろそうじゃない方が例外的な動作で奇妙に見えるけど
""の内側で$@は引数に展開されるし
"str$var"←こういう引用符だったら文字列と引数はくっ付いて表示される。
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'
↑これで対処できるかな。
2019/12/22(日) 12:51:34.17ID:O05uH48x
>>256
他の言語だったら、文字列+文字列の配列 の場合に
エラーかもしくは配列の要素が一つ増えるって考えるでしょ?
文字列の配列の一番目に、結合されるって仕様はなかなか思いつかないと思うよ
2019/12/22(日) 15:12:02.64ID:JDtuJK73
>>258
なるほど。

ただ、$@って配列変数じゃない気がするわ。
単に引数が空白区切りで格納されてるだけで。
↑じゃあ配列と何が違うんだと言われると難しいけどw
配列だとおこりえない挙動を示せるいい例が思い付かないので。
2019/12/22(日) 15:49:52.02ID:9GUBQyj0
>>257
t は s の結果に依存するのでそこで使うのは適切ではないと思われる。
sed でやるならこんな感じか。

#!/bin/sed -f
/^#[[:blank:]]*include/!b
:L0
/\\$/{N;b L0}
d
2019/12/22(日) 16:03:17.69ID:XO28QfbO
削除じゃなくてコメントにしちゃうとか

sed -e '/^#[[:blank:]]*include.*\\$/,/[^\\]$/s:^://:' \
-e 's:^#[[:blank:]]*include://&:'
2019/12/22(日) 17:46:01.65ID:O05uH48x
>>259
$1、$2でアクセスするし、その$1に空白入れる事も
できるんだから配列は配列だよ。空白区切りじゃない。

bashでは$@の名前付き版$NAME[@]は
明確に配列と言われてるしね
2019/12/22(日) 18:25:06.92ID:M+q9E136
>>255
必要な仕様というよりシンプルな文字列展開としてはそうなるというだけでは
その例はたまたまそういうように使えるというだけのような
あえて賢い対応してるなと言うなら "v""$@" とか書く必要がないとこかな
2019/12/23(月) 15:40:09.98ID:YJsAIsu8
シェル組み込みのgetoptsを同一処理内で二回以上用いるときに
$OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる

dashみたいにgetoptsを内蔵していないシェルでは
外部コマンドとしてgetopts(1)を起動した瞬間に$OPTIND変数が初期化されるみたい。
BashやらKshみたく組込みgetoptsを内蔵してるシェルの、
それも関数を跨がない処理
(getoptsを使ってる関数から一度も抜けることなく再度使用)
の時だけ$OPTIND変数が初期化されないみたいで、
そのせいで不本意な挙動の原因が掴めず半時間ほど無駄にしたw
(dashだと問題ないし、Bashでも特定の箇所でだけ不具合が生じるから)
2019/12/23(月) 15:55:18.14ID:YJsAIsu8
>>262
どういう要件を見たせば
ある変数が配列変数だって言えるのか知ってる?
(俺は知らん。でもプログラミング言語論とかで定義されてそう)
$@がその要件を満たしてれば配列に違いないね。

でもそういう明確な定義が無いなら
もう個人の勝手なんじゃないかな。
2019/12/23(月) 16:20:51.38ID:CGg4xw4r
>>264
> $OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる
当たり前だな。どこに状態を保存してるのかと

> dashみたいにgetoptsを内蔵していないシェルでは
は?内蔵してるが?おそらく初期版から。
getoptsを内蔵してないのはbusyboxで
意図的に外してビルドした場合ぐらいだろ
2019/12/23(月) 16:22:45.93ID:CGg4xw4r
>>264
何を言ってるのかわからんが、検証が間違ってる
2019/12/23(月) 16:36:13.95ID:YJsAIsu8
>>267
あ、そうなの。
じゃあdashの組み込みgetoptsが何らかの
形でBashやKshのそれと$OPTIND変数に対する処理が違うんだな。
ともあれ単純に初期化すればいいだけなんで、
事もないよ。
2019/12/23(月) 16:37:34.35ID:CGg4xw4r
だいたい$OPTINDはシェル変数なんだから、
getoptsは外部コマンドとして実装するのは不可能なんだよ

どうやってシェルスクリプトから実行された外部コマンドから
呼び出し元シェルスクリプトの
プロセス内のメモリを書き換えるんだよw
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.
2019/12/23(月) 16:43:06.84ID:CGg4xw4r
bashやkshはローカル変数にでもなってるんだろ
2019/12/23(月) 20:47:02.60ID:sS1JWXeN
ぷぷぷ、ぷろぐらみんぐ言語論wwwww
2019/12/23(月) 20:50:03.01ID:YJsAIsu8
>>269
え、そうなん?
じゃあ
https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
↑getoptsはここには載ってるけれども
実質としては組み込みコマンドとして実装するしかないのか。

ありがとう!勉強になったわ。
2019/12/23(月) 22:11:39.28ID:gENEPh5i
>>273
そこに乗ってるのは確かに気持ち悪さがあるけどね。alias、cd、readあたりも。
まあプロセス間通信などを使えば、外部コマンドとして作るのは
絶対に不可能というわけじゃないがまずやらんだろうなw
2019/12/23(月) 22:26:33.99ID:EXKdfS/F
大昔は cd が外部コマンドだったと知って吃驚仰天
276デフォルトの名無しさん
垢版 |
2019/12/24(火) 11:07:35.47ID:mQqeuoCV
そんなバナナ
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 ?
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
主に、シェルの
2019/12/24(火) 13:50:24.53ID:lTGNfo7C
POSIXシステムには外部バイナリ cd があります
ないけど…?
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コマンドはディレクトリだけでなく実行するコマンドを引数として受け取るのか?
2019/12/24(火) 20:48:55.98ID:uCBqTgFr
>>278 が出ているのに。あまり使い道がない例だけどな
2019/12/24(火) 21:07:13.05ID:uCBqTgFr
https://pubs.opengroup.org/onlinepubs/009695399/utilities/cd.html
APPLICATION USAGE
最初にビルトインに決まってるという説明の後で、ほぼ同じこと書いてあるやん
例が実行できるようにするには必要で、これはできないとは書いてないからあるのが仕様内だろう、たぶん
こんな使い方しねーよで無いんじゃないの、Ubuntu(Debian?)などは
285デフォルトの名無しさん
垢版 |
2019/12/25(水) 17:49:11.61ID:DcKuxkE0
なるほど
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と表示)に
させるにはどうすればいいでしょうか。
どうかご教示ください。
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 $!
とか

シグナル実行抑止遅延とかあったかなあ
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様が示してくださったものと同様上手くいきました)
2019/12/25(水) 19:39:42.14ID:N+K1pmuB
>>288
これは取消します。
これではいかなる場合でもtrapが実行されちゃいますね。
すいませんでした。
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使って、ループが無くなってちょっとスッキリ版
2019/12/25(水) 20:09:25.33ID:v8ePSHs/
>>286
> { trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& kill -s QUIT $!
> 何も出力されなくなります。

コアダンプって出力されるよな?
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 $!
2019/12/25(水) 22:03:53.28ID:N+K1pmuB
>>291
うーん。すいません。
恐らくシステムか何かがコアダンプを生成しないようになっているようです。
コアダンプはありませんでした。
2019/12/25(水) 22:28:14.59ID:iUDS0c82
ulimit -c unlimited
295デフォルトの名無しさん
垢版 |
2019/12/25(水) 22:29:25.06ID:ixBqsT77
このスレにtrapでソフトタイマを作ったのが載ってるよ。
2019/12/25(水) 22:40:18.77ID:rkHGbRnb
>>295
もうやめたれwww
2019/12/26(木) 00:40:43.87ID:uF/G2OAQ
いちゃもんつけながらでないと自己表現できない自分が確認できない、いつものやつ
2019/12/26(木) 00:57:23.99ID:0kHOyMkL
>>297
わかるように結構工夫して書いてるんだぜw
2019/12/26(木) 00:58:24.91ID:uF/G2OAQ
質問主も応えてるのもわかってるけどな
2019/12/26(木) 00:58:56.93ID:0kHOyMkL
「俺」を否定することはできても
「レス」は否定できないやろ?w
>>292とかシンプルで美しい回答だからな
2019/12/26(木) 01:01:09.61ID:uF/G2OAQ
自己満wキモいわ自分で言うか
すげえな。これ以上何を言っても通じないな
2019/12/26(木) 01:03:25.32ID:0kHOyMkL
そうそう俺を叩いた所で無駄やで。煽り耐性レベルMAXだからな
そんなくだらないことよりレス(シェルスクリプト)の話をしようや
2019/12/26(木) 10:54:33.00ID:zbYMFUyq
>>292はいいな。タイムアウトまで実装できてる
>>287とか>>290だとバグで通知が行われないとフリーズしてしまうが
>>292だと一定期間でタイムアウトになって処理を継続できる
2019/12/26(木) 12:41:29.91ID:MI1/ojN2
>>292だとどうしても1秒間停止してしまわない?
echo trappedを(適切に)実行する準備が整い次第速やかにkill QUITしたいんじゃ
なかったっけ?
>「sleep 1を付けると(シグナルハンドラを設定するスクリプトが起動する猶予が生れて)
start→trappedが出力されるけど、sleep 1を取っ払っても作動するようにしたい」

>>287の実装が一番良いな。
シグナル受け取り側の準備が出来るまで実直に待ってるから余計な待ち時間はほぼ発生しない。
sleep <小数点>はBash拡張ってのが玉に瑕だけどもともとBash前提だから問題ない。
2019/12/26(木) 12:47:29.21ID:zbYMFUyq
>>304
よく読んでみて、停止しないでしょ?
必要最小限しかwaitしない

>>287だと0.1秒待つことになるが
そんなに待たないし、ループで負荷をかけることもない
2019/12/26(木) 12:51:43.96ID:zbYMFUyq
仮にwaitする前にsleepが(一瞬で)killされたとしても
wait ${すでにいないPID} を実行してもエラーにならないんだよね
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 $!
2019/12/26(木) 14:16:08.46ID:MI1/ojN2
>>305
あ、kill $SLEEPを読み飛ばしてたw
すまん。
2019/12/26(木) 15:10:05.95ID:W7puUhWv
自演w連投ぶりからいつもの
2019/12/26(木) 17:04:03.21ID:uIk/XshQ
自称神様の降臨か
2019/12/26(木) 17:46:42.36ID:W7puUhWv
ずっと居ついているだろ
2019/12/26(木) 20:40:26.24ID:VT4/hGaE
ただいま。ってかお前ら何やってんの?w
また俺じゃない人に絡んでるようだが
2019/12/26(木) 20:57:57.00ID:GKWkZChC
わざとらしすぎてわろた
2019/12/26(木) 20:59:56.60ID:VT4/hGaE
違うから違うって言ってるんだけどなw
2019/12/26(木) 21:06:21.96ID:GKWkZChC
はいはい
同じ反応速度、普通のスクリプトでわいわいなレスに対していきなりな同じ態度レスで絡む
同一人物でいいだろ。そんな辺なやつはそう居ないと思うけど
2019/12/26(木) 21:08:13.76ID:VT4/hGaE
意訳 俺以外はみんなあいつ
2019/12/26(木) 21:08:43.19ID:VT4/hGaE
俺の敵はみんなあいつ
の方が良いか
2019/12/26(木) 21:12:56.47ID:GKWkZChC
連投wその連投ぶりのレスの内容といい
特徴的な共通点が多すぎ
2019/12/26(木) 21:35:49.17ID:VT4/hGaE
>>307
俺もやってみたけどQUITじゃたしかにdashで動かないね
確かめたつもりだったけど

> sleep 0.1に変えたのと大差なくなってる。
実際のところ、この例だとsleep 0でも問題なかったりする
sleepという外部プロセスを呼び出す時間があれば、その間にtrapできてるから

と思ってkshでやったら動かんかったわw
kshではsleepはシェルビルトインなんだな
2019/12/27(金) 09:20:57.82ID:NrzsOb0y
横だけどQUITって使うことってある?
OSとかデバッガ系なら使うことあるだろうけど
アプリでは使わないほうが良いんじゃいかな?
2019/12/27(金) 13:14:28.69ID:GMT90LLU
>>320
それはなにか理由ある?
2019/12/27(金) 21:58:46.84ID:jjhZE+Ou
QUITってコアダンプさせるためのものでしょ?
2019/12/28(土) 12:47:18.40ID:/Zzxwqbk
POSIXでは基本的にTERMとほぼ同じだけど
XSI拡張では「なにか他の動作を追加的に行ってもよい」とあるな。
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
2019/12/28(土) 23:26:23.77ID:lWCFWx/Q
QUITをトラップするとコアダンプ機能が使えなくなるというデメリットがあるね
普通はQUITでコアダンプするわけだから、あれ?コアダンプできない?ってなるかもしれない
コアダンプを明示的に生成する方法あるのかな?
あと、もしかしてdash、ksh、yashだとQUITってtrapできない?
trapしても何も動作しない
2019/12/29(日) 01:40:48.31ID:FmabBrht
dash,kshはQUITでtrapで動いてるけど。yashは試してない
2019/12/29(日) 01:53:56.90ID:MrCxy9bb
#!/bin/sh
trap 'echo trapped; exit' QUIT
echo $$
sleep 60


これを、sh test.sh & ってやって
表示されたプロセスIDに対してkill -q QUIT プロセスIDって
やっても何も表示されないんだけど、どうやって確認した?
2019/12/29(日) 02:02:29.22ID:FmabBrht
sleepというかコマンドが実行が終わるまでtrapで設定したのは動かないよ
2019/12/29(日) 02:10:00.25ID:FmabBrht
なんか言い方が変だな。POSIXでそのような文が書いてあったと思うそのまま書いた
コマンドが実行中はシグナル受け取っても実行されない、コマンドが終わってから実行
for i in $(seq 60); do sleep 1; done
とかで動くでしょ
2019/12/29(日) 02:13:23.19ID:MrCxy9bb
あれ?なんかおかしいね。
じゃあ>>287がbashだとtrappedって表示されて
shでは何も表示されないのはなぜ?

念の為、整形したやつ
#!/bin/sh
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 $!
2019/12/29(日) 02:14:47.34ID:MrCxy9bb
>>328
つまりコマンド実行中はtrapしていても無視されて
強制終了してしまうってこと?
2019/12/29(日) 02:17:11.43ID:FmabBrht
無視ではなくて保留だな。受け取っていることは受け取っている
2019/12/29(日) 02:19:29.79ID:MrCxy9bb
保留だとしたらkill -s QUITした時点で終了するのはおかしいはずだが?
2019/12/29(日) 02:25:16.44ID:FmabBrht
>>329
shって?dashでいいの?表示されたけど
強制終了ってなにをいいたいのかわからん
dashはtrap中の標準出力にクセがあるかな?dash起動してコマンドラインでtrapでechoして、他からシグナル送っても出力されないリターンキー叩いたりしたら出る、コマンドラインではね>>329はそうならんけど

>>332
なにを言いたいのかわからん。>>326は解決したんだろ?
強制終了と思い込んで次の展開されても困るぞ
2019/12/29(日) 02:31:00.58ID:MrCxy9bb
>>333
全ては>>329でdashとbashで動作に違いがあるってことだよ
強制終了は強制終了。そのまんま終了してしまうってこと
2019/12/29(日) 02:46:04.76ID:FmabBrht
強制終了自体してなくないんじゃないの
なぜかスクリプトファイルとして実行すると、dash/kshではサブシェルのtrapが動いてないな>>329
シグナル無視なのかなんなのかendまで動き終わる

>>326はそんなんじゃなくて、単なるシンプルな間違いで、違いもなんもないけど
2019/12/29(日) 03:24:42.26ID:QzTL60WW
https://community.progress.com/community_groups/openedge_general/f/26/t/34654
Posted by ske on 8 Aug 2017 13:59
らしいよ。6. とか確かに
コマンドラインでの違いとかはわからんけど
337デフォルトの名無しさん
垢版 |
2019/12/31(火) 07:15:28.46ID:xfr0s5Fj
PowerShell最強説
2019/12/31(火) 08:44:50.09ID:qHnQy48w
諸説あります
2019/12/31(火) 15:40:24.49ID:F82oxaIy
※個人の感想です
2019/12/31(火) 23:33:05.25ID:vVhGTaaB
僕もPowerShell愛用しています。
これを使い始めてから人生茨色です!
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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