シェルスクリプト総合 その29at TECH
シェルスクリプト総合 その29 - 暇つぶし2ch2:デフォルトの名無しさん
18/09/21 23:36:59.94 /eJt2TVD.net
お約束
・特記なき場合、Bourne ShellもしくはPOSIX準拠のsh可換シェルが既定です
 つまりシバンは#! /bin/shです。
 他のシェル(bash, zsh, ksh, (d)ash, yash, posh, fish, (t)csh)などの専用機能に依存する場合は明示しましょう。
  OS X, GNU/Linuxユーザーは/bin/shの実体がbashなので*特に*注意(自覚なきbashism---シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?)。
   ただしDebian, Ubuntuなどでは/bin/shの実体はPOSIX sh互換のdashですのであまり気にしないでも大丈夫です。
  FreeBSDユーザーは/bin/shの実体がashなので注意。
  Solaris, OpenBSDユーザーは/bin/shの実体がkshなので注意。
 csh/tcshでのシェルスクリプトは*まったく推奨しません*。
  (参考URL: URLリンク(www.speech-lab.org)
・POSIXに準拠しましょう
 有用なリンクはURLリンク(en.wikipedia.org)にまとめられています。
 最新の仕様はこちらへ: URLリンク(pubs.opengroup.org)
  (左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh、次点でDebianなどに搭載されているDash shell
  Heirloom sh: URLリンク(heirloom.sourceforge.net)
  Dash shell: URLリンク(gondor.apana.org.au)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります
 Manページや各種リンク(URLリンク(pubs.opengroup.org)など)を見ましょう。
 apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな

3:デフォルトの名無しさん
18/09/21 23:39:20.07 /eJt2TVD.net
初心者へのアドバイス
・適した道具を判断するのも頭の重要な使い方。
 シェルスクリプトよりもPerlまたはPythonの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらman(1)を引きましょう。
・思い通りに動かないときは、まずはsh(1)の-xオプションでトレースしましょう。
回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに、「そういうのはPerl, Python使え」と回答するのはやめましょう。
 安易にPerlやPythonに逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。

4:デフォルトの名無しさん
18/09/21 23:45:34.73 /eJt2TVD.net
次スレを立てる時は>>1の本文の先頭に以下を追加して下さい。
!extend:on:vvvvv:1000:512
という注意書きを>>1の先頭に追加してください。

5:デフォルトの名無しさん
18/09/21 23:48:15.75 /eJt2TVD.net
そして注意書きに従ってください。

…回線切って首釣ってくる

6:デフォルトの名無しさん
19/02/08 12:13:50.02 OGIJJ+v/.net
age

7:デフォルトの名無しさん
19/02/08 13:03:01.43 VZqJ7QJN.net
>>5
ワロタ
つーか今時回線なのかw

8:デフォルトの名無しさん
19/02/09 15:41:36.60 6/bHpQ6m.net
回線って言葉の定義によるが、今どきの優先での光とかでも回線とは言う。光回線とかね。

9:デフォルトの名無しさん
19/02/09 15:41:50.96 6/bHpQ6m.net
優先じゃなくて有線

10:デフォルトの名無しさん
19/02/09 22:28:27.73 ksUvHKJZ.net
printfのフォーマットについてなんだけど
printf '%05d' '33' → 00033
みたいなゼロ埋めってどのシステムでもサポートされているのかな。
%5dみたいな記述はPOSIXの仕様書に在ったから確実だけど
ゼロ埋めフラグについて何の言及もしてないっぽいんだよね。
%gとかと違って「実装を要求しない」とも言っていないし。

11:デフォルトの名無しさん
19/02/15 12:20:14.92 8DR6dyZB.net
あ。自決。
よーく読んでもっつーか普通に書いてあったわ。

12:デフォルトの名無しさん
19/02/15 23:18:53.00 Hwu/ac/i.net
結論を書いてから死ぬんだ

13:デフォルトの名無しさん
19/02/16 00:07:44.70 FAU3Sbcr.net
自決か・・・

14:デフォルトの名無しさん
19/02/16 01:21:53.36 SPTGalft.net
>>11
なんて書いてあった?
シェルのバージョンによっては8進数しか
受け付けなかったりするんだよねー

15:デフォルトの名無しさん
19/02/16 01:31:05.83 k5VPqkkr.net
シェルスクリプトで数値を扱うのがおかしい。シェルスクリプトは文字として認識しているから、もともと数値の取り扱いは気をつけないといけない。

16:デフォルトの名無しさん
19/02/16 01:35:36.86 SPTGalft.net
そんな事言われましても、シェルスクリプトに
数値計算の機能がありますし

17:デフォルトの名無しさん
19/02/16 02:04:59.47 k5VPqkkr.net
>>16
シェルスクリプトそのものにはもともと計算機能は存在しないよ。
shは計算コマンドでの対応しかできない。

18:デフォルトの名無しさん
19/02/16 06:28:35.63 OVG8+uJO.net
>>14
なんか勘違いしてね?
俺が言ってるのは0フラグ。
pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html#tag_20_94_13
ちなみにprintf '%b' '\0ddd'はPOSIXでは8進数しか定められてない
のでその「8進数しか受け付けない」システムは正当。

19:デフォルトの名無しさん
19/02/16 06:29:08.87 OVG8+uJO.net
>>17
$(())があるじゃない
exprやbcはまあコマンドだけど。

20:デフォルトの名無しさん
19/02/16 06:56:37.82 0pA9DINd.net
もともと

21:デフォルトの名無しさん
19/02/16 08:05:07.54 SPTGalft.net
今のシェルスクリプトの話をしろよ
需要に応じて変わるんだよ

22:デフォルトの名無しさん
19/02/16 14:10:14.71 DdK+9zEs.net
    〃〃∩  _, ,_
     ⊂⌒( つД´) < ヤダヤダ
       `ヽ_ ノ ⊂ノ
              ジタバタ

23:デフォルトの名無しさん
19/02/16 15:55:59.02 FAU3Sbcr.net
昔はよく expr コマンドを使ったものぢゃよ

24:デフォルトの名無しさん
19/02/16 16:39:46.54 MuF4+GQB.net
exprは(シェルによるけど)grepみたいな正規表現が単語に対して使えるからすごく重宝してた。
でも最近はそもそもそういう非可搬な機能を使うならbashの[[ <str> ~= "/regexp/" ]]でいいやってなってる。

25:デフォルトの名無しさん
19/02/21 04:12:08.57 UnmnTW3q.net
スレリンク(tech板)
わざわざひと月経ってから重複立てた理由は?

26:デフォルトの名無しさん
19/02/21 04:19:12.64 LAfLZLuz.net
そっちには特定のOSでしか動かないで存在しないのが入ってるからじゃね。特定のOSの板かスレが相応しいのだろう

27:デフォルトの名無しさん
19/02/21 04:24:39.60 LAfLZLuz.net
ああ、特定のOSでしかでもないのか。じゃ、すでに専用スレあるのでってとこか。言葉が違うのに混ぜることもないだろしな

28:デフォルトの名無しさん
19/02/22 17:45:17.27 W8hCm55w.net
特定のOS?

29:デフォルトの名無しさん
19/02/23 13:42:47.53 9pS68leH.net
月経の文字に反応

30:デフォルトの名無しさん
19/02/25 15:22:22.19 uN5/G9fw.net
受け取った文字列が想定しているものかを判定する場合で
「特定の種類の文字のみ構成されている」かを調べる方法として
↓こういうのを考えてみた
test "$VAR" = "${VAR#*[^a-z]}"
成功したらVARは[a-z]のみで構成されているということ。
あと一応POSIX 2018にも準拠してる。
grep(1)などを用いて処理するより早いと思うんだが
最近のPCは処理が速すぎて今一違いが分からんw

31:デフォルトの名無しさん
19/02/25 15:46:48.84 jjF3mg4o.net
case $VAR in
 *[^a-z]*) ;; # a-z以外の文字がある
 *) ;; # a-zのみで構成
esac
でいいやろ?
置換処理しないから更に速いはず

32:デフォルトの名無しさん
19/03/17 00:42:11.09 vYpDkOnV.net
foo() {
echo 1
echo
echo
echo
}
a="$(foo)"
echo "$a"

ってやったら、最後に改行がいくつあっても消えちゃうんだけどさ
aに改行ごと入れる方法ない?bash依存なしで

33:デフォルトの名無しさん
19/03/17 01:22:55.25 MBTcz8WL.net
>>32
a="$(foo; echo @)"
a="${a%@}"

34:デフォルトの名無しさん
19/03/17 22:55:33.85 8/J7EWL3.net
$ ( a="a,,b,,c"; IFS=","; set -- $a; echo $3; )
b
$ ( a="a b c"; IFS=" "; set -- $a; echo $3; )
c

なんでや?

35:デフォルトの名無しさん
19/03/17 23:27:41.47 uNuvPAZ3.net
なんでやと言われましても…

36:デフォルトの名無しさん
19/03/17 23:50:57.39 Y/j3QiNl.net
空(くう)を理解出来ないタイプの馬鹿って結構いるんだよな

37:デフォルトの名無しさん
19/03/17 23:54:01.74 8/J7EWL3.net
スペース か カンマ かによって
挙動が違うっておかしいだろ

38:デフォルトの名無しさん
19/03/18 00:09:19.55 iRq0tZYn.net
挙動は同じだけど?

39:デフォルトの名無しさん
19/03/18 00:25:52.00 Z0jAEi8m.net
わざわざそうしてるってなんで理解できないんだろかな

40:デフォルトの名無しさん
19/03/18 01:57:01.83 0Zzw4/NV.net
>>38>>39 で矛盾してますけど?

41:デフォルトの名無しさん
19/03/18 03:19:57.67 bAHak1a6.net
同じ挙動してるじゃん?

42:デフォルトの名無しさん
19/03/18 03:38:05.43 YXzanjRe.net
>>40
別人だからな。なんで同一視してんのかわからんな

43:デフォルトの名無しさん
19/03/18 03:39:03.36 0Zzw4/NV.net
あぁ、ブラウザで見るとスペースが1個になるのねw

$ ( a="a<カンマ2個>b<カンマ2個>c"; IFS=","; set -- $a; echo $3; )
b
$ ( a="a<スペース2個>b<スペース2個>c"; IFS=" "; set -- $a; echo $3; )
c

これで意味分かるやろ?
<カンマ2個>は ,, のこと
<スペース2個> も同様

44:デフォルトの名無しさん
19/03/18 03:41:08.39 YXzanjRe.net
やっぱり、元のヤツか。>>40といい独特というか視野が狭いというか思考理解力が狭いな
>>36が答えでもう終わってるだろうに

45:デフォルトの名無しさん
19/03/21 19:54:41.91 jzAF3+In.net
あからさまに挙動見て仕様 理解できないとか・・・

46:デフォルトの名無しさん
19/03/21 22:56:46.84 RZb/N1K/.net
シェルスクリプトにヒアドキュメントって
"HERE" でも 'HERE' でも変数展開行われないのか・・・
"HERE" は HERE と同じだと思っていた

47:デフォルトの名無しさん
19/03/21 23:25:35.49 bEjwjHsM.net
なんで展開されると思えるのか、そこが少し不思議

48:デフォルトの名無しさん
19/03/22 02:16:32.57 xgV52nBe.net
>>47
シェルスクリプトだけじゃなくて、他の言語も勉強するといいですよ

49:デフォルトの名無しさん
19/03/22 03:13:10.80 eOBuYNEJ.net
>>48
なんで俺に?

50:デフォルトの名無しさん
19/03/22 06:47:12.77 aoKwVDMo.net
> If no part of word is quoted, all lines of the here-document shall be expanded for parameter expansion, command substitution, and arithmetic expansion.
URLリンク(pubs.opengroup.org)
\HERE とか
HE"R"E とか
""HERE でもいいんだな

51:デフォルトの名無しさん
19/03/22 11:57:50.97 g5h3mGP7.net
a = <<"EOT"

EOT
Ruby では、" " なら、バックスラッシュ・式展開が使える。
' ' なら使えない

52:デフォルトの名無しさん
19/03/22 12:46:19.30 eOBuYNEJ.net
ヒアの中身の話をしてるんじゃないのか?
なんだかrubyとかやってる人ってとんちんかんな人多いよなあ

53:デフォルトの名無しさん
19/03/22 14:48:23.02 HU9xhxJ/.net
>>47に対して>>48の意味が>>51だったてことだろ。意地はるなみっともない

54:デフォルトの名無しさん
19/03/22 20:16:49.37 eOBuYNEJ.net
>>53
ますます意味不明
なんでルビーがでてくるし?

55:デフォルトの名無しさん
19/03/22 22:38:33.79 z9ChYb8e.net
あー、もしかして、ヒアドキュメントが
他の言語にもあるって知らない人かな?
もう少し勉強したほうが良いよ

56:デフォルトの名無しさん
19/03/22 23:03:22.48 u7m3wqcd.net
スレタイ読めない人がいるな

57:デフォルトの名無しさん
19/03/22 23:42:28.23 HU9xhxJ/.net
この件は別に他の言語での知識経験から故にで全然おかしくないだろう
単にそう思ったのはそうだったのかで済む話でしかないだろうに。何を拘っているんだか

58:デフォルトの名無しさん
19/03/22 23:44:22.75 eOBuYNEJ.net
環境によって頭を切り替えられない馬鹿だという告白ってこと?
それならまあ納得なのだが。

59:デフォルトの名無しさん
19/03/22 23:48:13.41 HU9xhxJ/.net
なにを言っているんだか。単に「よく」調べないで経験則で思い込んでいたってだけだろう。そういう人もいてもおかしくはないだろう
誰かのように、どうも最初から馬鹿にしたいだけなら違うんだろうけどな

60:デフォルトの名無しさん
19/03/23 11:21:25.87 V0vJvcu9.net
「普通は」他の言語の知識があるわけで、
他の言語がそうだったから、シェルスクリプトでもそうだと
思ったのに違っていて驚いたってだけの話だろ
なんで言語が変わったら、0から言語仕様を勉強します。
以前の言語の知識は全て捨てて、最初から学び直しますってなるんだ?
文法は「知らない」 or 「間違いなく知ってる」 のどちらかしか無いはずなんです。
「他の言語がそうだったから、同じだろう」なんて思うやつなんてありえないんです。
そう考えてるのか?そんなやついないだろ。

61:デフォルトの名無しさん
19/03/23 12:19:57.25 O+DUttYl.net
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

62:デフォルトの名無しさん
19/03/23 12:27:43.57 daYwWoP0.net
たかが>>46の独白(?)に何をそんなに必死になっているんだか
何かが気に食わなかったのだろうな>>46のレスの内容ではなくて

63:デフォルトの名無しさん
19/03/23 13:51:52.81 V0vJvcu9.net
1. シェルスクリプトの仕様に文句言われて悔しい
2. 俺にとっての常識が、井の中の蛙だとばれて悔しい
どっちか

64:デフォルトの名無しさん
19/03/23 14:29:37.54 daYwWoP0.net
いやいやw君がなんだか。なにその読めなさはwずっと同じ人?

65:デフォルトの名無しさん
19/03/23 14:39:44.63 q0JuU/5a.net
>>63
3.おまえがバカを晒して悔しい
だろう?

66:デフォルトの名無しさん
19/03/23 14:42:21.52 V0vJvcu9.net
俺が>>46なんだが?

67:デフォルトの名無しさん
19/03/23 14:51:13.97 daYwWoP0.net
>>66
えーっ、おれが馬鹿を晒してしまったやんけっ
なにを長文で、わかりづらいネチっこい最後の部分。あんたのスタンスなんぞがわかっているのが居るんだからなにをわざわざな...もう
まあ、すまんかった、いろいろと

68:デフォルトの名無しさん
19/03/23 16:37:26.87 q0JuU/5a.net
>>66
だからだよw

69:デフォルトの名無しさん
19/03/23 18:12:02.34 V0vJvcu9.net
理由が書いてないものに意味はないよ。
ばーかばーかっていってるのと同じだからね

70:デフォルトの名無しさん
19/03/23 22:04:19.40 x8gXkLwZ.net
Rubyさいこおおおおおおお
シェルはほろびろおおおお

71:デフォルトの名無しさん
19/03/23 23:36:39.28 xoOtakOI.net
やれやれ、延長戦か。昨日ので終わってれば普通のまともな人に見えたのに。

72:デフォルトの名無しさん
19/03/24 11:30:58.75 WkQ3cHj8.net
ジョブって使ったことあります?
fgとかbgぐらいはあると思うんですが、
そういうのってコマンドラインじゃなくて
シェルスクリプトで使うことって考えられますかね?

73:デフォルトの名無しさん
19/03/25 08:32:22.35 Gker1m8S.net
俺はないけど
単に経験が浅いだけかも知れない
ただ,似非の非同期処理として,ネットワーク資源をwgetなんかで取得しているジョブと同時に
その資源に依存しない種々の作業を同時に実行して,
その資源が必要になった段階でwaitコマンドでwgetの終了を待つ,
みたいなことはよくやる。

74:デフォルトの名無しさん
19/03/29 07:25:41.51 KhBeLwdl.net
USR1シグナルって受け取ったら
trapしてても死んじゃうの?

75:デフォルトの名無しさん
19/03/29 08:09:44.39 iZJL5S3u.net
いいや
シグナルに対してハンドラが無い場合死ぬのであって、trapしてんだか死なない

76:デフォルトの名無しさん
19/03/29 10:51:28.75 KhBeLwdl.net
いや死ぬんだが? これ実行してみ
[main.sh]
#!/bin/sh
trap 'echo USR1' USR1
for i in $(seq 1 10); do
./child.sh "$$" &
done
wait
[child.sh]
#!/bin/sh
sleep 0.1
kill -USR1 "$1"

77:デフォルトの名無しさん
19/03/29 14:30:15.21 iZJL5S3u.net
ただの正常終了、main.sh処理全部終わりましたでしょがー
意図した動きになるようには書いてないだけでしょう

78:デフォルトの名無しさん
19/03/29 15:51:57.16 KhBeLwdl.net
>>77
実行すらしてないようだから、実行結果書いておきますねw
$ ./main.sh
USR1
USR1
$ ./child.sh: 4: kill: No such process
./child.sh: 4: kill: No such process
./child.sh: 4: kill: No such process
./child.sh: 4: kill: No such process
./child.sh: 4: kill: No such process
./child.sh: 4: kill: No such process

79:デフォルトの名無しさん
19/03/29 16:03:50.50 iZJL5S3u.net
なにそれ。性根の悪いヤツだな
man bashでwait及びシグナルんとこ読みなさい

80:デフォルトの名無しさん
19/03/29 16:07:09.38 KhBeLwdl.net
>>79
はいどうぞ。
wait [n ...]
n が与え
られていない場合には、現在アクティブな全ての子プロセスを wait し、 返却ステータスは 0 となります。

疑問点があれば受け付けますよ?

81:デフォルトの名無しさん
19/03/29 16:08:06.24 iZJL5S3u.net
なんか続きそうでメンドくさくなった
ただの正常終了、「main.sh処理全部終わりました」
だよ。
wait
じゃなくて
until wait
do
:
done
とかだろう。どう意図した動きにしたいのか知らんけど、間違いは

82:デフォルトの名無しさん
19/03/29 16:08:42.72 iZJL5S3u.net
マジで性根の悪いヤツだった。言ったことやってから言えよな、もう

83:デフォルトの名無しさん
19/03/29 16:13:17.88 KhBeLwdl.net
> 言ったこと
ってどれ?w

84:デフォルトの名無しさん
19/03/29 16:16:44.69 iZJL5S3u.net
「シグナルんとこ読みなさい」だよ。くそがw
よく笑ってるな。まじでなんなん?ただのプライドが高いアレか

85:デフォルトの名無しさん
19/03/29 23:35:25.52 6TL4Muj2.net
どこまで本気なのかなあ。
小学生が頭の悪そうななぞなぞで得意がってるとか、そういう雰囲気を感じる。
とりあえず
「シグナルで死んだんなら、なんで echo が実行されてんだよ!」
とつっこんでおくよ。

86:デフォルトの名無しさん
19/03/30 15:21:37.81 iJ+PacLA.net
シグナルで死んでるんじゃなくて全てのプロセスが終了する前に wait から抜けちゃうってことだな。
理由はシグナル受け取っているからだが。

87:デフォルトの名無しさん
19/03/30 23:21:26.53 s3xILrfA.net
Ruby のSignal モジュールを使え
割り込み : Ctrl + C
Signal.trap("INT") { |signo| puts Signal.signame(signo) }
Process.kill("INT", 0)

88:デフォルトの名無しさん
19/03/30 23:27:14.67 VjxmND9i.net
スレ違い

89:デフォルトの名無しさん
19/03/31 06:29:53.92 QZIPpnnl.net
ちゅうかお題違い

90:デフォルトの名無しさん
19/04/01 01:31:26.57 IKNNLLYB.net
for i in *; do
echo "$i"
done
これって必ずソートされるの?

91:デフォルトの名無しさん
19/04/01 01:55:34.42 dFHstMQf.net
POSIXでソートすることになってる

92:デフォルトの名無しさん
19/04/01 08:49:30.39 IKNNLLYB.net
へー、取得したいのは最初の一個だけでいいんだけど、
その最初の一個は、小さいものになるんか
というか、一個だけ取得する速い方法ないかな?
でもソートしてるなら、結局内部で全部読み込むのか?

93:デフォルトの名無しさん
19/04/01 09:43:29.00 NOgINnam.net
へんなの居付いたな

94:デフォルトの名無しさん
19/04/01 10:02:05.99 IKNNLLYB.net
そりゃ俺が立てたスレだしなー

95:デフォルトの名無しさん
19/04/01 10:28:36.49 ifPcZP08.net
ls -1U とか?

96:デフォルトの名無しさん
19/04/04 00:24:00.86 opkeFDjY.net
1.txt, 2.txt, 3.txt と3つファイルがあるディレクトリでecho * したら
これらのファイルがでてくるのに空のディレクトリで、
echo * したら * と表示されるのなんで?
何も表示されないでほしいんだけど、この仕様、なにか便利なの?

97:デフォルトの名無しさん
19/04/04 03:15:34.42 7s/hio3T.net
echoがやってるんじゃないし...

98:デフォルトの名無しさん
19/04/04 03:21:22.66 xQGJKB0I.net
エコーさんはね、もらったものをエコーするだけだってね、ママがいってたの

99:デフォルトの名無しさん
19/04/04 04:46:21.43 19nHnpBp.net
cat *
とかで困るだろうに

100:デフォルトの名無しさん
19/04/04 11:44:59.87 opkeFDjY.net
echoがやってるかどうかは論点じゃないしw

101:デフォルトの名無しさん
19/04/04 13:06:19.36 /xpppM3k.net
いや、重要だぞ。何の man を読めばいいかというのは。読む気があればね。

102:デフォルトの名無しさん
19/04/04 14:25:13.45 opkeFDjY.net
それで質問の答は?

103:デフォルトの名無しさん
19/04/04 15:00:27.41 19nHnpBp.net
答えはmanに書いてある。なんでかは「読まなければならない」けど

104:デフォルトの名無しさん
19/04/04 15:08:08.53 vligoyoR.net
>>102
echo は渡された文字列をそのまま出力する仕様なので、* を渡されたら * が出力される。というのが回答だよ。

105:デフォルトの名無しさん
19/04/04 16:46:44.95 /xpppM3k.net
まあ、「'*' はいらない」というのももっともなことだしね。
bash を使ってるなら man の「パス名展開」の項を読めばいいかも。
bash じゃない場合は…読めばなんとかなるでしょ。

106:デフォルトの名無しさん
19/04/04 16:53:45.66 19nHnpBp.net
いらないからいる(?)になってるんだけどね。それもそうmanに書いてある

107:デフォルトの名無しさん
19/04/04 17:59:04.72 opkeFDjY.net
>>104
聞いてるのは仕様ではなくて、
どうしてそうしたかの理由です。

108:デフォルトの名無しさん
19/04/04 18:17:25.75 19nHnpBp.net
だからmanに書いてあるってw

109:デフォルトの名無しさん
19/04/04 19:15:53.98 opkeFDjY.net
書いてないから聞いてる

110:デフォルトの名無しさん
19/04/04 19:20:19.17 19nHnpBp.net
書いてあるんだなあ。書いてないんじゃなくて探してないだな

111:デフォルトの名無しさん
19/04/04 19:23:19.35 opkeFDjY.net
最近、無いものをあると言いはるのが増えてるのか?
無いものはいくら探してもないし、
有るならさっと出すことぐらいできるだろ

112:デフォルトの名無しさん
19/04/04 19:24:58.44 19nHnpBp.net
なんかいたね、ちょっと前のシグナルの質問してたのとか
煽って自分では労力さかずに答え出させようしてんの?w

113:デフォルトの名無しさん
19/04/04 19:30:55.71 opkeFDjY.net
んで答えは?w

114:デフォルトの名無しさん
19/04/04 19:31:22.20 19nHnpBp.net
manに書いてあるw

115:デフォルトの名無しさん
19/04/04 20:09:11.90 opkeFDjY.net
書いてない

116:デフォルトの名無しさん
19/04/04 20:21:01.39 19nHnpBp.net
マンザイとしてはそれはないな。オモロクないやん、マンザイとして。いい感じだったのにw
その言い張り方が、なんか既視感ありすぎ。そしてよく「言いはるのが増えてるのか」なんて言えるなあ
まあ、ふんわりとした答えは>>99で答えてるんだけどね。それはmanに書いてた説明からだよ
ところでOSなに使ってるの?

117:デフォルトの名無しさん
19/04/04 20:24:57.07 opkeFDjY.net
catが困るのは、単にcatの仕様がクソってだけだろう
標準入力から読み込むためのオプションの - があるのに、
引数なしだと標準入力から読み込もうとするわけだから

118:デフォルトの名無しさん
19/04/04 20:28:22.13 19nHnpBp.net
浅いな、catは一例なのに
そのやたらプライド高そうだけど、全然そのプライドを裏付けるもの無いから、こんなことになってんやで?まあ、プライド高いから言ってもわからんだろけど
ちなみに、'*'でなくて''でもよさげなんだけど、'*'の方がやっぱりいいんだな(と、思う。そう具体的に書いてない、''に言及してはいないけど)。さて、どうしてでしょう?

119:デフォルトの名無しさん
19/04/04 20:45:06.72 opkeFDjY.net
> さて、どうしてでしょう?
お前にその答えが言えんの? *の方が良いと思ってるようだが、
正確にはディレクトリが空の時に帰ってくるのは、正確には*じゃないんだが

120:デフォルトの名無しさん
19/04/04 20:49:41.59 19nHnpBp.net
うん、>>117なんて宣える人にそう言われてたくないけど。やっぱ想像はつかないのね。なのになんで疑われているのかさっぱり。また煽って喋らせる手法?w
正確にはってのはイミフ。なんの正確?なにを言いたいのかイミフだがほぼデフォルトの環境ではそうだよ、てか、そう決められているはずなんだがなあ

121:デフォルトの名無しさん
19/04/04 20:54:08.11 opkeFDjY.net
聞いてるのは、決められているかどうかじゃなくて
なぜそういう風に決めたかだって言ってるだろ

122:デフォルトの名無しさん
19/04/04 20:55:07.83 opkeFDjY.net
だいたい、俺の想像していることがわかってない時点で
お前はダメダメなんやで?わかってるか?
俺の想像していることぐらい読み取れ!

123:デフォルトの名無しさん
19/04/04 20:56:45.08 opkeFDjY.net
ディレクトリが空の時に帰ってくるのは * ではありません。
echo ? だと ? が帰ってきます。

124:デフォルトの名無しさん
19/04/04 20:58:07.29 opkeFDjY.net
echo *[a-z]* だと *[a-z]* が帰ってきますが、
さて、このディレクトリは空でしょうか?
それとも *[a-z]* という名前のファイルがあるのでしょうか?

125:デフォルトの名無しさん
19/04/04 20:58:24.17 19nHnpBp.net
だから、なぜそういう風に決められたかっていうことをずーーっと言っているんだけど?
あんたが自分勝手な自分だけの思いで自分の考えに固執してるから先に進んでないんだけなのに。既視感ありまくりw
'*'の方がいいとまでちょっと進んで言っているのに聞かないで反発してるだけだし。答えは書いてある。さあ、理解に向けて進んでみようw

126:デフォルトの名無しさん
19/04/04 21:02:36.29 19nHnpBp.net
>>123,124
そりゃそうだ。根本的に勘違いしてる。*なんだから'*'、?なんだから'?'、[a-z]*なんだから'[a-z]*'でしょに。なにを言っているのだか
なんで、ますますプライドを裏打ちするものが無いって自ら開陳するかなあ。捨てなその意味ないプライドは。文字通りプライドが邪魔する(意味が違うか?w)でしょうに

127:デフォルトの名無しさん
19/04/04 21:04:35.03 7s/hio3T.net
>>122
あすぺってこういう人のこと言うの?
違う?

128:デフォルトの名無しさん
19/04/04 21:04:35.25 opkeFDjY.net
だから答えは書いてないって言ってるだろ
いい加減、悪魔の証明は辞めてくれ。
無いものは無い。無いという証拠を見つけられないなら
悪魔はいるってことだ!←ほんと馬鹿みたいだ

129:デフォルトの名無しさん
19/04/04 21:07:34.48 19nHnpBp.net
答えは書いてあるよ。ふんわりと。あんたに理解できるようには書いてないかもだけどwいや、プライド高いお人だからわかると思うんだけどということでw
悪魔の証明でもなんでもないのになあ。なんとか言わせたくて必死な感じ?通用しないよ何度もはw

130:デフォルトの名無しさん
19/04/04 21:08:58.45 opkeFDjY.net
※書いてないから、言えないのです

131:デフォルトの名無しさん
19/04/04 21:09:37.50 19nHnpBp.net
>>127
俺のこと?違うよww わざとやってます。なんかオモロイから
なんで自分の労力を割くのが嫌いなくせに、まわーーーーーり道してんのかなあと。どこまで回り道すんのかなとw

132:デフォルトの名無しさん
19/04/04 21:11:14.30 19nHnpBp.net
>>130
そんなあけすけな手にはのらないww

133:デフォルトの名無しさん
19/04/04 21:46:57.92 gljFUA1G.net
もうどっちがどっちなのか分からんけど
グロブに関する疑問なら答えられそうなので,
最初の質問を教えてくれ。

134:デフォルトの名無しさん
19/04/04 21:49:48.14 19nHnpBp.net
ありゃりゃ。終わっちゃうかっw
親切だな。まあいいことだけど。ヤツにとっていいこととは思えないけど(余計なお世話)

135:デフォルトの名無しさん
19/04/04 21:52:55.41 19nHnpBp.net
>>133
>>96が元、(>>105.106からの?)>>107
だよ。それ以外はいらないww(たぶん)

136:デフォルトの名無しさん
19/04/04 22:06:28.63 opkeFDjY.net
>>133
echo * (別にechoである必要はない)で
ファイルが見つからない時になぜ * を返すのか?
そういう仕様にした理由

137:デフォルトの名無しさん
19/04/04 22:52:03.02 opkeFDjY.net
ありゃ? もうすぐ答え出るかと思ってひとっ風呂浴びてきたんだが
まだでてないや。誰か曰くmanに書いてあるらしいから
知らなくても答える気があるなら、答えられるはずなんだけどなー
な?書いてないだろ?

138:デフォルトの名無しさん
19/04/04 22:55:28.86 19nHnpBp.net
そこまで言い張ってあったらどうすの?いやあるんだけど
黙って逃げるだけの未来しか見えないw

139:デフォルトの名無しさん
19/04/04 23:03:19.00 opkeFDjY.net
じゃあ先に答えを言ってくれた人へ
ありがとう

これでもう黙って逃げるだけの未来はなくなりました。

140:デフォルトの名無しさん
19/04/04 23:04:43.01 19nHnpBp.net
やかましわっ、アホっw
なんでこうも強情というか自信満々なのかなあと、実際にあるのに書いてあるのを知っている方は思うんだよ
で、ここまで強情で自身満々故になのか逃げるだけかというのも透けて見えるんだよ
まあ、>>133のお人が答えてもらえるんだからもっと待ちなさいな
なんでそうも自己都合なんだかw。俺が>>133だったら答えるのやめるw。別に>>133のお人に答えるなとか風なことでではない、あくまでも俺だったらね

141:デフォルトの名無しさん
19/04/04 23:10:20.77 opkeFDjY.net
書いてある内容をコピペすりゃ終わりなのに
長引かせてるのはお前やで?

142:デフォルトの名無しさん
19/04/04 23:13:02.33 19nHnpBp.net
そうだよ?言われなくても、そうだよ?(すでに>>131で書いてあるやん?w)
なにを急に言い出してるの?それもあんたも律儀にレスしてんのに

143:デフォルトの名無しさん
19/04/04 23:14:01.18 opkeFDjY.net
自信満々に荒らし宣言w

144:デフォルトの名無しさん
19/04/04 23:17:24.59 19nHnpBp.net
いやいや、それを言うならあんたもだって。なんだかなあ。それに俺はちゃんと答えている(ふんわりと)、それにあーだこーだ言っているのはあんたなんですけど?どっちがよりでしょうねえ?
第三者から荒らしと言われてもしょうがないかと思うが、あんたが言い出すとは、まあ、先の「言い張る~」と同じパターンやね
てかさ、せっかく>>133が出てきたのにそうやってなぜ流すようなことすんの?w

145:デフォルトの名無しさん
19/04/05 11:46:05.38 zBV/1Std.net
>>133
待ってますよ

146:デフォルトの名無しさん
19/04/07 10:20:38.47 eWoMr/0V.net
>>133
まだですか?

147:デフォルトの名無しさん
19/04/08 15:20:56.18 NNFII5Ih.net
横からだけど面倒臭いから答えを書いとくよ
bash なら man bash の Pathname Expansion に書かれてるから、それをちゃんと読んでから質問してね。

148:デフォルトの名無しさん
19/04/08 15:59:00.29 3hZl3Wdo.net
>>147
そこに「なぜ*を返すことにしたのかという理由」は書いてないって言うのが面倒だから、ソースとGoogle翻訳貼り付けるわ
URLリンク(git.savannah.gnu.org)
*パターンマッチング::シェルがパターンをどのようにマッチングするか。
単語分割後、 '-f'オプションが設定されていない限り(* Set The Builtin::)、Bashは各単語をスキャンして文字 '*'、 '?'、および '['を探します。
これらの文字の1つが現れると、その単語はPATTERNと見なされ、パターンと一致するファイル名のアルファベット順にソートされたリストに置き換えられます(* Pattern Matching::)。
一致するファイル名が見つからず、シェルオプション 'nullglob'が無効の場合、単語は変更されません。
'nullglob'オプションが設定されていて、一致が見つからない場合、その単語は削除されます。
'failglob'シェルオプションが設定されていて、一致するものが見つからなかった場合、エラーメッセージが表示され、コマンドは実行されません。
シェルオプション 'nocaseglob'が有効になっている場合、アルファベット文字の大文字と小文字を区別せずに照合が実行されます。
パターンがファイル名展開に使用されるとき、文字 '。' シェルオプション 'dotglob'が設定されていない限り、ファイル名の先頭またはスラッシュの直後に明示的にマッチしなければなりません。
ファイル名 '。' 'dotglob'が設定されていても、 '..'は常に明示的に一致しなければなりません。
それ以外の場合は、「。」 文字は特別扱いされません。
ファイル名を一致させる場合、スラッシュ文字は常にパターン内のスラッシュと明示的に一致させる必要がありますが、
他の一致コンテキストでは、後述のように特殊なパターン文字と一致させることができます。

149:デフォルトの名無しさん
19/04/08 15:59:15.40 3hZl3Wdo.net
nocaseglob'、 'nullglob'、 'failglob'、および 'dotglob'オプションの説明については、* note The Shopt Builtin ::の 'shopt'の説明を参照してください。
'GLOBIGNORE'シェル変数はパターンにマッチするファイル名のセットを制限するために使用されるかもしれません。
「GLOBIGNORE」が設定されている場合、「GLOBIGNORE」のパターンの1つとも一致する各一致ファイル名は、一致リストから削除されます。
'nocaseglob'オプションが設定されている場合、 'GLOBIGNORE'のパターンとのマッチングは大文字小文字の区別なしに実行されます。
ファイル名 '。' 'GLOBIGNORE'が設定されていてヌルでない場合は、 '..'は常に無視されます。
ただし、 'GLOBIGNORE'をNULL以外の値に設定すると、 'dotglob'シェルオプションが有効になるので、他のすべてのファイル名は '。'で始まります。 一致します。
'。'で始まるファイル名を無視するという古い動作をするには、 '。*'を 'GLOBIGNORE'のパターンの1つにします。
'GLOBIGNORE'が設定されていない場合、 'dotglob'オプションは無効になります。

150:デフォルトの名無しさん
19/04/08 16:53:14.39 6GvfotlI.net
存在する機能の説明なのでその機能について説明しているだけかなと

151:デフォルトの名無しさん
19/04/08 16:56:27.29 3hZl3Wdo.net
133 名前:デフォルトの名無しさん[sage] 投稿日:2019/04/04(木) 21:46:57.92 ID:gljFUA1G
もうどっちがどっちなのか分からんけど
グロブに関する疑問なら答えられそうなので,
最初の質問を教えてくれ。
136 自分:デフォルトの名無しさん[sage] 投稿日:2019/04/04(木) 22:06:28.63 ID:opkeFDjY [17/21]
>>133
echo * (別にechoである必要はない)で
ファイルが見つからない時になぜ * を返すのか?
そういう仕様にした理由

152:デフォルトの名無しさん
19/04/08 17:06:51.60 6GvfotlI.net
なぜかは、
だいたいは、こんな感じ(だろうで)、
if(argc < 2){
fprintf(stderr, "usage: hoge file ...\n");
exit(1);
}
if((fp = fopen(argv[1], ...)) == NULL){
warn("%s", arg);
exit(1);
}
$ rm -v '*'
rm: *: No such file or directory
$ rm -v ''
rm: : No such file or directory
$ rm -v
usage: rm [-f | -i] [-dPRrvW] file ...
unlink file
どれがエラーとして適切?ということとかとか。他にエラーにならないのが困るとか
スクリプトでしかの話なら何も返さないというのもあるけど、スクリプトだけのためのじゃないからねえ。上記の通りコマンド的にはエラーの方がわかりやすく、シェルがどのコマンドだから展開方法を変えるというわけでもないし
>>151
そこにあるキーワードで別のmanがググれるよ

153:デフォルトの名無しさん
19/04/08 17:08:25.01 6GvfotlI.net
>>152
誤 warn("%s", arg);
正 warn("%s", argv[1]);

154:デフォルトの名無しさん
19/04/08 17:14:32.56 3hZl3Wdo.net
>>152
それどれもエラーになってますよ?

155:デフォルトの名無しさん
19/04/08 17:16:06.60 6GvfotlI.net
エラーだもの。「エラーの方がわかりやすく」ってとこ?すまん変な文になった
そのままの方がわかりやすく(?)
かな。

156:デフォルトの名無しさん
19/04/08 17:16:38.44 3hZl3Wdo.net
>>152
> そこにあるキーワードで別のmanがググれるよ
今度は、どのmanですか?

157:デフォルトの名無しさん
19/04/08 17:19:09.45 6GvfotlI.net
ああ、「どれがエラーとして適切?」もか。「どれもエラーだがどれが適切?」というつもりだったんだが。「どれもエラーだがどれがエラメッセージとして適切?」までか

158:デフォルトの名無しさん
19/04/08 17:20:08.01 6GvfotlI.net
>>156
今度はという意味がわからんが、
man 「キーワード」
でググってみ

159:デフォルトの名無しさん
19/04/08 17:21:42.07 6GvfotlI.net
てか、またおまえか?いちいち教えてもらったのに文句つけてるんだなw

160:デフォルトの名無しさん
19/04/08 17:23:26.97 3hZl3Wdo.net
>>157
for i in *.txt; do rm "$i"; done
(すでに拡張子txtのファイルが全て削除されている場合)
rm: '*.txt' を削除できません: そのようなファイルやディレクトリはありません
これは適切なエラーメッセージだと思いますか?

161:デフォルトの名無しさん
19/04/08 17:24:20.52 3hZl3Wdo.net
>>158
なんで「キーワード」というふうに隠すんですか?
キーワードの中身を書きましょうよw

162:デフォルトの名無しさん
19/04/08 17:24:53.61 6GvfotlI.net
>>152の最後に書いてあるだろう。なんでいちいちいちいち教えなきゃならんのねん
コマンドとしては適切だろう

163:デフォルトの名無しさん
19/04/08 17:27:49.54 6GvfotlI.net
>>161
いちいち教えてもらわなきゃならないのに、隙あらば文句つけるようなヤツに丁寧に教える必要はないってことだよ。社会的に一般的なことだなw
まあ、もともとはあんたに具体的に教えたくないから、あんたじゃない人に他にあるよと言ってみただけだな
てか、ぜんぜん進んでねーな。こんなやりとりしてもぜんぜん進まないよ?少しは頭を働かせて自力でやってみなさいな

164:デフォルトの名無しさん
19/04/08 17:29:55.75 3hZl3Wdo.net
1. man bashにある
2. ありませんでした。
3. 他のmanにある
4. ありませんでした。
この流れか

165:デフォルトの名無しさん
19/04/08 17:31:26.91 3hZl3Wdo.net
日本語に訳してあげないと、書いてないことを認めなかったくせに
何言ってるんだろうね。

166:デフォルトの名無しさん
19/04/08 17:31:36.42 6GvfotlI.net
マジで「読めない」のな...どうしようかw

167:デフォルトの名無しさん
19/04/08 17:32:31.71 6GvfotlI.net
>>165
なにをおっしゃってるんですか?すごいな、いやすごい
な?全然進まんだろ?w

168:デフォルトの名無しさん
19/04/08 17:35:16.40 3hZl3Wdo.net
お前が出てくるといつも進まんよなw

169:デフォルトの名無しさん
19/04/08 17:37:34.84 6GvfotlI.net
あんたが進まなだけだからな、別にあんたが進まないのは俺はどうでもいいんだけど、なにか進みたがってるあんたがどう動くのかが興味ありの
なんで俺にいちいちレスしてんの?w

170:デフォルトの名無しさん
19/04/08 17:42:21.44 3hZl3Wdo.net
> なんで俺にいちいちレスしてんの?w
お前が言ってることが嘘だからだよ。
manにそういう仕様にした理由は書いてませんでした。

171:デフォルトの名無しさん
19/04/08 17:42:42.54 3hZl3Wdo.net
知らないなら、素直に知らないって言えばいいのに

172:デフォルトの名無しさん
19/04/08 17:44:22.86 6GvfotlI.net
ちょっとは進んで(ID:3hZl3Wdo がヤツだとは思わなかったのでw)、>>152を書いてみたが、ヤツはやっぱり聞かないだけだったという
俺は単に最初からmanにあるとしか言ってない、man bashに言及してるのはあったけど(>>105ですでになのに、なんでいまごろなんだ?)、まあそこからでもたどり着くかなとw
>>164なんてお前の勝手な妄想解釈。あるよ本当に
(「言っちゃった」とちょっと悔しくもある。また、「言っちゃった」のになんで探せないないねんwwwここまで言えばさすが自分で探すか?)

173:デフォルトの名無しさん
19/04/08 18:02:56.45 6GvfotlI.net
探せたか?wwまあ、探せても「読めない」可能性が高いかな
・やっぱり、探せない
・探せたが、読めなくて文句つける
・探せて、黙って逃げる
・他
どれでしょう。まあこう書いたら「他」にする可能性が高いか

174:デフォルトの名無しさん
19/04/08 18:16:37.06 3hZl3Wdo.net
> なんでいまごろなんだ?
>>105の「パス名展開」の項にないのはわかっていて、そこにないと言ってるのに
性懲りもなく、>>147で「bash なら man bash の Pathname Expansion に書かれてるから」と
いうから、こいつ読んでないなってことで日本語に訳してあげたんだろ
そして
> ファイルが見つからない時になぜ * を返すのか?
> そういう仕様にした理由
は、そこに書いてないと同意取れたはずだが?
なんでそんな説明をせにゃいかんのよ?

175:デフォルトの名無しさん
19/04/08 18:23:16.92 6GvfotlI.net
「性懲りもなく」...「訳してあげた」んだろ
すんげええなあ、今までさんざん無能っぷりを自ら披露しているのにw 単によくレスを見なかった人がと考えはしないのね。自分がレスをよく見ないくせにw
お前のレスはぜーーーーんぶ自分内で完結している。こんな他人と交わらない方がいいんじゃないの?
呆れ果てるな。まあ、その自己の世界で妄想ダダ漏れすればいいと思うよ

176:デフォルトの名無しさん
19/04/08 18:24:46.51 3hZl3Wdo.net
↑ほらな。俺の言ったことを否定したいだけw

177:デフォルトの名無しさん
19/04/08 18:28:18.84 6GvfotlI.net
そりゃ、否定するよ。矛盾自己肯定だらけだもの
もしかして、あんたって40超えたおっさんで外人にクソガキ呼ばわりされたことない?って気になったり。まあ、違うかw

178:デフォルトの名無しさん
19/04/08 18:34:08.77 3hZl3Wdo.net
>>117
40超えたおっさんにクソガキ呼ばわりでもされたか?w

179:デフォルトの名無しさん
19/04/08 18:34:25.94 3hZl3Wdo.net
>>117 じゃなくて >>177

180:デフォルトの名無しさん
19/04/08 18:37:29.49 6GvfotlI.net
いや、そういう(一部で有名な)有名人がいてな、あんたの属性が似すぎててな。幾つかは知らんが、あんたもそのうちそうなるだろうな
年意外同じだからw 年取ればそれが変わるわけでもないぞw

181:デフォルトの名無しさん
19/04/08 18:40:11.70 3hZl3Wdo.net
嫌いなやつはみんな一緒。思考回路が単純(笑)

182:デフォルトの名無しさん
19/04/08 18:43:03.63 6GvfotlI.net
イミフ。なんで「嫌い」とかアホなこと言っているのだか。人のふり見て我がふり直すとかあるでしょ?そういう意味だよ、そういう有名人
誰ともわからないハズなのに「嫌い」とだけの理由にできるとは...さては...ww

183:デフォルトの名無しさん
19/04/08 18:45:02.15 3hZl3Wdo.net
はいはい。話戻すぜ。
ファイルが見つからない時になぜ * を返すのか?
そういう仕様にした理由
^^^^^^^^^^^^^^^^^^^^^^
manに書いてあるそーです。やつのたわごとを信じる人は
(ネットじゃなくて)manの中から探してみてください。
信じない or 信じたけど裏切られたら、
ここにmanの場所が書かれることはないでしょう(予言)

184:デフォルトの名無しさん
19/04/08 18:46:10.94 6GvfotlI.net
・やっぱり、探せない
か... うん、なんかよかったww
じゃ、がんばれよ

185:デフォルトの名無しさん
19/04/08 18:50:10.35 3hZl3Wdo.net
>>184
安心しろ。俺以外の人も見つけられない。
だからここに俺とお前以外の人間が書くこともない。
俺が言ってることが正しければな(笑)

186:デフォルトの名無しさん
19/04/08 18:56:04.68 6GvfotlI.net
ほんと「読めないのな」。よかったはそういう意味じゃない
わざとかと思えなくもないけど、いままでの「読めなさ」からはわざとではないとしか思えない
どう見ても、お前の都合のよいことだな、さすがだよ
場所のレスもらえればお前がいままで知りたかったことがわかり、黙って逃げるだけw(そこにお前の苦悩とかなさげ)
もらえなかったら、お前の中では自己肯定の補強にになるだけとういう。間違いでもな
しょうがないな、1ヶ月後に教えてやるよw何もなかったら1ヶ月後に、この話題はw

187:デフォルトの名無しさん
19/04/08 19:02:14.14 3hZl3Wdo.net
なんなら一年後でいいんやで?w

188:デフォルトの名無しさん
19/04/08 19:09:11.60 6GvfotlI.net
イミフ。下衆い意味で言っていそうではあるがwじゃ、適当な時にな

189:デフォルトの名無しさん
19/04/08 19:20:16.01 3hZl3Wdo.net
それまで別の話題でお会いしましょう(笑)
あ、他の人、manにないのは明らかなんで探さなくていいですよ~w
時間の無駄でしょうし。

190:デフォルトの名無しさん
19/04/08 19:24:11.57 3hZl3Wdo.net
__ - ____ ________ - ___

191:デフォルトの名無しさん
19/04/08 21:48:40.20 9U0C5XME.net
>>136
bashがそういう仕様にした理由は, shにあわせたからです.
shがそういう動作をする理由は, expand()が0をかえしたときはもとの引数文字列でmakearg()するようにつくられているからです. おそらく, そういう仕様をきめてからそういう動作をさせたわけではないとおもいます.

192:デフォルトの名無しさん
19/04/08 22:28:59.33 Ejuihx1D.net
ようやくまともなレスがw
>>191
その動き(expandやmakearg)はソースコードから?
補足しておくと俺は「"bashは"なぜそうしたのか?」とは
聞いてなくて、シェルスクリプト(元をたどればsh?)が
どうしてそういう動作をするのかの理由を聞いてる。
で、それは特に理由はないのかな?たまたま最初の実装した人が
あまり考えず、そうしましたぐらいの理由で。
だから理由を探しても見つからないと

193:デフォルトの名無しさん
19/04/08 22:36:01.12 Ejuihx1D.net
まとめ
for i in *.txt; do
 echo "$i"
done
何もファイルがないディレクトリで↑を実行すると
「*.txt」 というファイルが見つかったかのような動きをします。
「*.txt」というファイルだけがあるディレクトリで実行すると
全く同じように「*.txt」 というファイル名が表示されます。
つまり空ディレクトリでも「*.txt」というファイルがあっても
表示結果が全く同じになります。これは驚き最小の原則に反しています。

194:デフォルトの名無しさん
19/04/08 22:57:42.88 b/SlAWxT.net
URLリンク(linuxjm.osdn.jp)

195:デフォルトの名無しさん
19/04/08 23:22:25.12 Ih2qq+NP.net
の、POSIXのところは
URLリンク(pubs.opengroup.org)
GLOB_NOCHECK
かな?オプション名が意図不明だが説明文からは

196:デフォルトの名無しさん
19/04/08 23:37:03.41 8H4AhNTa.net
>>194
これを読んでも同じ結論になるわけだけど
> 先に与えた、わかりやすく簡単なルール、 「ワイルドカードパターンをマッチしたパス名のリストに展開する」と言うのは、
> オリジナルの UNIX における定義であった。 これはパターンが空のリストに展開されることも許可されていた。 例えば

> において、*.gif ファイルが全くない場合でも、 これは空のリストに展開されるため、エラーにならない。
> しかし POSIX では、文法的に正しくないパターンや、 マッチがなかったパターンは、 そのまま変更されずに残されることになっている。
なぜ、わかり易く簡単なルールを捨てて、POSIXでは「そのまま変更されずに残されることになっている。 」を
選んだのかが書かれてないんだよね。

197:デフォルトの名無しさん
19/04/08 23:45:50.70 Ih2qq+NP.net
・探せたが、読めなくて文句つける
か... 探してじゃなくてっぽいけどw
書いてあることが。読めれば」>>152もわかるだろうに。どういう意味で言ったかわからん最小の原則wとかやらにあっているだろう
まあ、単に「認めたくない」だけだろな
何か他にファイルなどがあるとこで、*.hogeなんてファイルがなかったとしよう、
ls *.hoge
でどう動くのが望ましい?この例「だけ」に噛み付くのじゃなく、ちゃんと頭を使って考えような

198:デフォルトの名無しさん
19/04/08 23:50:01.35 8H4AhNTa.net
>>197
1. 見つからない場合はエラーとなってls自体が実行されない
2. ls "" とみなされる
のどちらかだろうな。
次はあんたが、頭を使ってレスしてくれなw

199:デフォルトの名無しさん
19/04/08 23:52:32.47 8H4AhNTa.net
>>197
ついでだから、ファイルが見つからない時
for i in *.txt; do
 echo "$i"
done
はどう動くのが望ましいか書いてくれよ。
今の動きや仕様を書くんじゃなくて
どう動くのが望ましいかをね

200:デフォルトの名無しさん
19/04/08 23:53:17.08 Ih2qq+NP.net
ほんとに脊髄だけで、頭使わないのな
POSIXはシェルスクリプトだけを考えてるわけではないのだよ
ls *.a *.c *.c
で、どれかがあってどれかが無い場合の動作は?よくそれで頭使ってる風に言えるもんだ。

201:デフォルトの名無しさん
19/04/08 23:54:01.05 8H4AhNTa.net
> で、どれかがあってどれかが無い場合の動作は?
>>198に書いたとおり

202:デフォルトの名無しさん
19/04/08 23:54:41.62 QfzJZ21c.net
Ruby のglob を使った方が、バグらないので良い!

203:デフォルトの名無しさん
19/04/08 23:55:27.24 8H4AhNTa.net
空のディレクトリで実行するとこうなるのかw
$ ls *.a *.c *.c
ls: '*.a' にアクセスできません: そのようなファイルやディレクトリはありません
ls: '*.c' にアクセスできません: そのようなファイルやディレクトリはありません
ls: '*.c' にアクセスできません: そのようなファイルやディレクトリはありません

204:デフォルトの名無しさん
19/04/08 23:58:38.45 8H4AhNTa.net
多分あいつは、
> この例「だけ」
のことしか考えてない予感がするなw

205:デフォルトの名無しさん
19/04/09 00:00:36.62 cRtn1aSe.net
>>202
そうだね。ファイルが見つからないときは
ちゃんと空のリストを返してくれる。
シェルスクリプトのように、「*」を返すことはないね。
irb(main):001:0> Dir.glob('*')
=> []

206:デフォルトの名無しさん
19/04/09 00:01:15.03 cRtn1aSe.net
ID変わったけど、俺が ID:8H4AhNTa な

207:デフォルトの名無しさん
19/04/09 00:01:53.02 b0dEtQwc.net
まだ、ゴネてる。自分の思ったようにならないってだけでよくそれだけ粘れるな
POSIXの仕様に意味があるのはさんざん言った。お前が認めたくないなんて知ったこっちゃない
POSIXの仕様に合わせてそんなのが動くように普通に書けるし、嫌だったらbashのオプションであんたの好きにできるだろうに
>>201
ls: : No such file or directory
ls: : No such file or directory
ls: : No such file or directory
って、出て来るのが望ましいのね
ls: *.a: No such file or directory
ls: *.b: No such file or directory
ls: *.c: No such file or directory
POSIXの人も俺と同じだと思うよw
>>203
イミフ。なにを言いたいの?
なんで、いちいちいちいちいちいち説明教えなきゃならいないねん

208:デフォルトの名無しさん
19/04/09 00:12:14.14 cRtn1aSe.net
>>207
この質問は無視?
for i in *.txt; do
 echo "$i"
done
はどう動くのが望ましいか書いてくれよ。

209:デフォルトの名無しさん
19/04/09 00:12:42.47 cRtn1aSe.net
>>207
やっぱりlsの例だけしか考えてないようだね

210:デフォルトの名無しさん
19/04/09 00:15:06.05 b0dEtQwc.net
その例だけなら、回らないのが望ましいだろな。だが、POSIXはシェルスクリプトだけを考えてるわけではないからしょうがないうちだろな
で?

211:デフォルトの名無しさん
19/04/09 00:16:54.68 b0dEtQwc.net
>>209
何を言いたいのかわからんな。どゆこと?まさか「正確」と同じパターンじゃないよな?その気しか思えないので具体的に言って

212:デフォルトの名無しさん
19/04/09 00:18:30.84 cRtn1aSe.net
ついでにPHPの場合
$ php -r "print_r(glob('*'));"
Array
(
)
Perlの場合
perl -MData::Dumper -e 'print Dumper [glob "*"]'
$VAR1 = [];
Rubyと同じく、見つからない場合は
デフォルトでは空のリストが帰ってくる。

213:デフォルトの名無しさん
19/04/09 00:19:17.64 cRtn1aSe.net
>>210
さっきから
> POSIXはシェルスクリプトだけを考えてるわけではないから
を繰り返してるけど、シェルスクリプト以外とは何の話をしてるの?
そして、シェルスクリプト以外ではどうだって言いたいの?

214:デフォルトの名無しさん
19/04/09 00:20:20.88 cRtn1aSe.net
>>211
だからお前、"lsの場合では" *だったらエラーがわかりやすいって言ってるだけじゃん。
forの場合では、当てはまらないじゃん。

215:デフォルトの名無しさん
19/04/09 00:20:53.10 b0dEtQwc.net
>>213
マジか...

216:デフォルトの名無しさん
19/04/09 00:21:12.57 cRtn1aSe.net
>>215
逃げるなよ

217:デフォルトの名無しさん
19/04/09 00:24:19.08 b0dEtQwc.net
>>214
ああ、なんだ「シェルスクリプト」の(それも特定な)場合か。「ls」なんて言ってるから他のコマンドとかと思ったぞ
POSIXはシェルスクリプトだけを考えてるわけではないからw
話にならない、POSIXを勉強して出直してね

218:デフォルトの名無しさん
19/04/09 00:24:33.50 cRtn1aSe.net
C言語めんどくせーなーと思ったら、サクッとソースコード見つかった。
URLリンク(qiita.com)
↑のコードの ./*.txt を * に変換したけど、
やはり、空のディレクトリで * と表示されることはなく
何も表示されなかった。
POSIXってほんと何を言いたいんだろう?

219:デフォルトの名無しさん
19/04/09 00:25:50.97 b0dEtQwc.net
>>216
逃げるも何も「文句をつける対象を理解してない」のにどう相手をすれと?あんたにこれ以上こまごまこまごま教えてなきゃならんのか?
だったら、逃げるよ

220:デフォルトの名無しさん
19/04/09 00:26:21.07 cRtn1aSe.net
POSIXはシェルスクリプトだけを~とか、じゃあC言語のことなんですかねぇ
でもC言語でも空のディレクトリで * が返ってくることはないし
ほんと何が言いたいんだかw

221:デフォルトの名無しさん
19/04/09 00:27:47.89 cRtn1aSe.net
POSIXはシェルスクリプトだけを考えてるわけではないから
→ Ruby・・・空の配列を返す
→ Perl・・・空の配列を返す
→ PHP・・・空の配列を返す
→ C言語・・・空の配列を返す
シェルスクリプト以外は空の配列を返します。

222:デフォルトの名無しさん
19/04/09 00:28:27.37 b0dEtQwc.net
>>218,220
はあ...最後な
>>194,195をよーく読め。なんでそれがbashでになってるのかも

223:デフォルトの名無しさん
19/04/09 00:29:23.15 b0dEtQwc.net
以後、脊髄反射マンと呼ぶからなw

224:デフォルトの名無しさん
19/04/09 00:29:27.03 cRtn1aSe.net
>>222
またそれか。よく読んでも、そうした理由は書いてない。

225:デフォルトの名無しさん
19/04/09 00:29:47.10 cRtn1aSe.net
>>223
脊髄反射マン必死だなw

226:デフォルトの名無しさん
19/04/09 00:31:21.79 b0dEtQwc.net
Supports rule 3 in the Shell and Utilities volume of IEEE Std 1003.1-2001, Section 2.13.3, Patterns Used for Filename Expansion.

227:デフォルトの名無しさん
19/04/09 00:32:12.65 b0dEtQwc.net
>>225
モロ体現してありがたい。オモロイなあんたは

228:デフォルトの名無しさん
19/04/09 00:32:37.61 cRtn1aSe.net
>>226
何度も言ってるが、
俺が聞いているのは、そういう仕様にした"理由"であって
仕様の場所は聞いてはいない。
ほんと、脊髄反射しかしねーなw

229:デフォルトの名無しさん
19/04/09 00:34:36.17 b0dEtQwc.net
>>228
言っているけど。「読めれば」そう書いてあるんだけどな。「読めない読めない」言われてもしょうがない
あんただって、「空」だったらマズいときもあるって認めてるやん
本当にただただ「認めたくない」だけなんだな。その「コロ」っとあんたの原点に戻るあたり
まあ、がんばりや

230:デフォルトの名無しさん
19/04/09 00:35:06.66 cRtn1aSe.net
そして面白いのが、シェルスクリプトは glob で見つからない場合に
検索パターンを返すのに対して、シェルスクリプト以外では
見つからない場合に、空のリストを返すって所だな。

231:デフォルトの名無しさん
19/04/09 00:37:41.48 cRtn1aSe.net
>>229
お前、マズイときもあるし、マズくない時もあるって
自分で認めてるやんw
ということはお前の主張は、所詮マズイときの例でしかなく
マズくない時には当てはまらないってことになるんだぞ
わかってるのか?お前の主張が崩れてるの
で、シェルスクリプト以外は空のリストを返しているのに
シェルスクリプトだけは、見つからなかった時に * という
文字列を返すという仕様にした理由は?

232:デフォルトの名無しさん
19/04/09 00:39:30.00 cRtn1aSe.net
結局、一番マトモな理由は >>191が書いた
> おそらく, そういう仕様をきめてからそういう動作をさせたわけではないとおもいます.
これだけなんだよな。特に理由はない。
(深く考えずに)そうしてしまった。
もちろん、正式なドキュメントとして
この理由が、書かれている文書は見つかってないがね。

233:デフォルトの名無しさん
19/04/09 00:42:08.93 cRtn1aSe.net
あ、みなさん。もし ID:b0dEtQwc を擁護したい人がいるならば
ID:b0dEtQwc が示したドキュメントの中から、
「そういう仕様にした"理由"」を書いてある所を指摘して構わないんですよ?
ないでしょう? 誰も指摘しないもんね。それが証拠だよ。

234:デフォルトの名無しさん
19/04/09 00:42:13.89 b0dEtQwc.net
何言っているの?
>この仕様、なにか便利なの?
が、お前の原点だろ?それ以後「認めなたくない」のであーだこーだ言っているだけだな

235:デフォルトの名無しさん
19/04/09 00:43:58.23 b0dEtQwc.net
とうとう誰とも言えない人に頼るようになったか...ww

236:デフォルトの名無しさん
19/04/09 00:46:08.72 cRtn1aSe.net
>>234
ちゃんと流れを読むように
107 自分:デフォルトの名無しさん[sage] 投稿日:2019/04/04(木) 17:59:04.72 ID:opkeFDjY [4/21]
>>104
聞いてるのは仕様ではなくて、
どうしてそうしたかの理由です。

237:デフォルトの名無しさん
19/04/09 00:50:22.73 b0dEtQwc.net
>>236
流れというかレスを読めないあんたに言われたくないw
いや、原点の話でしかないな。あんたの都合に(それもあんたの都合の良いようになだけな)合わせる必要性はこれっぽちもないな
とりあえず、原点の問題は解消した&マズい場合もあるそれが理由ってことも解消したってことで、おしまい

238:デフォルトの名無しさん
19/04/09 00:51:41.47 cRtn1aSe.net
URLリンク(linuxjm.osdn.jp)
> において、*.gif ファイルが全くない場合でも、 これは空のリストに展開されるため、エラーにならない。
> しかし POSIX では、文法的に正しくないパターンや、 マッチがなかったパターンは、 そのまま変更されずに残されることになっている。
> bash では、次のコマンドで昔からの振る舞いに設定することができる。
>
> shopt -s nullglob
なぜ昔からの振る舞いから替えたのか?その理由が謎
(理由を明確に述べているドキュメントがない)

239:デフォルトの名無しさん
19/04/09 00:52:47.78 cRtn1aSe.net
>>237
おしまいなんで、あんたは消えていいです。
1ヶ月後にちゃんと答えてください(笑)

240:デフォルトの名無しさん
19/04/09 00:54:45.59 cRtn1aSe.net
> POSIXはシェルスクリプトだけを考えてるわけではないから
↑これも結局何が言いたいのか不明だったな
まあ、何も考えずに(調べずに)シェルスクリプト以外の言語でも
* を返してるはずだって思い込んだんだろうなw
(実際には見つからない場合は空のリストを返します。)

241:デフォルトの名無しさん
19/04/09 01:01:34.97 b0dEtQwc.net
なにか勝ち誇って妄想全開のようだが、全然違う
>>195をよく読もうな。>>226と注目すべきとこあげたのに
他の言語でもglobなんて自ら実装したりはしないんじゃないの。単にそのオプションがデフォルトでは設定されていない、オプションが設定できるのは設定すれば同じになるんじゃないの。妄想お疲れさん

242:デフォルトの名無しさん
19/04/09 01:09:06.87 cRtn1aSe.net
> POSIXはシェルスクリプトだけを考えてるわけではないから
↑これで何が言いたいのかを書けば済む話
それが出来ないのはなぜだろうw

243:デフォルトの名無しさん
19/04/09 01:09:51.04 cRtn1aSe.net
あ、ちなみに「注目すべきとこ」には何も書いてませんよ。
いつもどおりです。

244:デフォルトの名無しさん
19/04/09 01:15:27.47 b0dEtQwc.net
ほんとーーにっ、「読めない」のな、この脊髄反射マンっw

245:デフォルトの名無しさん
19/04/09 01:16:58.07 cRtn1aSe.net
読めないって言わずに、具体的に引用すればいいだけなのに
それをしないのは、結局引用する場所がないからなんだよね

246:デフォルトの名無しさん
19/04/09 01:23:40.88 b0dEtQwc.net
「無い」から「引用できない」に変わったけど、同じパターンやな。そして前言はなかったことにという前々からの同じパターン

247:デフォルトの名無しさん
19/04/09 01:25:22.47 cRtn1aSe.net
>>246はとりあえずレスしてみましたってだけで
中身がなにもないことに、皆さん気づきましたか?

248:デフォルトの名無しさん
19/04/09 01:26:56.18 b0dEtQwc.net
なんか少しは自分を見直すとかあって、ここでもこんなクソ(俺のも含めて)なレスの応酬もなく、見てためになる万人が楽しめるレス、Q&Aになるかと思ったが、無理かやっぱ(偉そう偉そう)
そりゃ無理かっ。なんか急に飽きた、じゃな

249:デフォルトの名無しさん
19/04/09 01:29:05.84 cRtn1aSe.net
はい、コイツは何度目かの逃亡宣言です。
また懲りずに来ますよw

250:デフォルトの名無しさん
19/04/10 08:51:10.36 1CG1Z7Gt.net
bashの算術計算で小数を使う方法ってないです?
+=で加算したいんですが

251:デフォルトの名無しさん
19/04/10 12:14:47.90 sSiaigIF.net
>>250
それ俺も欲しいんだよね。
前にやった実装は、小数点以下2位固定だったから
1.23 を 123 にして計算してから、後ろ2桁の間にドットを入れて対応したけど
小数点以下の桁数が1.2とか1.234とかだったら面倒なんだよね。
bcコマンドとか呼び出せば簡単なんだが。

252:デフォルトの名無しさん
19/04/11 17:03:23.97 bMTFn+JP.net
exec 3>&1; exec >&-; exec >&3
たまにこんなのを見ますがこれはどんな時に使うんです?
ファイルディスクリプタ自体は理解しましたがfdの複製や切り替える目的が分からなくて
cmd 2>err.txtは意識せず使えてますが

253:デフォルトの名無しさん
19/04/11 17:46:50.14 cVfQRf/N.net
>>252
不勉強なんで「3」ってfdは知らないんだけど、「>&」ってリダイレクトを
使うと書き込みじゃなくて切替になるんだけど、これを使うとエラー
出力を標準出力に切り替えて標準出力で両方の出力を得たりする
ことができるです
「Command > FileName 2>&1」ってするとエラー出力の内容が標準
出力になってFileNameに両方の内容が書き込まれる
逆に「Command 2> FileName 1>&2」ってすると標準出力がエラー
出力になっるので、エラー出力でFileNameに書き込むことが出来る
で、何に使うのかっていうと、「grep」なんかは検索結果は標準出力に
でるけど「指定されたのはディレクトリだよ」みたいなメッセージは
エラー出力に出される
両方の出力をみて処理したいとかの時にはこれで切り替えて標準
出力の内容を変数に保存しておいて処理するとかに使うです
例が雑でわかりにくいかもだけど、エラーと通常の出力を同じ出力で
使う方法ってことで、あとはスクリプトなんでアイデアしだいなんで

254:デフォルトの名無しさん
19/04/11 23:20:48.83 smzX9gsy.net
>>252
URLリンク(tldp.org)

255:デフォルトの名無しさん
19/04/12 00:07:43.92 XpqpR76r.net
>>252 はリダイレクトを知りたいんじゃなくて、fd=1 を 3 にコピーして 1 をクローズして再度 3 から 1 にコピーする意味
が何なのかを質問しているんだと思う。
結局もとのファイルに繋ぎなおすだけだよね。
一旦クローズするから flush されるとか?ならわかるんだが、実際どうなのかわからん。

256:デフォルトの名無しさん
19/04/12 00:45:21.11 L59U/aC1.net
ファイルディスクリプタに関しては
逆引き辞書が必要なんだと思う
○○をしたい時 → こうします。っていうやつ

257:デフォルトの名無しさん
19/04/12 03:08:23.09 WO5SLys3.net
ファイルディスクリプタ(FD) 3番からは、システムが使うけど、ユーザーも使うことができる。
FD0 : 標準入力、FD1 : 標準出力、FD2 : 標準エラー出力
端末に、ls と打つと、
1. シェルが、lsコマンドのプロセスを起動して、それに、FD0~2 を渡す
2. lsプロセスは、FD3 を使って、ファイル一覧を作って、FD1 に出力する
主なFD3 の使用方法は、標準入力を、ファイル・キーボードの2つで、切り替えて使いたい時
標準入力をファイルからにすると、キーボード入力が出来なくなるため、
一旦、標準入力(FD0)をFD3 にして、ファイルから入力して、済んだら元に戻す
こんな事を一々、シェルスクリプトでやるよりも、Ruby でやればよい。
FD何番を使っているとか、意識せずにすむ

258:257
19/04/12 04:14:55.73 WO5SLys3.net
exec 3<&0 < a.txt # FD3 から入力
while read LINE
do
echo "--- ${LINE} ---"
done
exec 0<&3 3<&- # 標準入力を元に戻し、FD3 を閉じる
# 上のようにも書けるが、下の方が、標準入力のファイルディスクリプタ(FD)0 をいじらないので、安全
exec 3< a.txt
while read LINE 0<&3 # FD3 から入力
do
echo "--- ${LINE} ---"
done
exec 3<&- # 閉じる
「UNIX シェルスクリプト・コマンドブック 第2版、山下哲典」の、exec の説明の所に書いてある。
第3版には載っているかどうか、知らないけど

259:デフォルトの名無しさん
19/04/12 13:25:25.09 L59U/aC1.net
もう少しまともに説明できるやついないのかな・・・

260:デフォルトの名無しさん
19/04/12 13:27:28.90 I415couP.net
宿題は自分でやろうな

261:デフォルトの名無しさん
19/04/12 16:22:09.16 zYICSkfs.net
CTRL+Cのトラップについて教えて
以下のスクリプトの時、実行してすぐにCTRL+Cを押すと
#!/bin/sh
set -e
sigint() { echo sigint; }
trap 'sigint' INT
#trap 'echo $?' EXIT
sleep 10
こんな感じでバラバラなんだけどさ
dash・・・トラップできない。終了コード130
(ただしコメントアウトしてるEXITのtrapを有効にするとトラップできる)
bash・・・トラップできる。終了コード130
zsh・・・トラップできる。終了コード130
ksh・・・トラップできない。終了コード130
(コメントアウトしてるEXITのtrapを有効にすると258と表示される。トラップできず)
mksh・・・トラップできる。終了コード0
(コメントアウトしてるEXITのtrapを有効にすると0と表示される。トラップできる。)
posh・・・トラップできない。終了コード130
(ただしコメントアウトしてるEXITのtrapを有効にするとトラップできる)
yash・・・トラップできる。終了コード130
(コメントアウトしてるEXITのtrapを有効にすると386と表示される。トラップできる。)
なんでこうなって、どれが正しい動きで、どれでも同じ動きさせるには、どうすりゃいいの?

262:デフォルトの名無しさん
19/04/12 16:46:27.11 2vVcl4ag.net
宿題は自分でやろうな

263:デフォルトの名無しさん
19/04/13 06:04:26.25 blG/UTRx.net
Ruby では、カスタムハンドラを定義した場合、終了しない。
デフォルトのままなら、Ctrl+C で終了する
つまり、デフォルトハンドラから、カスタムハンドラへ付け替えたため
sleep 7 #=> ここではデフォルトハンドラだから、Ctrl+C で終了する
previous_handler = Signal.trap( :INT ) do
puts "シグナルハンドラへ入った!"
end
print "previous_handler = "
p previous_handler #=> "DEFAULT"
sleep 7 #=> ここでは、カスタムハンドラへ付け替えたので、終了はしない

264:デフォルトの名無しさん
19/04/13 06:40:14.96 mImzJn5T.net
それはシェルスクリプトも同じだろうな。上の終了しているのは set -e しているからじゃないのかな
シェルスクリプトは子プロセスを起動していてシグナルを受けるのが子プロセスでが多くタイミング的に~以下省略

265:デフォルトの名無しさん
19/04/13 07:34:12.37 bIdtQ5MW.net
> set -e しているからじゃないのかな
それをわかってるから、サンプルコードにも入れてるんだけどねw
問題はそこじゃなくて、なんでシェル毎に挙動違うんだよ!?
どれが正しいんだよ!?という話なわけで

266:デフォルトの名無しさん
19/04/13 07:57:58.58 i5T2wQ7z.net
CTRL-Cを入力するタイミングが下手すぎるって話だろ
まさか手入力じゃあるまいな?

267:デフォルトの名無しさん
19/04/13 08:08:06.94 bIdtQ5MW.net
>>266
手入力しないでやる方法を教えてくれ!

268:デフォルトの名無しさん
19/04/13 08:08:38.43 bIdtQ5MW.net
いやkill使うのは知ってる。それをどういう風に使えば、
手入力と全く同じことを再現できるのかという話だ。

269:デフォルトの名無しさん
19/04/13 08:12:44.72 bIdtQ5MW.net
2つの端末を使って一方で実行してから
もう一方で(手入力で)実行するっていうのは
結局手入力してるのと変わらないし、
1つのスクリプトでkillすると、
それこそわけわからんことになる。
イベントハンドラ内でkillするか、違う場所でkillするか
シェルによって挙動が違う

270:263
19/04/13 08:51:59.71 blG/UTRx.net
Ruby では、
previous_handler = Signal.trap( :INT ) do
puts "シグナルハンドラへ入った!"
end
print "previous_handler = "
p previous_handler #=> "DEFAULT"
# 自プロセスへシグナルを送ると、カスタムハンドラが呼ばれるが、終了はしない
Process.kill :INT, Process.pid
Signal.trap( :INT, previous_handler ) # 元のハンドラへ戻す
sleep 7 #=> ここでは、デフォルトハンドラへ戻したので、Ctrl+C で終了する
「改訂2版 Ruby逆引きハンドブック」では、もっとややこしい記述をしてる
シグナルハンドラはグローバルだから、
他のスレッドに変更されないように、Mutex で排他制御してる

271:263
19/04/13 09:02:30.89 blG/UTRx.net
シングルスレッドでは、sleep 7、としてる間に同時に、
Process.kill :INT, Process.pid
と、自プロセスの命令を実行できない
マルチスレッドなら出来るのだろうが、マルチスレッド・プログラミングはややこしい!

272:デフォルトの名無しさん
19/04/13 09:27:42.11 bIdtQ5MW.net
>>271
マルチスレッドのほうが楽だな。
それらをマルチプロセスでやってくれ。
子プロセスは自分で作成したものだけじゃなくて
既存のプログラムも使い、バックグラウンドプロセスも使ってみること

273:デフォルトの名無しさん
19/04/13 09:36:25.97 bIdtQ5MW.net
zshの謎な挙動はこれが原因か?
URLリンク(fumiyas.github.io)
> でました、zsh の非互換! zsh はシグナルハンドラー※内で終了すると、 EXIT ハンドラーを実行してくれません。酷い。 (※この例では SIGINT のデフォルトのシグナルハンドラー)
> こんな感じで bash, ksh, zsh には微妙な動作の違いがあったりするので、 ちょっと変わったことしようとするときは特に注意しましょう。

274:デフォルトの名無しさん
19/04/13 09:39:48.45 bIdtQ5MW.net
読みづらいなw
$ zsh -c '
atexit(){ echo "Bye!"; };
trap atexit EXIT;
trap "trap - EXIT; atexit; exit -1" TERM;
kill -TERM $$
'

275:デフォルトの名無しさん
19/04/13 11:31:16.12 6byp94bf.net
全てのシェルで適切に終了処理をするって難しいな・・・

276:263
19/04/13 11:39:28.75 blG/UTRx.net
Ruby で、at_exit に、終了処理を書いておけばよい
シェルスクリプトで、書く必要がない

277:デフォルトの名無しさん
19/04/13 11:55:58.29 6byp94bf.net
時たま出来てしまうゾンビは何が原因なんだろう?
kill -TERM 0 してるから全部死んでくれるはずなんだが・・・

278:デフォルトの名無しさん
19/04/13 11:57:21.41 6byp94bf.net
あ、バックグラウンド処理とかしてる
そしてCTRL-Cで強制終了した時の話
ゾンビだから消せなくて困る

279:デフォルトの名無しさん
19/04/13 13:02:33.69 blG/UTRx.net
ゾンビは、子プロセスが終了して、
OS が、その終了コードをどう扱えば良いのか、わからないから、ひとまず保存している状態
普通なら、子プロセスの終了コードは、親プロセスへ渡されるのかな?
ゾンビが生まれた時に、親プロセスがどうなっているのか?

280:デフォルトの名無しさん
19/04/13 14:09:25.74 mImzJn5T.net
>>265
お前には言ってない
>>266
タイミング的に子プロセスが受け取るのかシェルが受け取るのかってことなんだけどね。コマンドを実行中なのかシェルが実行中なのか
set -e を使うからややこやしい、シグナルの基本をわかってないんじゃないんだろなとしか思えんけど。コマンドがINTシグナルで終了した場合、シェルが擬似的にシグナルハンドラ呼んでるっぽいかな(もしくは自らにINTシグナル出してるのかな?)
何したいのか知らんけど、set -e 使わずに、INTシグナルハンドラでexitすればいいんじゃないの

281:デフォルトの名無しさん
19/04/13 14:29:06.39 6byp94bf.net
>>279
その理屈はわかるんだけどねぇ
まず必ずゾンビになるんじゃなくてたまになる。だからタイミングの問題
CTRL-Cを押した時になる。通常の処理では発生しない。
CTRL-Cのハンドラでは作業ディレクトリの削除を行っている。
ワーカー(& によるバックグラウンド処理)が複数ある。サブシェルを使ってるせいか
同じな名前のプロセスがたくさんいる。ワーカーを生成した後はwait(引数なし)を実行している。
ゾンビの存在は確認しているが、誰がゾンビになったのかその親が誰かはよくわかっていない。
(たまにしかならんので探しにくい)ただし内部で呼び出してるtrやmvがゾンビになったこともある。
CTRL-Cのハンドラでは作業ディレクトリの削除の他、多数生きてるワーカー(労働者)を
皆殺しにするためにジェノサイド(kill -TERM 0)を発動している。
ただし労働者を消した後に、労働者の作業場(作業ディレクトリ)も片付ける
必要があるので自分だけは死なないようにしている。(trap ':' TERM)
実際にはもっと複雑だけど、死なないのは自分だけなはずなんだけどな
バグでゾンビになったこともあるので記憶が曖昧だけど
(バグを修正した今は)zshだけしか発生しなくなっているかもしれない。
もしかしたらzsh内蔵のkillにバグがあって殺す順番とか
子供が生まれるタイミングで発生してるとか?
でもまあなんだかんだでシンプルにしていったら
ゾンビの発生率も下がってきたし諦めるかな

282:デフォルトの名無しさん
19/04/13 14:40:48.63 6byp94bf.net
うーん、おかしい。trってワーカー(バックグラウンドプロセス)の
中で使っているとはいえ、パイプの右側でしか使ってないんだが?

283:279
19/04/13 15:17:27.06 blG/UTRx.net
漏れにも、ゾンビになるプログラムとならないプログラムの、違いがわからない
ゾンビになるメカニズムを検索してみれば?

284:デフォルトの名無しさん
19/04/13 15:21:25.04 6byp94bf.net
「ゾンビになるメカニズム」で検索してみた
管理テーブルにデータが残ってるだけなら
消す方法(もしくは隠す方法)があってもいいと思うんだがねぇ

285:デフォルトの名無しさん
19/04/13 16:27:29.48 i5T2wQ7z.net
>>284
wait()すりゃいいんだよ。
普通はinitが拾ってくれるんだが、誰にでも好き嫌いはあるということだろう。

286:デフォルトの名無しさん
19/04/13 16:33:30.75 mImzJn5T.net
>>280
>コマンドがINTシグナルで終了した場合、シェルが擬似的にシグナルハンドラ呼んでるっぽいかな(もしくは自らにINTシグナル出してるのかな
違うか。control-cでのINTシグナル送るやつの文献ってどこぞにあるかなあ

287:279
19/04/13 17:05:08.41 blG/UTRx.net
Ctrl+C が、子プロセスやパイプラインのジョブグループに、
どのように伝達されていくかとか、難しい

288:デフォルトの名無しさん
19/04/13 17:21:22.57 6byp94bf.net
いろいろ間違っていた。訂正する。
まずCTRL-Cは関係なさそう。実は正常な動作でも(プログラム実行中に)ゾンビができることがあった。
ゾンビができると今は無限ループ状態になるので気づいたが、ちょっと前まではプログラムの構造上、
ゾンビを放置して正常終了していたと思う。zshではあまりテストしていなかったから気づかなかった。
バックグラウンドプロセスが関係あるかないかはよくわからない。
何回か動かしているがバックグラウンドプロセスを使用しない場合は今の所再現していない。
あとなんかWSLとのからみな気がしてきた。
速度が違うから断定は出来ないがLinuxだと再現しない。
今の所、WSL環境にて、zshで、バックグラウンドプロセスを使用し、
その中でパイプを使った処理を行うと、まれにゾンビプロセスができる。

289:デフォルトの名無しさん
19/04/13 17:27:02.88 i5T2wQ7z.net
>>286
シグナル一般の話ではなくてttyの話だったら、詳解Unixに載ってた気がするが、
当然そのくらいは読んでるよね。

290:デフォルトの名無しさん
19/04/13 17:36:42.95 mImzJn5T.net
>>287,289
なるほど
すまん、読んでない。遠い記憶では読んでいたような気もするが忘れたので読んでない

291:デフォルトの名無しさん
19/04/13 17:43:50.87 6byp94bf.net
再現コード出来た。このコード、なにか問題有る?
これをWSL+ZSHで実行すると、人目につかず永遠とbcコマンドで1+1を計算し続け、
CTRL-Cで停止するときにbcコマンド含めたプロセスグループ全体をkillする(はず)
これをやるとbcコマンドがゾンビ化する。(Linuxだとしない)
#!/usr/bin/zsh
int() {
echo kill
kill -TERM 0
echo killed
exit 1
}
trap 'int' INT
trap ':' TERM
worker() {
while :; do
echo '1+1' | bc > /dev/null
done
}
for i in $(seq 16); do
worker &
done
echo wait
wait

292:デフォルトの名無しさん
19/04/13 17:44:42.87 6byp94bf.net
やっぱり詳解Unixは買わねばいかんか・・・

293:デフォルトの名無しさん
19/04/13 17:54:41.69 6byp94bf.net
dash、bashでは再現しない。kshでも再現した。
いずれもWSLのみ。これもうWSLの問題だろ・・・
きっとWSLのバグをzshとkshが踏んじゃったんだな

294:デフォルトの名無しさん
19/04/13 17:55:48.18 6byp94bf.net
これ関連してるのかな?
Why are there many zombie process in windows subsystem for linux(WSL)? How to kill them totally?
URLリンク(superuser.com)

295:デフォルトの名無しさん
19/04/13 18:09:57.29 6byp94bf.net
次のWindows 10のリリースで治ってんじゃないですかねー
もういいか
Zombie zsh processes left behind that consume 8 % CPU each
URLリンク(github.com)
Killing a defunct zombie leaks the zombie process forever
URLリンク(github.com)
URLリンク(docs.microsoft.com)
Fix issue where zombie process may not be reaped and remain indefinitely.

296:デフォルトの名無しさん
19/04/14 14:12:09.49 uU4FE3J6.net
read -r text <<HERE
printf [%s]\n it's a "s'm'a'l'l 'w"o'r"l'd"
HERE
$text
↓出力
[it's]
[a]
["s'm'a'l'l]
['w"o'r"l'd"]
この仕様、うまくすればなにかに使えそうな気がしている。
文法エラーにもならずevalとはまた違った挙動だ。
とゆうかどういう仕様なんだろう?

297:デフォルトの名無しさん
19/04/14 17:50:16.12 21MN1CXY.net
$ cat b.pl
#!/usr/bin/perl -w
print("$_\n") foreach @ARGV;
$ cat c.sh
#!/bin/bash
IFS=+
./b.pl a b c
./b.pl a+b+c
while read -r v ; do $v ; done <<EOF
./b.pl a b c
./b.pl+a+b+c
EOF
$ ./c.sh
a
b
c
a+b+c
./c.sh: 行 6: ./b.pl a b c: そのようなファイルやディレクトリはありません
a
b
c
$ # うん、なかなか面白いね。どうしてこうなるかは man に書いてあるよ。
$ # 簡単に言うと、単語の分割というのは最初に行われるものと
$ # 変数が展開された後に行われるものがあるんだ。
$

298:デフォルトの名無しさん
19/04/15 17:41:03.59 ZXb+3x2v.net
シェルスクリプト(対話操作含め)が実行される手順って結構複雑な割に他の言語よりずっと単純だから
理論から実践(この場合はシステム処理とか?)への、かなり良い足掛かりになるよね。

299:デフォルトの名無しさん
19/04/21 01:20:29.51 Has+aDs1.net
URLリンク(www.sample)
これが書かれたtxtを読み込んでブレース展開して出力する方法ないです?
$ printf "%s\n" < foo.txt
適当にこうやっても上手く行かなくて

300:デフォルトの名無しさん
19/04/21 01:26:56.31 S3Y2FMky.net
ないです

301:デフォルトの名無しさん
19/04/21 01:40:13.99 0pnJkrzy.net
eval $(echo -n 'echo '; cat foo.txt) とか?

302:デフォルトの名無しさん
19/04/21 02:15:47.05 FhppS/ri.net
sh << END
printf "%s\n" $(cat foo.txt)
END

303:デフォルトの名無しさん
19/04/21 02:24:15.12 FhppS/ri.net
echo "printf '%s\n' $(cat foo.txt)" | sh
でよかった

304:デフォルトの名無しさん
19/04/21 08:49:56.51 Hx8930Ug.net
eval 'echo '$(<foo.txt)

305:デフォルトの名無しさん
19/04/21 10:59:40.33 Has+aDs1.net
>>304
内側のリダクレクトが何かと思えば $(cat file)の変形があったとは
複数行も対応してるしこれなら行けそうですわ

306:デフォルトの名無しさん
19/04/21 12:47:47.19 Hx8930Ug.net
ごめん、もうちょっとシンプルに書けた。
eval echo $(<foo.txt)

307:デフォルトの名無しさん
19/04/22 02:03:07.74 KyfckjPA.net
>>306
これいいね!
……正直,実際に使う機会は少なそうだけど
シェルの処理をしっかり把握してないと思い付かない回答。

308:デフォルトの名無しさん
19/04/22 11:54:54.98 c8JzoHXu.net
例えばさ、
bash -n -c 'a=(a b c)'
↑これはbashとして正しい文法だけどさ
sh -n -c 'a=(a b c)'
↑これは文法エラーになるじゃん? 実行していなくても
これみたいに、実行してないのにあるシェルではOKで
別のシェルではNGみたいな文法って他に何かしらない?

309:デフォルトの名無しさん
19/04/22 12:22:26.76 KyfckjPA.net
>>308
君と似た例ではあるが;
$ bash -n -c '%=a'
$ sh -n -c '%=a'

310:デフォルトの名無しさん
19/04/22 15:47:58.78 8XF5nS5J.net
eval 'printf "%s\n" '$(cat foo.txt)
これprintfをシングルクォートで囲まないと改行されないのね
URLリンク(www.sample)みたいな結果ばかりでちょっと悩んだ
zsh使ってないけどこれはforの後の二重括弧に空白が必要だとかなんとか
{には空白がいるのにfor((が通るbashの方が不自然なのか

311:デフォルトの名無しさん
19/04/22 18:28:36.64 i3ajZQCG.net
export -p と export の違いってなに?

312:デフォルトの名無しさん
19/04/22 18:36:38.02 oyNQbI7u.net
\n の処理をだれがいつやらかすのかってとこかな。printfにやらせたいprintfに \n のまま渡さなくてはという感じ
eval printf "'%s\n'" $(cat foo.txt)
eval printf '%s\\n' $(cat foo.txt)

313:デフォルトの名無しさん
19/04/22 23:58:52.60 htDMK2AO.net
そもそもなぜ eval を使うのかというと、コマンドラインの解釈において
ブレース展開がコマンド置換より前だから
コマンド置換してからブレース展開するためには
eval を使って解釈を最初からやり直す必要があるためで
しかしながら printf と "%s\n" にはその必要がないのだから、つまり
printf "%s\n" $(eval echo $(<foo.txt))
でいいんじゃないかな。

314:デフォルトの名無しさん
19/04/23 08:44:15.00 q7kwqzjj.net
ダブルクリックで実行できるのとできないシェルスクリプトの違いって一体
whileとcaseで簡易メニュー作ってたんだけどダブルクリックしても画面に何も出ない上に
起動されたbashがCPUがかなり食ってた
無論端末から実行はしっかり通る
ls結果を外部保存するような単純な奴はダブルクリックでも正常通りなんだけど


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch