TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
Excel VBA 質問スレ Part54
【日本語不自由】Eclipse Pleiades プラグイン
VBSで便利なプログラムを作れスレ 2
エスパーが質問に答えるスレ
Visual Studio 2019 Part4
【Java】DIコンテナって本当に便利か?
C++相談室 part143
Kotlin 4
俺主催囲碁プログラミングコンテスト
Ruby 初心者スレッド Part 63
シェルスクリプト総合 その29
- 1 :2018/09/21 〜 最終レス :2019/05/19
- シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ:
シェルスクリプト総合 その28
http://mevius.2ch.sc/test/read.cgi/tech/1532397676/
- 2 :
- お約束
・特記なき場合、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: http://www.speech-lab.org/~hiroki/csh-whynot.euc)
・POSIXに準拠しましょう
有用なリンクはhttps://en.wikipedia.org/wiki/POSIXにまとめられています。
最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh、次点でDebianなどに搭載されているDash shell
Heirloom sh: http://heirloom.sourceforge.net/sh.html
Dash shell: http://gondor.apana.org.au/~herbert/dash/
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります
Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
- 3 :
- 初心者へのアドバイス
・適した道具を判断するのも頭の重要な使い方。
シェルスクリプトよりもPerlまたはPythonの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらman(1)を引きましょう。
・思い通りに動かないときは、まずはsh(1)の-xオプションでトレースしましょう。
回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに、「そういうのはPerl, Python使え」と回答するのはやめましょう。
安易にPerlやPythonに逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。
- 4 :
- 次スレを立てる時は>>1の本文の先頭に以下を追加して下さい。
!extend:on:vvvvv:1000:512
という注意書きを>>1の先頭に追加してください。
- 5 :
- そして注意書きに従ってください。
…回線切って首釣ってくる
- 6 :
- age
- 7 :
- >>5
ワロタ
つーか今時回線なのかw
- 8 :
- 回線って言葉の定義によるが、今どきの優先での光とかでも回線とは言う。光回線とかね。
- 9 :
- 優先じゃなくて有線
- 10 :
- printfのフォーマットについてなんだけど
printf '%05d' '33' → 00033
みたいなゼロ埋めってどのシステムでもサポートされているのかな。
%5dみたいな記述はPOSIXの仕様書に在ったから確実だけど
ゼロ埋めフラグについて何の言及もしてないっぽいんだよね。
%gとかと違って「実装を要求しない」とも言っていないし。
- 11 :
- あ。自決。
よーく読んでもっつーか普通に書いてあったわ。
- 12 :
- 結論を書いてから死ぬんだ
- 13 :
- 自決か・・・
- 14 :
- >>11
なんて書いてあった?
シェルのバージョンによっては8進数しか
受け付けなかったりするんだよねー
- 15 :
- シェルスクリプトで数値を扱うのがおかしい。シェルスクリプトは文字として認識しているから、もともと数値の取り扱いは気をつけないといけない。
- 16 :
- そんな事言われましても、シェルスクリプトに
数値計算の機能がありますし
- 17 :
- >>16
シェルスクリプトそのものにはもともと計算機能は存在しないよ。
shは計算コマンドでの対応しかできない。
- 18 :
- >>14
なんか勘違いしてね?
俺が言ってるのは0フラグ。
pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html#tag_20_94_13
ちなみにprintf '%b' '\0ddd'はPOSIXでは8進数しか定められてない
のでその「8進数しか受け付けない」システムは正当。
- 19 :
- >>17
$(())があるじゃない
exprやbcはまあコマンドだけど。
- 20 :
- もともと
- 21 :
- 今のシェルスクリプトの話をしろよ
需要に応じて変わるんだよ
- 22 :
- 〃〃∩ _, ,_
⊂⌒( つД´) < ヤダヤダ
`ヽ_ ノ ⊂ノ
ジタバタ
- 23 :
- 昔はよく expr コマンドを使ったものぢゃよ
- 24 :
- exprは(シェルによるけど)grepみたいな正規表現が単語に対して使えるからすごく重宝してた。
でも最近はそもそもそういう非可搬な機能を使うならbashの[[ <str> ~= "/regexp/" ]]でいいやってなってる。
- 25 :
- http://mevius.2ch.sc/test/read.cgi/tech/1535194140/l50
わざわざひと月経ってから重複立てた理由は?
- 26 :
- そっちには特定のOSでしか動かないで存在しないのが入ってるからじゃね。特定のOSの板かスレが相応しいのだろう
- 27 :
- ああ、特定のOSでしかでもないのか。じゃ、すでに専用スレあるのでってとこか。言葉が違うのに混ぜることもないだろしな
- 28 :
- 特定のOS?
- 29 :
- 月経の文字に反応
- 30 :
- 受け取った文字列が想定しているものかを判定する場合で
「特定の種類の文字のみ構成されている」かを調べる方法として
↓こういうのを考えてみた
test "$VAR" = "${VAR#*[^a-z]}"
成功したらVARは[a-z]のみで構成されているということ。
あと一応POSIX 2018にも準拠してる。
grep(1)などを用いて処理するより早いと思うんだが
最近のPCは処理が速すぎて今一違いが分からんw
- 31 :
- case $VAR in
*[^a-z]*) ;; # a-z以外の文字がある
*) ;; # a-zのみで構成
esac
でいいやろ?
置換処理しないから更に速いはず
- 32 :
- foo() {
echo 1
echo
echo
echo
}
a="$(foo)"
echo "$a"
ってやったら、最後に改行がいくつあっても消えちゃうんだけどさ
aに改行ごと入れる方法ない?bash依存なしで
- 33 :
- >>32
a="$(foo; echo @)"
a="${a%@}"
- 34 :
- $ ( a="a,,b,,c"; IFS=","; set -- $a; echo $3; )
b
$ ( a="a b c"; IFS=" "; set -- $a; echo $3; )
c
なんでや?
- 35 :
- なんでやと言われましても…
- 36 :
- 空(くう)を理解出来ないタイプの馬鹿って結構いるんだよな
- 37 :
- スペース か カンマ かによって
挙動が違うっておかしいだろ
- 38 :
- 挙動は同じだけど?
- 39 :
- わざわざそうしてるってなんで理解できないんだろかな
- 40 :
- >>38 と >>39 で矛盾してますけど?
- 41 :
- 同じ挙動してるじゃん?
- 42 :
- >>40
別人だからな。なんで同一視してんのかわからんな
- 43 :
- あぁ、ブラウザで見るとスペースが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 :
- やっぱり、元のヤツか。>>40といい独特というか視野が狭いというか思考理解力が狭いな
>>36が答えでもう終わってるだろうに
- 45 :
- あからさまに挙動見て仕様 理解できないとか・・・
- 46 :
- シェルスクリプトにヒアドキュメントって
"HERE" でも 'HERE' でも変数展開行われないのか・・・
"HERE" は HERE と同じだと思っていた
- 47 :
- なんで展開されると思えるのか、そこが少し不思議
- 48 :
- >>47
シェルスクリプトだけじゃなくて、他の言語も勉強するといいですよ
- 49 :
- >>48
なんで俺に?
- 50 :
- > If no part of word is quoted, all lines of the here-document shall be expanded for parameter expansion, command substitution, and arithmetic expansion.
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04
\HERE とか
HE"R"E とか
""HERE でもいいんだな
- 51 :
- a = <<"EOT"
あ
EOT
Ruby では、" " なら、バックスラッシュ・式展開が使える。
' ' なら使えない
- 52 :
- ヒアの中身の話をしてるんじゃないのか?
なんだかrubyとかやってる人ってとんちんかんな人多いよなあ
- 53 :
- >>47に対して>>48の意味が>>51だったてことだろ。意地はるなみっともない
- 54 :
- >>53
ますます意味不明
なんでルビーがでてくるし?
- 55 :
- あー、もしかして、ヒアドキュメントが
他の言語にもあるって知らない人かな?
もう少し勉強したほうが良いよ
- 56 :
- スレタイ読めない人がいるな
- 57 :
- この件は別に他の言語での知識経験から故にで全然おかしくないだろう
単にそう思ったのはそうだったのかで済む話でしかないだろうに。何を拘っているんだか
- 58 :
- 環境によって頭を切り替えられない馬鹿だという告白ってこと?
それならまあ納得なのだが。
- 59 :
- なにを言っているんだか。単に「よく」調べないで経験則で思い込んでいたってだけだろう。そういう人もいてもおかしくはないだろう
誰かのように、どうも最初から馬鹿にしたいだけなら違うんだろうけどな
- 60 :
- 「普通は」他の言語の知識があるわけで、
他の言語がそうだったから、シェルスクリプトでもそうだと
思ったのに違っていて驚いたってだけの話だろ
なんで言語が変わったら、0から言語仕様を勉強します。
以前の言語の知識は全て捨てて、最初から学び直しますってなるんだ?
文法は「知らない」 or 「間違いなく知ってる」 のどちらかしか無いはずなんです。
「他の言語がそうだったから、同じだろう」なんて思うやつなんてありえないんです。
そう考えてるのか?そんなやついないだろ。
- 61 :
- /\___/\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたはじまった
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\
- 62 :
- たかが>>46の独白(?)に何をそんなに必死になっているんだか
何かが気に食わなかったのだろうな>>46のレスの内容ではなくて
- 63 :
- 1. シェルスクリプトの仕様に文句言われて悔しい
2. 俺にとっての常識が、井の中の蛙だとばれて悔しい
どっちか
- 64 :
- いやいやw君がなんだか。なにその読めなさはwずっと同じ人?
- 65 :
- >>63
3.おまえがバカを晒して悔しい
だろう?
- 66 :
- 俺が>>46なんだが?
- 67 :
- >>66
えーっ、おれが馬鹿を晒してしまったやんけっ
なにを長文で、わかりづらいネチっこい最後の部分。あんたのスタンスなんぞがわかっているのが居るんだからなにをわざわざな...もう
まあ、すまんかった、いろいろと
- 68 :
- >>66
だからだよw
- 69 :
- 理由が書いてないものに意味はないよ。
ばーかばーかっていってるのと同じだからね
- 70 :
- Rubyさいこおおおおおおお
シェルはほろびろおおおお
- 71 :
- やれやれ、延長戦か。昨日ので終わってれば普通のまともな人に見えたのに。
- 72 :
- ジョブって使ったことあります?
fgとかbgぐらいはあると思うんですが、
そういうのってコマンドラインじゃなくて
シェルスクリプトで使うことって考えられますかね?
- 73 :
- 俺はないけど
単に経験が浅いだけかも知れない
ただ,似非の非同期処理として,ネットワーク資源をwgetなんかで取得しているジョブと同時に
その資源に依存しない種々の作業を同時に実行して,
その資源が必要になった段階でwaitコマンドでwgetの終了を待つ,
みたいなことはよくやる。
- 74 :
- USR1シグナルって受け取ったら
trapしてても死んじゃうの?
- 75 :
- いいや
シグナルに対してハンドラが無い場合死ぬのであって、trapしてんだか死なない
- 76 :
- いや死ぬんだが? これ実行してみ
[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 :
- ただの正常終了、main.sh処理全部終わりましたでしょがー
意図した動きになるようには書いてないだけでしょう
- 78 :
- >>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 :
- なにそれ。性根の悪いヤツだな
man bashでwait及びシグナルんとこ読みなさい
- 80 :
- >>79
はいどうぞ。
wait [n ...]
n が与え
られていない場合には、現在アクティブな全ての子プロセスを wait し、 返却ステータスは 0 となります。
疑問点があれば受け付けますよ?
- 81 :
- なんか続きそうでメンドくさくなった
ただの正常終了、「main.sh処理全部終わりました」
だよ。
wait
じゃなくて
until wait
do
:
done
とかだろう。どう意図した動きにしたいのか知らんけど、間違いは
- 82 :
- マジで性根の悪いヤツだった。言ったことやってから言えよな、もう
- 83 :
- > 言ったこと
ってどれ?w
- 84 :
- 「シグナルんとこ読みなさい」だよ。くそがw
よく笑ってるな。まじでなんなん?ただのプライドが高いアレか
- 85 :
- どこまで本気なのかなあ。
小学生が頭の悪そうななぞなぞで得意がってるとか、そういう雰囲気を感じる。
とりあえず
「シグナルで死んだんなら、なんで echo が実行されてんだよ!」
とつっこんでおくよ。
- 86 :
- シグナルで死んでるんじゃなくて全てのプロセスが終了する前に wait から抜けちゃうってことだな。
理由はシグナル受け取っているからだが。
- 87 :
- Ruby のSignal モジュールを使え
割り込み : Ctrl + C
Signal.trap("INT") { |signo| puts Signal.signame(signo) }
Process.kill("INT", 0)
- 88 :
- スレ違い
- 89 :
- ちゅうかお題違い
- 90 :
- for i in *; do
echo "$i"
done
これって必ずソートされるの?
- 91 :
- POSIXでソートすることになってる
- 92 :
- へー、取得したいのは最初の一個だけでいいんだけど、
その最初の一個は、小さいものになるんか
というか、一個だけ取得する速い方法ないかな?
でもソートしてるなら、結局内部で全部読み込むのか?
- 93 :
- へんなの居付いたな
- 94 :
- そりゃ俺が立てたスレだしなー
- 95 :
- ls -1U とか?
- 96 :
- 1.txt, 2.txt, 3.txt と3つファイルがあるディレクトリでecho * したら
これらのファイルがでてくるのに空のディレクトリで、
echo * したら * と表示されるのなんで?
何も表示されないでほしいんだけど、この仕様、なにか便利なの?
- 97 :
- echoがやってるんじゃないし...
- 98 :
- エコーさんはね、もらったものをエコーするだけだってね、ママがいってたの
- 99 :
- cat *
とかで困るだろうに
- 100 :
- echoがやってるかどうかは論点じゃないしw
- 101 :
- いや、重要だぞ。何の man を読めばいいかというのは。読む気があればね。
- 102 :
- それで質問の答は?
- 103 :
- 答えはmanに書いてある。なんでかは「読まなければならない」けど
- 104 :
- >>102
echo は渡された文字列をそのまま出力する仕様なので、* を渡されたら * が出力される。というのが回答だよ。
- 105 :
- まあ、「'*' はいらない」というのももっともなことだしね。
bash を使ってるなら man の「パス名展開」の項を読めばいいかも。
bash じゃない場合は…読めばなんとかなるでしょ。
- 106 :
- いらないからいる(?)になってるんだけどね。それもそうmanに書いてある
- 107 :
- >>104
聞いてるのは仕様ではなくて、
どうしてそうしたかの理由です。
- 108 :
- だからmanに書いてあるってw
- 109 :
- 書いてないから聞いてる
- 110 :
- 書いてあるんだなあ。書いてないんじゃなくて探してないだな
- 111 :
- 最近、無いものをあると言いはるのが増えてるのか?
無いものはいくら探してもないし、
有るならさっと出すことぐらいできるだろ
- 112 :
- なんかいたね、ちょっと前のシグナルの質問してたのとか
煽って自分では労力さかずに答え出させようしてんの?w
- 113 :
- んで答えは?w
- 114 :
- manに書いてあるw
- 115 :
- 書いてない
- 116 :
- マンザイとしてはそれはないな。オモロクないやん、マンザイとして。いい感じだったのにw
その言い張り方が、なんか既視感ありすぎ。そしてよく「言いはるのが増えてるのか」なんて言えるなあ
まあ、ふんわりとした答えは>>99で答えてるんだけどね。それはmanに書いてた説明からだよ
ところでOSなに使ってるの?
- 117 :
- catが困るのは、単にcatの仕様がクソってだけだろう
標準入力から読み込むためのオプションの - があるのに、
引数なしだと標準入力から読み込もうとするわけだから
- 118 :
- 浅いな、catは一例なのに
そのやたらプライド高そうだけど、全然そのプライドを裏付けるもの無いから、こんなことになってんやで?まあ、プライド高いから言ってもわからんだろけど
ちなみに、'*'でなくて''でもよさげなんだけど、'*'の方がやっぱりいいんだな(と、思う。そう具体的に書いてない、''に言及してはいないけど)。さて、どうしてでしょう?
- 119 :
- > さて、どうしてでしょう?
お前にその答えが言えんの? *の方が良いと思ってるようだが、
正確にはディレクトリが空の時に帰ってくるのは、正確には*じゃないんだが
- 120 :
- うん、>>117なんて宣える人にそう言われてたくないけど。やっぱ想像はつかないのね。なのになんで疑われているのかさっぱり。また煽って喋らせる手法?w
正確にはってのはイミフ。なんの正確?なにを言いたいのかイミフだがほぼデフォルトの環境ではそうだよ、てか、そう決められているはずなんだがなあ
- 121 :
- 聞いてるのは、決められているかどうかじゃなくて
なぜそういう風に決めたかだって言ってるだろ
- 122 :
- だいたい、俺の想像していることがわかってない時点で
お前はダメダメなんやで?わかってるか?
俺の想像していることぐらい読み取れ!
- 123 :
- ディレクトリが空の時に帰ってくるのは * ではありません。
echo ? だと ? が帰ってきます。
- 124 :
- echo *[a-z]* だと *[a-z]* が帰ってきますが、
さて、このディレクトリは空でしょうか?
それとも *[a-z]* という名前のファイルがあるのでしょうか?
- 125 :
- だから、なぜそういう風に決められたかっていうことをずーーっと言っているんだけど?
あんたが自分勝手な自分だけの思いで自分の考えに固執してるから先に進んでないんだけなのに。既視感ありまくりw
'*'の方がいいとまでちょっと進んで言っているのに聞かないで反発してるだけだし。答えは書いてある。さあ、理解に向けて進んでみようw
- 126 :
- >>123,124
そりゃそうだ。根本的に勘違いしてる。*なんだから'*'、?なんだから'?'、[a-z]*なんだから'[a-z]*'でしょに。なにを言っているのだか
なんで、ますますプライドを裏打ちするものが無いって自ら開陳するかなあ。捨てなその意味ないプライドは。文字通りプライドが邪魔する(意味が違うか?w)でしょうに
- 127 :
- >>122
あすぺってこういう人のこと言うの?
違う?
- 128 :
- だから答えは書いてないって言ってるだろ
いい加減、悪魔の証明は辞めてくれ。
無いものは無い。無いという証拠を見つけられないなら
悪魔はいるってことだ!←ほんと馬鹿みたいだ
- 129 :
- 答えは書いてあるよ。ふんわりと。あんたに理解できるようには書いてないかもだけどwいや、プライド高いお人だからわかると思うんだけどということでw
悪魔の証明でもなんでもないのになあ。なんとか言わせたくて必死な感じ?通用しないよ何度もはw
- 130 :
- ※書いてないから、言えないのです
- 131 :
- >>127
俺のこと?違うよww わざとやってます。なんかオモロイから
なんで自分の労力を割くのが嫌いなくせに、まわーーーーーり道してんのかなあと。どこまで回り道すんのかなとw
- 132 :
- >>130
そんなあけすけな手にはのらないww
- 133 :
- もうどっちがどっちなのか分からんけど
グロブに関する疑問なら答えられそうなので,
最初の質問を教えてくれ。
- 134 :
- ありゃりゃ。終わっちゃうかっw
親切だな。まあいいことだけど。ヤツにとっていいこととは思えないけど(余計なお世話)
- 135 :
- >>133
>>96が元、(>>105.106からの?)>>107
だよ。それ以外はいらないww(たぶん)
- 136 :
- >>133
echo * (別にechoである必要はない)で
ファイルが見つからない時になぜ * を返すのか?
そういう仕様にした理由
- 137 :
- ありゃ? もうすぐ答え出るかと思ってひとっ風呂浴びてきたんだが
まだでてないや。誰か曰くmanに書いてあるらしいから
知らなくても答える気があるなら、答えられるはずなんだけどなー
な?書いてないだろ?
- 138 :
- そこまで言い張ってあったらどうすの?いやあるんだけど
黙って逃げるだけの未来しか見えないw
- 139 :
- じゃあ先に答えを言ってくれた人へ
ありがとう
これでもう黙って逃げるだけの未来はなくなりました。
- 140 :
- やかましわっ、アホっw
なんでこうも強情というか自信満々なのかなあと、実際にあるのに書いてあるのを知っている方は思うんだよ
で、ここまで強情で自身満々故になのか逃げるだけかというのも透けて見えるんだよ
まあ、>>133のお人が答えてもらえるんだからもっと待ちなさいな
なんでそうも自己都合なんだかw。俺が>>133だったら答えるのやめるw。別に>>133のお人に答えるなとか風なことでではない、あくまでも俺だったらね
- 141 :
- 書いてある内容をコピペすりゃ終わりなのに
長引かせてるのはお前やで?
- 142 :
- そうだよ?言われなくても、そうだよ?(すでに>>131で書いてあるやん?w)
なにを急に言い出してるの?それもあんたも律儀にレスしてんのに
- 143 :
- 自信満々に荒らし宣言w
- 144 :
- いやいや、それを言うならあんたもだって。なんだかなあ。それに俺はちゃんと答えている(ふんわりと)、それにあーだこーだ言っているのはあんたなんですけど?どっちがよりでしょうねえ?
第三者から荒らしと言われてもしょうがないかと思うが、あんたが言い出すとは、まあ、先の「言い張る〜」と同じパターンやね
てかさ、せっかく>>133が出てきたのにそうやってなぜ流すようなことすんの?w
- 145 :
- >>133
待ってますよ
- 146 :
- >>133
まだですか?
- 147 :
- 横からだけど面倒臭いから答えを書いとくよ
bash なら man bash の Pathname Expansion に書かれてるから、それをちゃんと読んでから質問してね。
- 148 :
- >>147
そこに「なぜ*を返すことにしたのかという理由」は書いてないって言うのが面倒だから、ソースとGoogle翻訳貼り付けるわ
https://git.savannah.gnu.org/cgit/bash.git/tree/doc/bashref.info#n2116
*パターンマッチング::シェルがパターンをどのようにマッチングするか。
単語分割後、 '-f'オプションが設定されていない限り(* Set The Builtin::)、Bashは各単語をスキャンして文字 '*'、 '?'、および '['を探します。
これらの文字の1つが現れると、その単語はPATTERNと見なされ、パターンと一致するファイル名のアルファベット順にソートされたリストに置き換えられます(* Pattern Matching::)。
一致するファイル名が見つからず、シェルオプション 'nullglob'が無効の場合、単語は変更されません。
'nullglob'オプションが設定されていて、一致が見つからない場合、その単語は削除されます。
'failglob'シェルオプションが設定されていて、一致するものが見つからなかった場合、エラーメッセージが表示され、コマンドは実行されません。
シェルオプション 'nocaseglob'が有効になっている場合、アルファベット文字の大文字と小文字を区別せずに照合が実行されます。
パターンがファイル名展開に使用されるとき、文字 '。' シェルオプション 'dotglob'が設定されていない限り、ファイル名の先頭またはスラッシュの直後に明示的にマッチしなければなりません。
ファイル名 '。' 'dotglob'が設定されていても、 '..'は常に明示的に一致しなければなりません。
それ以外の場合は、「。」 文字は特別扱いされません。
ファイル名を一致させる場合、スラッシュ文字は常にパターン内のスラッシュと明示的に一致させる必要がありますが、
他の一致コンテキストでは、後述のように特殊なパターン文字と一致させることができます。
- 149 :
- nocaseglob'、 'nullglob'、 'failglob'、および 'dotglob'オプションの説明については、* note The Shopt Builtin ::の 'shopt'の説明を参照してください。
'GLOBIGNORE'シェル変数はパターンにマッチするファイル名のセットを制限するために使用されるかもしれません。
「GLOBIGNORE」が設定されている場合、「GLOBIGNORE」のパターンの1つとも一致する各一致ファイル名は、一致リストから削除されます。
'nocaseglob'オプションが設定されている場合、 'GLOBIGNORE'のパターンとのマッチングは大文字小文字の区別なしに実行されます。
ファイル名 '。' 'GLOBIGNORE'が設定されていてヌルでない場合は、 '..'は常に無視されます。
ただし、 'GLOBIGNORE'をNULL以外の値に設定すると、 'dotglob'シェルオプションが有効になるので、他のすべてのファイル名は '。'で始まります。 一致します。
'。'で始まるファイル名を無視するという古い動作をするには、 '。*'を 'GLOBIGNORE'のパターンの1つにします。
'GLOBIGNORE'が設定されていない場合、 'dotglob'オプションは無効になります。
- 150 :
- 存在する機能の説明なのでその機能について説明しているだけかなと
- 151 :
- 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 :
- なぜかは、
だいたいは、こんな感じ(だろうで)、
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 :
- >>152
誤 warn("%s", arg);
正 warn("%s", argv[1]);
- 154 :
- >>152
それどれもエラーになってますよ?
- 155 :
- エラーだもの。「エラーの方がわかりやすく」ってとこ?すまん変な文になった
そのままの方がわかりやすく(?)
かな。
- 156 :
- >>152
> そこにあるキーワードで別のmanがググれるよ
今度は、どのmanですか?
- 157 :
- ああ、「どれがエラーとして適切?」もか。「どれもエラーだがどれが適切?」というつもりだったんだが。「どれもエラーだがどれがエラメッセージとして適切?」までか
- 158 :
- >>156
今度はという意味がわからんが、
man 「キーワード」
でググってみ
- 159 :
- てか、またおまえか?いちいち教えてもらったのに文句つけてるんだなw
- 160 :
- >>157
for i in *.txt; do rm "$i"; done
(すでに拡張子txtのファイルが全て削除されている場合)
rm: '*.txt' を削除できません: そのようなファイルやディレクトリはありません
これは適切なエラーメッセージだと思いますか?
- 161 :
- >>158
なんで「キーワード」というふうに隠すんですか?
キーワードの中身を書きましょうよw
- 162 :
- >>152の最後に書いてあるだろう。なんでいちいちいちいち教えなきゃならんのねん
コマンドとしては適切だろう
- 163 :
- >>161
いちいち教えてもらわなきゃならないのに、隙あらば文句つけるようなヤツに丁寧に教える必要はないってことだよ。社会的に一般的なことだなw
まあ、もともとはあんたに具体的に教えたくないから、あんたじゃない人に他にあるよと言ってみただけだな
てか、ぜんぜん進んでねーな。こんなやりとりしてもぜんぜん進まないよ?少しは頭を働かせて自力でやってみなさいな
- 164 :
- 1. man bashにある
2. ありませんでした。
3. 他のmanにある
4. ありませんでした。
この流れか
- 165 :
- 日本語に訳してあげないと、書いてないことを認めなかったくせに
何言ってるんだろうね。
- 166 :
- マジで「読めない」のな...どうしようかw
- 167 :
- >>165
なにをおっしゃってるんですか?すごいな、いやすごい
な?全然進まんだろ?w
- 168 :
- お前が出てくるといつも進まんよなw
- 169 :
- あんたが進まなだけだからな、別にあんたが進まないのは俺はどうでもいいんだけど、なにか進みたがってるあんたがどう動くのかが興味ありの
なんで俺にいちいちレスしてんの?w
- 170 :
- > なんで俺にいちいちレスしてんの?w
お前が言ってることが嘘だからだよ。
manにそういう仕様にした理由は書いてませんでした。
- 171 :
- 知らないなら、素直に知らないって言えばいいのに
- 172 :
- ちょっとは進んで(ID:3hZl3Wdo がヤツだとは思わなかったのでw)、>>152を書いてみたが、ヤツはやっぱり聞かないだけだったという
俺は単に最初からmanにあるとしか言ってない、man bashに言及してるのはあったけど(>>105ですでになのに、なんでいまごろなんだ?)、まあそこからでもたどり着くかなとw
>>164なんてお前の勝手な妄想解釈。あるよ本当に
(「言っちゃった」とちょっと悔しくもある。また、「言っちゃった」のになんで探せないないねんwwwここまで言えばさすが自分で探すか?)
- 173 :
- 探せたか?wwまあ、探せても「読めない」可能性が高いかな
・やっぱり、探せない
・探せたが、読めなくて文句つける
・探せて、黙って逃げる
・他
どれでしょう。まあこう書いたら「他」にする可能性が高いか
- 174 :
- > なんでいまごろなんだ?
>>105の「パス名展開」の項にないのはわかっていて、そこにないと言ってるのに
性懲りもなく、>>147で「bash なら man bash の Pathname Expansion に書かれてるから」と
いうから、こいつ読んでないなってことで日本語に訳してあげたんだろ
そして
> ファイルが見つからない時になぜ * を返すのか?
> そういう仕様にした理由
は、そこに書いてないと同意取れたはずだが?
なんでそんな説明をせにゃいかんのよ?
- 175 :
- 「性懲りもなく」...「訳してあげた」んだろ
すんげええなあ、今までさんざん無能っぷりを自ら披露しているのにw 単によくレスを見なかった人がと考えはしないのね。自分がレスをよく見ないくせにw
お前のレスはぜーーーーんぶ自分内で完結している。こんな他人と交わらない方がいいんじゃないの?
呆れ果てるな。まあ、その自己の世界で妄想ダダ漏れすればいいと思うよ
- 176 :
- ↑ほらな。俺の言ったことを否定したいだけw
- 177 :
- そりゃ、否定するよ。矛盾自己肯定だらけだもの
もしかして、あんたって40超えたおっさんで外人にクソガキ呼ばわりされたことない?って気になったり。まあ、違うかw
- 178 :
- >>117
40超えたおっさんにクソガキ呼ばわりでもされたか?w
- 179 :
- >>117 じゃなくて >>177
- 180 :
- いや、そういう(一部で有名な)有名人がいてな、あんたの属性が似すぎててな。幾つかは知らんが、あんたもそのうちそうなるだろうな
年意外同じだからw 年取ればそれが変わるわけでもないぞw
- 181 :
- 嫌いなやつはみんな一緒。思考回路が単純(笑)
- 182 :
- イミフ。なんで「嫌い」とかアホなこと言っているのだか。人のふり見て我がふり直すとかあるでしょ?そういう意味だよ、そういう有名人
誰ともわからないハズなのに「嫌い」とだけの理由にできるとは...さては...ww
- 183 :
- はいはい。話戻すぜ。
ファイルが見つからない時になぜ * を返すのか?
そういう仕様にした理由
^^^^^^^^^^^^^^^^^^^^^^
manに書いてあるそーです。やつのたわごとを信じる人は
(ネットじゃなくて)manの中から探してみてください。
信じない or 信じたけど裏切られたら、
ここにmanの場所が書かれることはないでしょう(予言)
- 184 :
- ・やっぱり、探せない
か... うん、なんかよかったww
じゃ、がんばれよ
- 185 :
- >>184
安心しろ。俺以外の人も見つけられない。
だからここに俺とお前以外の人間が書くこともない。
俺が言ってることが正しければな(笑)
- 186 :
- ほんと「読めないのな」。よかったはそういう意味じゃない
わざとかと思えなくもないけど、いままでの「読めなさ」からはわざとではないとしか思えない
どう見ても、お前の都合のよいことだな、さすがだよ
場所のレスもらえればお前がいままで知りたかったことがわかり、黙って逃げるだけw(そこにお前の苦悩とかなさげ)
もらえなかったら、お前の中では自己肯定の補強にになるだけとういう。間違いでもな
しょうがないな、1ヶ月後に教えてやるよw何もなかったら1ヶ月後に、この話題はw
- 187 :
- なんなら一年後でいいんやで?w
- 188 :
- イミフ。下衆い意味で言っていそうではあるがwじゃ、適当な時にな
- 189 :
- それまで別の話題でお会いしましょう(笑)
あ、他の人、manにないのは明らかなんで探さなくていいですよ〜w
時間の無駄でしょうし。
- 190 :
- __ - ____ ________ - ___
- 191 :
- >>136
bashがそういう仕様にした理由は, shにあわせたからです.
shがそういう動作をする理由は, expand()が0をかえしたときはもとの引数文字列でmakearg()するようにつくられているからです. おそらく, そういう仕様をきめてからそういう動作をさせたわけではないとおもいます.
- 192 :
- ようやくまともなレスがw
>>191
その動き(expandやmakearg)はソースコードから?
補足しておくと俺は「"bashは"なぜそうしたのか?」とは
聞いてなくて、シェルスクリプト(元をたどればsh?)が
どうしてそういう動作をするのかの理由を聞いてる。
で、それは特に理由はないのかな?たまたま最初の実装した人が
あまり考えず、そうしましたぐらいの理由で。
だから理由を探しても見つからないと
- 193 :
- まとめ
for i in *.txt; do
echo "$i"
done
何もファイルがないディレクトリで↑を実行すると
「*.txt」 というファイルが見つかったかのような動きをします。
「*.txt」というファイルだけがあるディレクトリで実行すると
全く同じように「*.txt」 というファイル名が表示されます。
つまり空ディレクトリでも「*.txt」というファイルがあっても
表示結果が全く同じになります。これは驚き最小の原則に反しています。
- 194 :
- https://linuxjm.osdn.jp/html/LDP_man-pages/man7/glob.7.html
- 195 :
- の、POSIXのところは
http://pubs.opengroup.org/onlinepubs/009695299/functions/glob.html
GLOB_NOCHECK
かな?オプション名が意図不明だが説明文からは
- 196 :
- >>194
これを読んでも同じ結論になるわけだけど
> 先に与えた、わかりやすく簡単なルール、 「ワイルドカードパターンをマッチしたパス名のリストに展開する」と言うのは、
> オリジナルの UNIX における定義であった。 これはパターンが空のリストに展開されることも許可されていた。 例えば
略
> において、*.gif ファイルが全くない場合でも、 これは空のリストに展開されるため、エラーにならない。
> しかし POSIX では、文法的に正しくないパターンや、 マッチがなかったパターンは、 そのまま変更されずに残されることになっている。
なぜ、わかり易く簡単なルールを捨てて、POSIXでは「そのまま変更されずに残されることになっている。 」を
選んだのかが書かれてないんだよね。
- 197 :
- ・探せたが、読めなくて文句つける
か... 探してじゃなくてっぽいけどw
書いてあることが。読めれば」>>152もわかるだろうに。どういう意味で言ったかわからん最小の原則wとかやらにあっているだろう
まあ、単に「認めたくない」だけだろな
何か他にファイルなどがあるとこで、*.hogeなんてファイルがなかったとしよう、
ls *.hoge
でどう動くのが望ましい?この例「だけ」に噛み付くのじゃなく、ちゃんと頭を使って考えような
- 198 :
- >>197
1. 見つからない場合はエラーとなってls自体が実行されない
2. ls "" とみなされる
のどちらかだろうな。
次はあんたが、頭を使ってレスしてくれなw
- 199 :
- >>197
ついでだから、ファイルが見つからない時
for i in *.txt; do
echo "$i"
done
はどう動くのが望ましいか書いてくれよ。
今の動きや仕様を書くんじゃなくて
どう動くのが望ましいかをね
- 200 :
- ほんとに脊髄だけで、頭使わないのな
POSIXはシェルスクリプトだけを考えてるわけではないのだよ
ls *.a *.c *.c
で、どれかがあってどれかが無い場合の動作は?よくそれで頭使ってる風に言えるもんだ。
- 201 :
- > で、どれかがあってどれかが無い場合の動作は?
>>198に書いたとおり
- 202 :
- Ruby のglob を使った方が、バグらないので良い!
- 203 :
- 空のディレクトリで実行するとこうなるのかw
$ ls *.a *.c *.c
ls: '*.a' にアクセスできません: そのようなファイルやディレクトリはありません
ls: '*.c' にアクセスできません: そのようなファイルやディレクトリはありません
ls: '*.c' にアクセスできません: そのようなファイルやディレクトリはありません
- 204 :
- 多分あいつは、
> この例「だけ」
のことしか考えてない予感がするなw
- 205 :
- >>202
そうだね。ファイルが見つからないときは
ちゃんと空のリストを返してくれる。
シェルスクリプトのように、「*」を返すことはないね。
irb(main):001:0> Dir.glob('*')
=> []
- 206 :
- ID変わったけど、俺が ID:8H4AhNTa な
- 207 :
- まだ、ゴネてる。自分の思ったようにならないってだけでよくそれだけ粘れるな
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 :
- >>207
この質問は無視?
for i in *.txt; do
echo "$i"
done
はどう動くのが望ましいか書いてくれよ。
- 209 :
- >>207
やっぱりlsの例だけしか考えてないようだね
- 210 :
- その例だけなら、回らないのが望ましいだろな。だが、POSIXはシェルスクリプトだけを考えてるわけではないからしょうがないうちだろな
で?
- 211 :
- >>209
何を言いたいのかわからんな。どゆこと?まさか「正確」と同じパターンじゃないよな?その気しか思えないので具体的に言って
- 212 :
- ついでにPHPの場合
$ php -r "print_r(glob('*'));"
Array
(
)
Perlの場合
perl -MData::Dumper -e 'print Dumper [glob "*"]'
$VAR1 = [];
Rubyと同じく、見つからない場合は
デフォルトでは空のリストが帰ってくる。
- 213 :
- >>210
さっきから
> POSIXはシェルスクリプトだけを考えてるわけではないから
を繰り返してるけど、シェルスクリプト以外とは何の話をしてるの?
そして、シェルスクリプト以外ではどうだって言いたいの?
- 214 :
- >>211
だからお前、"lsの場合では" *だったらエラーがわかりやすいって言ってるだけじゃん。
forの場合では、当てはまらないじゃん。
- 215 :
- >>213
マジか...
- 216 :
- >>215
逃げるなよ
- 217 :
- >>214
ああ、なんだ「シェルスクリプト」の(それも特定な)場合か。「ls」なんて言ってるから他のコマンドとかと思ったぞ
POSIXはシェルスクリプトだけを考えてるわけではないからw
話にならない、POSIXを勉強して出直してね
- 218 :
- C言語めんどくせーなーと思ったら、サクッとソースコード見つかった。
https://qiita.com/sassy_watson/items/03c16bd03b56e5579477
↑のコードの ./*.txt を * に変換したけど、
やはり、空のディレクトリで * と表示されることはなく
何も表示されなかった。
POSIXってほんと何を言いたいんだろう?
- 219 :
- >>216
逃げるも何も「文句をつける対象を理解してない」のにどう相手をすれと?あんたにこれ以上こまごまこまごま教えてなきゃならんのか?
だったら、逃げるよ
- 220 :
- POSIXはシェルスクリプトだけを〜とか、じゃあC言語のことなんですかねぇ
でもC言語でも空のディレクトリで * が返ってくることはないし
ほんと何が言いたいんだかw
- 221 :
- POSIXはシェルスクリプトだけを考えてるわけではないから
→ Ruby・・・空の配列を返す
→ Perl・・・空の配列を返す
→ PHP・・・空の配列を返す
→ C言語・・・空の配列を返す
シェルスクリプト以外は空の配列を返します。
- 222 :
- >>218,220
はあ...最後な
>>194,195をよーく読め。なんでそれがbashでになってるのかも
- 223 :
- 以後、脊髄反射マンと呼ぶからなw
- 224 :
- >>222
またそれか。よく読んでも、そうした理由は書いてない。
- 225 :
- >>223
脊髄反射マン必死だなw
- 226 :
- 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 :
- >>225
モロ体現してありがたい。オモロイなあんたは
- 228 :
- >>226
何度も言ってるが、
俺が聞いているのは、そういう仕様にした"理由"であって
仕様の場所は聞いてはいない。
ほんと、脊髄反射しかしねーなw
- 229 :
- >>228
言っているけど。「読めれば」そう書いてあるんだけどな。「読めない読めない」言われてもしょうがない
あんただって、「空」だったらマズいときもあるって認めてるやん
本当にただただ「認めたくない」だけなんだな。その「コロ」っとあんたの原点に戻るあたり
まあ、がんばりや
- 230 :
- そして面白いのが、シェルスクリプトは glob で見つからない場合に
検索パターンを返すのに対して、シェルスクリプト以外では
見つからない場合に、空のリストを返すって所だな。
- 231 :
- >>229
お前、マズイときもあるし、マズくない時もあるって
自分で認めてるやんw
ということはお前の主張は、所詮マズイときの例でしかなく
マズくない時には当てはまらないってことになるんだぞ
わかってるのか?お前の主張が崩れてるの
で、シェルスクリプト以外は空のリストを返しているのに
シェルスクリプトだけは、見つからなかった時に * という
文字列を返すという仕様にした理由は?
- 232 :
- 結局、一番マトモな理由は >>191が書いた
> おそらく, そういう仕様をきめてからそういう動作をさせたわけではないとおもいます.
これだけなんだよな。特に理由はない。
(深く考えずに)そうしてしまった。
もちろん、正式なドキュメントとして
この理由が、書かれている文書は見つかってないがね。
- 233 :
- あ、みなさん。もし ID:b0dEtQwc を擁護したい人がいるならば
ID:b0dEtQwc が示したドキュメントの中から、
「そういう仕様にした"理由"」を書いてある所を指摘して構わないんですよ?
ないでしょう? 誰も指摘しないもんね。それが証拠だよ。
- 234 :
- 何言っているの?
>この仕様、なにか便利なの?
が、お前の原点だろ?それ以後「認めなたくない」のであーだこーだ言っているだけだな
- 235 :
- とうとう誰とも言えない人に頼るようになったか...ww
- 236 :
- >>234
ちゃんと流れを読むように
107 自分:デフォルトの名無しさん[sage] 投稿日:2019/04/04(木) 17:59:04.72 ID:opkeFDjY [4/21]
>>104
聞いてるのは仕様ではなくて、
どうしてそうしたかの理由です。
- 237 :
- >>236
流れというかレスを読めないあんたに言われたくないw
いや、原点の話でしかないな。あんたの都合に(それもあんたの都合の良いようになだけな)合わせる必要性はこれっぽちもないな
とりあえず、原点の問題は解消した&マズい場合もあるそれが理由ってことも解消したってことで、おしまい
- 238 :
- https://linuxjm.osdn.jp/html/LDP_man-pages/man7/glob.7.html
> において、*.gif ファイルが全くない場合でも、 これは空のリストに展開されるため、エラーにならない。
> しかし POSIX では、文法的に正しくないパターンや、 マッチがなかったパターンは、 そのまま変更されずに残されることになっている。
> bash では、次のコマンドで昔からの振る舞いに設定することができる。
>
> shopt -s nullglob
なぜ昔からの振る舞いから替えたのか?その理由が謎
(理由を明確に述べているドキュメントがない)
- 239 :
- >>237
おしまいなんで、あんたは消えていいです。
1ヶ月後にちゃんと答えてください(笑)
- 240 :
- > POSIXはシェルスクリプトだけを考えてるわけではないから
↑これも結局何が言いたいのか不明だったな
まあ、何も考えずに(調べずに)シェルスクリプト以外の言語でも
* を返してるはずだって思い込んだんだろうなw
(実際には見つからない場合は空のリストを返します。)
- 241 :
- なにか勝ち誇って妄想全開のようだが、全然違う
>>195をよく読もうな。>>226と注目すべきとこあげたのに
他の言語でもglobなんて自ら実装したりはしないんじゃないの。単にそのオプションがデフォルトでは設定されていない、オプションが設定できるのは設定すれば同じになるんじゃないの。妄想お疲れさん
- 242 :
- > POSIXはシェルスクリプトだけを考えてるわけではないから
↑これで何が言いたいのかを書けば済む話
それが出来ないのはなぜだろうw
- 243 :
- あ、ちなみに「注目すべきとこ」には何も書いてませんよ。
いつもどおりです。
- 244 :
- ほんとーーにっ、「読めない」のな、この脊髄反射マンっw
- 245 :
- 読めないって言わずに、具体的に引用すればいいだけなのに
それをしないのは、結局引用する場所がないからなんだよね
- 246 :
- 「無い」から「引用できない」に変わったけど、同じパターンやな。そして前言はなかったことにという前々からの同じパターン
- 247 :
- >>246はとりあえずレスしてみましたってだけで
中身がなにもないことに、皆さん気づきましたか?
- 248 :
- なんか少しは自分を見直すとかあって、ここでもこんなクソ(俺のも含めて)なレスの応酬もなく、見てためになる万人が楽しめるレス、Q&Aになるかと思ったが、無理かやっぱ(偉そう偉そう)
そりゃ無理かっ。なんか急に飽きた、じゃな
- 249 :
- はい、コイツは何度目かの逃亡宣言です。
また懲りずに来ますよw
- 250 :
- bashの算術計算で小数を使う方法ってないです?
+=で加算したいんですが
- 251 :
- >>250
それ俺も欲しいんだよね。
前にやった実装は、小数点以下2位固定だったから
1.23 を 123 にして計算してから、後ろ2桁の間にドットを入れて対応したけど
小数点以下の桁数が1.2とか1.234とかだったら面倒なんだよね。
bcコマンドとか呼び出せば簡単なんだが。
- 252 :
- exec 3>&1; exec >&-; exec >&3
たまにこんなのを見ますがこれはどんな時に使うんです?
ファイルディスクリプタ自体は理解しましたがfdの複製や切り替える目的が分からなくて
cmd 2>err.txtは意識せず使えてますが
- 253 :
- >>252
不勉強なんで「3」ってfdは知らないんだけど、「>&」ってリダイレクトを
使うと書き込みじゃなくて切替になるんだけど、これを使うとエラー
出力を標準出力に切り替えて標準出力で両方の出力を得たりする
ことができるです
「Command > FileName 2>&1」ってするとエラー出力の内容が標準
出力になってFileNameに両方の内容が書き込まれる
逆に「Command 2> FileName 1>&2」ってすると標準出力がエラー
出力になっるので、エラー出力でFileNameに書き込むことが出来る
で、何に使うのかっていうと、「grep」なんかは検索結果は標準出力に
でるけど「指定されたのはディレクトリだよ」みたいなメッセージは
エラー出力に出される
両方の出力をみて処理したいとかの時にはこれで切り替えて標準
出力の内容を変数に保存しておいて処理するとかに使うです
例が雑でわかりにくいかもだけど、エラーと通常の出力を同じ出力で
使う方法ってことで、あとはスクリプトなんでアイデアしだいなんで
- 254 :
- >>252
http://tldp.org/LDP/abs/html/x17974.html
- 255 :
- >>252 はリダイレクトを知りたいんじゃなくて、fd=1 を 3 にコピーして 1 をクローズして再度 3 から 1 にコピーする意味
が何なのかを質問しているんだと思う。
結局もとのファイルに繋ぎなおすだけだよね。
一旦クローズするから flush されるとか?ならわかるんだが、実際どうなのかわからん。
- 256 :
- ファイルディスクリプタに関しては
逆引き辞書が必要なんだと思う
○○をしたい時 → こうします。っていうやつ
- 257 :
- ファイルディスクリプタ(FD) 3番からは、システムが使うけど、ユーザーも使うことができる。
FD0 : 標準入力、FD1 : 標準出力、FD2 : 標準エラー出力
端末に、ls と打つと、
1. シェルが、lsコマンドのプロセスを起動して、それに、FD0〜2 を渡す
2. lsプロセスは、FD3 を使って、ファイル一覧を作って、FD1 に出力する
主なFD3 の使用方法は、標準入力を、ファイル・キーボードの2つで、切り替えて使いたい時
標準入力をファイルからにすると、キーボード入力が出来なくなるため、
一旦、標準入力(FD0)をFD3 にして、ファイルから入力して、済んだら元に戻す
こんな事を一々、シェルスクリプトでやるよりも、Ruby でやればよい。
FD何番を使っているとか、意識せずにすむ
- 258 :
- 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 :
- もう少しまともに説明できるやついないのかな・・・
- 260 :
- 宿題は自分でやろうな
- 261 :
- 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 :
- 宿題は自分でやろうな
- 263 :
- 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 :
- それはシェルスクリプトも同じだろうな。上の終了しているのは set -e しているからじゃないのかな
シェルスクリプトは子プロセスを起動していてシグナルを受けるのが子プロセスでが多くタイミング的に〜以下省略
- 265 :
- > set -e しているからじゃないのかな
それをわかってるから、サンプルコードにも入れてるんだけどねw
問題はそこじゃなくて、なんでシェル毎に挙動違うんだよ!?
どれが正しいんだよ!?という話なわけで
- 266 :
- CTRL-Cを入力するタイミングが下手すぎるって話だろ
まさか手入力じゃあるまいな?
- 267 :
- >>266
手入力しないでやる方法を教えてくれ!
- 268 :
- いやkill使うのは知ってる。それをどういう風に使えば、
手入力と全く同じことを再現できるのかという話だ。
- 269 :
- 2つの端末を使って一方で実行してから
もう一方で(手入力で)実行するっていうのは
結局手入力してるのと変わらないし、
1つのスクリプトでkillすると、
それこそわけわからんことになる。
イベントハンドラ内でkillするか、違う場所でkillするか
シェルによって挙動が違う
- 270 :
- 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 :
- シングルスレッドでは、sleep 7、としてる間に同時に、
Process.kill :INT, Process.pid
と、自プロセスの命令を実行できない
マルチスレッドなら出来るのだろうが、マルチスレッド・プログラミングはややこしい!
- 272 :
- >>271
マルチスレッドのほうが楽だな。
それらをマルチプロセスでやってくれ。
子プロセスは自分で作成したものだけじゃなくて
既存のプログラムも使い、バックグラウンドプロセスも使ってみること
- 273 :
- zshの謎な挙動はこれが原因か?
https://fumiyas.github.io/2013/12/05/trap-exit.sh-advent-calendar.html
> でました、zsh の非互換! zsh はシグナルハンドラー※内で終了すると、 EXIT ハンドラーを実行してくれません。酷い。 (※この例では SIGINT のデフォルトのシグナルハンドラー)
> こんな感じで bash, ksh, zsh には微妙な動作の違いがあったりするので、 ちょっと変わったことしようとするときは特に注意しましょう。
- 274 :
- 読みづらいなw
$ zsh -c '
atexit(){ echo "Bye!"; };
trap atexit EXIT;
trap "trap - EXIT; atexit; exit -1" TERM;
kill -TERM $$
'
- 275 :
- 全てのシェルで適切に終了処理をするって難しいな・・・
- 276 :
- Ruby で、at_exit に、終了処理を書いておけばよい
シェルスクリプトで、書く必要がない
- 277 :
- 時たま出来てしまうゾンビは何が原因なんだろう?
kill -TERM 0 してるから全部死んでくれるはずなんだが・・・
- 278 :
- あ、バックグラウンド処理とかしてる
そしてCTRL-Cで強制終了した時の話
ゾンビだから消せなくて困る
- 279 :
- ゾンビは、子プロセスが終了して、
OS が、その終了コードをどう扱えば良いのか、わからないから、ひとまず保存している状態
普通なら、子プロセスの終了コードは、親プロセスへ渡されるのかな?
ゾンビが生まれた時に、親プロセスがどうなっているのか?
- 280 :
- >>265
お前には言ってない
>>266
タイミング的に子プロセスが受け取るのかシェルが受け取るのかってことなんだけどね。コマンドを実行中なのかシェルが実行中なのか
set -e を使うからややこやしい、シグナルの基本をわかってないんじゃないんだろなとしか思えんけど。コマンドがINTシグナルで終了した場合、シェルが擬似的にシグナルハンドラ呼んでるっぽいかな(もしくは自らにINTシグナル出してるのかな?)
何したいのか知らんけど、set -e 使わずに、INTシグナルハンドラでexitすればいいんじゃないの
- 281 :
- >>279
その理屈はわかるんだけどねぇ
まず必ずゾンビになるんじゃなくてたまになる。だからタイミングの問題
CTRL-Cを押した時になる。通常の処理では発生しない。
CTRL-Cのハンドラでは作業ディレクトリの削除を行っている。
ワーカー(& によるバックグラウンド処理)が複数ある。サブシェルを使ってるせいか
同じな名前のプロセスがたくさんいる。ワーカーを生成した後はwait(引数なし)を実行している。
ゾンビの存在は確認しているが、誰がゾンビになったのかその親が誰かはよくわかっていない。
(たまにしかならんので探しにくい)ただし内部で呼び出してるtrやmvがゾンビになったこともある。
CTRL-Cのハンドラでは作業ディレクトリの削除の他、多数生きてるワーカー(労働者)を
皆殺しにするためにジェノサイド(kill -TERM 0)を発動している。
ただし労働者を消した後に、労働者の作業場(作業ディレクトリ)も片付ける
必要があるので自分だけは死なないようにしている。(trap ':' TERM)
実際にはもっと複雑だけど、死なないのは自分だけなはずなんだけどな
バグでゾンビになったこともあるので記憶が曖昧だけど
(バグを修正した今は)zshだけしか発生しなくなっているかもしれない。
もしかしたらzsh内蔵のkillにバグがあってR順番とか
子供が生まれるタイミングで発生してるとか?
でもまあなんだかんだでシンプルにしていったら
ゾンビの発生率も下がってきたし諦めるかな
- 282 :
- うーん、おかしい。trってワーカー(バックグラウンドプロセス)の
中で使っているとはいえ、パイプの右側でしか使ってないんだが?
- 283 :
- 漏れにも、ゾンビになるプログラムとならないプログラムの、違いがわからない
ゾンビになるメカニズムを検索してみれば?
- 284 :
- 「ゾンビになるメカニズム」で検索してみた
管理テーブルにデータが残ってるだけなら
消す方法(もしくは隠す方法)があってもいいと思うんだがねぇ
- 285 :
- >>284
wait()すりゃいいんだよ。
普通はinitが拾ってくれるんだが、誰にでも好き嫌いはあるということだろう。
- 286 :
- >>280
>コマンドがINTシグナルで終了した場合、シェルが擬似的にシグナルハンドラ呼んでるっぽいかな(もしくは自らにINTシグナル出してるのかな
違うか。control-cでのINTシグナル送るやつの文献ってどこぞにあるかなあ
- 287 :
- Ctrl+C が、子プロセスやパイプラインのジョブグループに、
どのように伝達されていくかとか、難しい
- 288 :
- いろいろ間違っていた。訂正する。
まずCTRL-Cは関係なさそう。実は正常な動作でも(プログラム実行中に)ゾンビができることがあった。
ゾンビができると今は無限ループ状態になるので気づいたが、ちょっと前まではプログラムの構造上、
ゾンビを放置して正常終了していたと思う。zshではあまりテストしていなかったから気づかなかった。
バックグラウンドプロセスが関係あるかないかはよくわからない。
何回か動かしているがバックグラウンドプロセスを使用しない場合は今の所再現していない。
あとなんかWSLとのからみな気がしてきた。
速度が違うから断定は出来ないがLinuxだと再現しない。
今の所、WSL環境にて、zshで、バックグラウンドプロセスを使用し、
その中でパイプを使った処理を行うと、まれにゾンビプロセスができる。
- 289 :
- >>286
シグナル一般の話ではなくてttyの話だったら、詳解Unixに載ってた気がするが、
当然そのくらいは読んでるよね。
- 290 :
- >>287,289
なるほど
すまん、読んでない。遠い記憶では読んでいたような気もするが忘れたので読んでない
- 291 :
- 再現コード出来た。このコード、なにか問題有る?
これを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 :
- やっぱり詳解Unixは買わねばいかんか・・・
- 293 :
- dash、bashでは再現しない。kshでも再現した。
いずれもWSLのみ。これもうWSLの問題だろ・・・
きっとWSLのバグをzshとkshが踏んじゃったんだな
- 294 :
- これ関連してるのかな?
Why are there many zombie process in windows subsystem for linux(WSL)? How to kill them totally?
https://superuser.com/questions/1419292/why-are-there-many-zombie-process-in-windows-subsystem-for-linuxwsl-how-to-ki
- 295 :
- 次のWindows 10のリリースで治ってんじゃないですかねー
もういいか
Zombie zsh processes left behind that consume 8 % CPU each
https://github.com/Microsoft/WSL/issues/3940
Killing a defunct zombie leaks the zombie process forever
https://github.com/Microsoft/WSL/issues/3741
https://docs.microsoft.com/en-us/windows/wsl/release-notes#build-18267
Fix issue where zombie process may not be reaped and remain indefinitely.
- 296 :
- 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 :
- $ 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 :
- シェルスクリプト(対話操作含め)が実行される手順って結構複雑な割に他の言語よりずっと単純だから
理論から実践(この場合はシステム処理とか?)への、かなり良い足掛かりになるよね。
- 299 :
- http://www.sample/{01..10}.jpg
これが書かれたtxtを読み込んでブレース展開して出力する方法ないです?
$ printf "%s\n" < foo.txt
適当にこうやっても上手く行かなくて
- 300 :
- ないです
- 301 :
- eval $(echo -n 'echo '; cat foo.txt) とか?
- 302 :
- sh << END
printf "%s\n" $(cat foo.txt)
END
- 303 :
- echo "printf '%s\n' $(cat foo.txt)" | sh
でよかった
- 304 :
- eval 'echo '$(<foo.txt)
- 305 :
- >>304
内側のリダクレクトが何かと思えば $(cat file)の変形があったとは
複数行も対応してるしこれなら行けそうですわ
- 306 :
- ごめん、もうちょっとシンプルに書けた。
eval echo $(<foo.txt)
- 307 :
- >>306
これいいね!
……正直,実際に使う機会は少なそうだけど
シェルの処理をしっかり把握してないと思い付かない回答。
- 308 :
- 例えばさ、
bash -n -c 'a=(a b c)'
↑これはbashとして正しい文法だけどさ
sh -n -c 'a=(a b c)'
↑これは文法エラーになるじゃん? 実行していなくても
これみたいに、実行してないのにあるシェルではOKで
別のシェルではNGみたいな文法って他に何かしらない?
- 309 :
- >>308
君と似た例ではあるが;
$ bash -n -c '%=a'
$ sh -n -c '%=a'
- 310 :
- eval 'printf "%s\n" '$(cat foo.txt)
これprintfをシングルクォートで囲まないと改行されないのね
http://www.sample/01.jpgnhttp://www.sample/02.jpgnhみたいな結果ばかりでちょっと悩んだ
zsh使ってないけどこれはforの後の二重括弧に空白が必要だとかなんとか
{には空白がいるのにfor((が通るbashの方が不自然なのか
- 311 :
- export -p と export の違いってなに?
- 312 :
- \n の処理をだれがいつやらかすのかってとこかな。printfにやらせたいprintfに \n のまま渡さなくてはという感じ
eval printf "'%s\n'" $(cat foo.txt)
eval printf '%s\\n' $(cat foo.txt)
- 313 :
- そもそもなぜ eval を使うのかというと、コマンドラインの解釈において
ブレース展開がコマンド置換より前だから
コマンド置換してからブレース展開するためには
eval を使って解釈を最初からやり直す必要があるためで
しかしながら printf と "%s\n" にはその必要がないのだから、つまり
printf "%s\n" $(eval echo $(<foo.txt))
でいいんじゃないかな。
- 314 :
- ダブルクリックで実行できるのとできないシェルスクリプトの違いって一体
whileとcaseで簡易メニュー作ってたんだけどダブルクリックしても画面に何も出ない上に
起動されたbashがCPUがかなり食ってた
無論端末から実行はしっかり通る
ls結果を外部保存するような単純な奴はダブルクリックでも正常通りなんだけど
- 315 :
- シェルスクリプト関係ない
- 316 :
- >>311
マニュアル嫁
つーか実行すれば一目瞭然だぞ
……と思ってやってみたらexportはオプション成しで起動すると
export -pと同じ動作をするんだね
- 317 :
- >>314
使ってるGUIシステムがX11なら
x-terminal-emulatorなんかを使って仮想端末を立ち上げてからじゃないと
メニューみたいな端末出力を必要とするものは期待した通りに動かないよ。
- 318 :
- >>316
そうマニュアルに書いてあるだろう。なんのボケ?w
- 319 :
- 模範解答
export -p がどう表示されるかはPOSIXで規定されていますが、
export がどう表示されるかは未定義です。(同じとは限りません)
つまり、exportがどうなるかはシェル毎に異なります。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#export
更にexport -pはbashではPOSIXに反してdeclareで表示されます。
これらは各シェルのマニュアルには書いていません。
- 320 :
- 模 範 解 答
- 321 :
- bashで abc*が展開できると出来ないときがあって
それをテストするのに
[ "abc*" = 'abc*' ]
とやりたいのにできません
どうやったらできますか?
- 322 :
- >>321
何がどうできないのかよく分からないけどシングルクォートとダブルクォートは
処理が違うから「=」にならないと思うよ
シングルクォート側は文字列なので「abc*」っていう文字列になるけど
ダブルクォート側は解釈されるので「*」にあたるものが存在しないと何もない
状態なので「abc」って文字列になるんじゃないかな
- 323 :
- は?
- 324 :
- abc*が展開できない時はそのままabc*になるのでそう思って書いてみました
- 325 :
- abc* というファイルが実際にあるというというのは除外でいいのね?
- 326 :
- ええです
- 327 :
- ダブルクォートで囲んでも囲んじゃうとglob展開は行われない変数などのようには。(>>322見るとデフォでは??展開できるなんかあっったかなあ)
[ "$(echo abc*)" = "abc*" ]
とかかな
any='abc*'; [ "$(echo $any)" = "$any" ]
- 328 :
- 日本語がダメな奴と日本語がダメな奴が
初心者同士の会話をしてる。
ついていけない。
- 329 :
- >>327
ありがとうございます
echoを使わずできたらお願いします
無理なら諦めます
- 330 :
- >>328
答えてやれよ。マウントとりではなくて。ふたレスもするくらいな
(>>322は正直お前の>>323と同じだが、それだけじゃなというのと、もしかしてもしかしてもしかしてだけど)
- 331 :
- >>329
echoを使わずの条件がわからない。他にもやり方があるけど、複数行にだったり
stackoverflowではなんか凝ったのより ls が人気みたい。見た目でわかりやすからかな
- 332 :
- 何をやりたいのかわからない。
端末にecho *って入力して
あぁ、展開されましたねって
確認すりゃいいだけじゃんか
なんで[ ]とか使うのか
- 333 :
- >>332
お前が何言っているのかわからない
シェルスクリプトで判断してなにかその後にする部分のことを聞いてきているのだろう。その判断するとこだけを書いているのだろうと読むと思うけど
(日本語どうの言うなら、他人の日本語より自分の日本語を疑った方がいいようなw)
- 334 :
- >bashで abc*が展開できると出来ないときがあって
abc* としても、該当するものがあってglob展開する場合と、該当するものがなくてglob展開しない(出来ない=globのまま)ときがあって
>それをテストするのに
展開できなかった場合はマズいので(とかなんとで)、それをテストするのに
[ "abc*" = 'abc*' ]
>とやりたいのにできません
としてみましたが、思ったようになりません
だよ。たぶんw
- 335 :
- Ruby で該当するファイル数を数えれば?
それが、0 なら、該当なし
p Dir.glob( 'C:/Users/Owner/Documents/*.txt' ).length #=> 0
- 336 :
- >>333
お前はさ、なぜこういう質問に至ったかまで考えられてないんだよ。
意味不明なんだよ。
>>334
そう思うやろ?だったら意味不明って気づかなきゃ。
> 展開できなかった場合はマズいので
つまり、現時点で「展開できてる」はずなわけだよ。
展開の仕方を知ってる。
なのに展開できないと言ってる。意味不明だろう?
- 337 :
- >>336
なにを言っているのかさっぱりわからん。意図目的とすることがな。いや後半はまったくわからん、お前の頭の世界の話だけのようで。ちょっと怖いぞw
ただマウントとりたいだけというのはわかるぞw
- 338 :
- 読めなかったらのをごまかすためにむちゃくちゃ言っているんだな
うん。そゆことにしとこ。でないとアレだなということで
- 339 :
- だーかーらー、いつもどおりのやってるやり方で展開して
それをチェックすればいいだけだろと
- 340 :
- ぜんぜん「だーかーらー」でもなんでもないな。お前の言っていることはわからん
どうも自称初心者じゃない自称日本語ダメじゃない人の自分の脳の世界でなんか言ってるとしか見えない
お前の言う初心者の ID:6T3A9gnL は >>327 ので不満があるようだがそれでも答えになってるらしいぞ
お前の変な言い分はお前のためでしかなく、他に対する目的も意味もない。マウントとりたいだけのお前には意味があってもな。マウントとりたいから延々続くのか?
- 341 :
- 誤 お前の言う初心者の ID:6T3A9gnL は
正 お前の言う初心者の ID:6O+4Q2Ek は
なんかすまん
- 342 :
- > お前の言う初心者の ID:6T3A9gnL は >>327 ので不満があるようだがそれでも答えになってるらしいぞ
だからなんなのか知らんが、お前ら、いつもどおりの展開ってecho使ってんのか?
使ってないだろ。いつもどおりの使えばいいだけなのに、
悩んで(?)別の方法模索してるから、意味不明だって言ってるんだよ。
質問者にも回答者にも
- 343 :
- むちゃくちゃww
自分で>>332って書いているのに
言うにことかいて「だからなんなのか知らんが」だってwwwもろマウントとりたいだけ、マウントとり失敗してわけわからんだけだな
- 344 :
- 展開されるかどうかの確認はそれでいいし、
プログラムでならいつもどおりのやり方で展開すればいい
何をやりたいのかわからないのに、どちらの話かわかるわけないだろ
どちらにしろ「は?」なわけだが
- 345 :
- すでにお前に対して「は?」だよ
- 346 :
- っていうか、正しいやり方知らんのか?
echo使って検査するんじゃないぞ(それじゃできない)
- 347 :
- それじゃできないっていうのはコレな
> abc* というファイルが実際にあるというというのは除外でいいのね?
abc* というファイルが実際にあることも考慮するやり方をするべき
そうすれば正解にたどり着く
- 348 :
- ダメな場合もあるのはわかって聞いているんだけど。本人がいいっていったからそれに合わせてだよ
だれかみたいに「すべき」とか強要するつもりも知識自慢したくてたまらないとかもないからな。その最後のといい、なんか偉そうにしたいのね、質問者の意図とか読まずに、知識自慢するためのw質問者の他の情報も引き出そうともせずに
shopt使うとかいう知識自慢だったら笑うぞ。別にabc*という実ファイルがあった場合でものshopt使わずにの方法もあるけどな
- 349 :
- 本当に差があるやつとの会話は疲れるw
> bashで abc*が展開できると出来ないときがあって
展開でするやり方知っってるよな?それ使え
> それをテストするのに
展開できないことのテストはいらん
お前が知ってるはずの、展開するやり方を使って、
-f (もしくは -d や -e 等)で、その名前の
そのファイルが実査に有るかどうかを調べるだけ
shoptとかもしらん
- 350 :
- 実査 -> 実際
- 351 :
- やっぱり、まだわかってないんだな、「展開〜」という質問を
shoptとかもしらん....
-f とか、まさかそんな「当たり前の」こと言い出すとは
まさか「その程度」だとは思わなかったわっ。なんだろこれw
- 352 :
- × shoptとかもしらん
○ shoptとかもいらん
なんで当たり前の正解を言ったら
お前悔しがってんの?w
知識自慢したのお前じゃん
そして「は?」の意味わかっただろ。
全く見当違いのことをやろうとして、
全く見当違いの解答をしてるんだよ。
クソガキどもが
- 353 :
- そりゃ、お前が悪い。shoptもな
なんかもったいぶってるだけでだからな。自覚がないのか?さんざん偉そう俺は初心者じゃないってだけの、質問から外れたことばっかり言っている
お前が>>349を>>352で書けば終わってることだからな
俺は別にお前みたいな知識自慢したくてなんてないぞ。おまえがさんざん俺偉いというだけのような&「そうすれば正解にたどり着く」とかうやむやなこと言うからだろうに
とうとう、「クソガキども」のお言葉いただきましたっ。なんだじじいかw自称他人を自分より劣ると言える
- 354 :
- 誤 お前が>>349を>>352で書けば終わってることだからな
正 お前が>>349を>>332で書けば終わってることだからな
- 355 :
- だから何をやりたいのかわかったのは
それ以降のレス読んでからだろうが
意味不明だし、馬鹿がクソな回答しやがるし
ほんと低い
- 356 :
- >だから何をやりたいのかわかったのは
イミフ。おまえもたいがい日本語ダがメだぞ?w いままでのレスの数々でも
やっぱり「俺高いお前低い」とは言いたいのね。なんでそう言いたいのか自分に問いてみような
- 357 :
- ああ、「クソガキども」のお言葉いただいたので(なんでそんなこと言いたくなったのか自分に問いてみようなw)、もういいや
- 358 :
- > なんでそう言いたいのか自分に問いてみような
邪魔だからだな。頭悪そうな兄ちゃんがきて
頭悪そうな会話をしてる。そんな感じだ。
- 359 :
- そして誰もいなくなった
- 360 :
- 質問する側が馬鹿すぎると馬鹿を引き寄せるだけなんだよなあ。
まず、まともな質問をするために man を読もうよ。
- 361 :
- よくわからんが、なんで -f が出てくるんだ?
ファイルの有無が問題じゃないんだろう?
globしたかしないかが問題なんだろう?
- 362 :
- ""で囲むと展開されなくて""で囲まないと複数の引数として認識するから出来ないので諦めますね
- 363 :
- >>361
globでファイル名に展開されるかどうかは
ファイル(ディレクトリなども含む)の有無で決まるから
- 364 :
- >>363
こういう奴がセキュリティホールを作り込むのかね
- 365 :
- そもそも、ファイル名に、半角英数字、- _ (base64url encoding)以外を使うような、
システムを作る奴が悪い
さらに、Windows では、大文字小文字だけが異なる、ファイル名も作れないし。
例、aB, Ab
- 366 :
- >>364
セキュリティホールを作るのは、
お前のように正しく理解してないからだよ。
問題が有るというのなら言ってみな。
- 367 :
- なぜ自信満々なのか、馬鹿の頭の構造はわからないな。
- 368 :
- 反論がないから
- 369 :
- 馬鹿なレスだな
- 370 :
- シェルの歴史に詳しくなれるサイト見つけた
https://www.in-ulm.de/~mascheck/
- 371 :
- bashのさ、<() ってさ、sort test.txt みたいなのを sort <(cat test) って書けるから
リダイレクトを受け付けないコマンドに、一時ファイル作らずに渡せると思ったけど、
そうとはかぎらないよな?例えば、同じファイルを二回読み込むとかさ
そういうのってやっぱ一時ファイル作らないと無理だよな?
- 372 :
- >>371
パイプの概念がないのか?
sortコマンドもどこでどうなったのかを気にしないで使うというのもよくわからない。
- 373 :
- >>372
知らんがな。俺に言うなや。
そのツールが、そうなってるんだから
sortコマンドはただの例だからこれ以上追求しなくていい
てか、複数ファイルを入力したり複数ファイルを出力したりすることだって
あるんだから、必ずパイプで解決できるわけじゃない
diffコマンドとかそうだろ
- 374 :
- 同じ出力のデータを分けて処理することは可能だが、なぜ魔法文にこだわっているのかがわからない。
- 375 :
- >>374
その話は関係ないから打ち切ろう
あるツールが「引数で指定した同じファイルを二回読込みしている」
そういう処理をしている。(そのツールの修正は不可能)
ここまでは理解しているかな?
- 376 :
- まあ結論としては無理ってわかってんだけどさ
bashの拡張を持ってしても
- 377 :
- あ、一時ファイル(FIFOファイル含む)作りたくないっていうのが最終的な希望ね。
メモリだけ(tmpfsや類似のメモリベースのファイルシステムやブロックデバイス除く)でやりたい。
無理ってわかってるけど。
- 378 :
- ただの無知か。
- 379 :
- >>371
例がないと何を言っているか意味がよく分からない。
teeとかファイルに出力しながら標準出力にも出力しているけど、
そのようなことがbashだけで表現できればOK?
- 380 :
- >>379
「リダイレクトを受け付けないコマンド」例
ファイル内容と行数を表示するために「同じファイルを二回読み込む」
これは "例" でありこのコマンドの内容についてのレスは不要
実際には中身はわからずバイナリで修正不可能なものとする。
#!/bin/sh
cat "$1"
wc -l "$1"
↑このコマンドに対して、一時ファイル(FIFOファイル含む)を作らないでデータを渡す
- 381 :
- >>380
ファイルを作らないでメモリだけでっていうことなら、
↓こんな感じならOKなの?
dat=$(cat $1)
- 382 :
- >>381
それでもいいよ
何をしたいのかわからんけど
kono-comand ?
↑?の部分になんて書く?
- 383 :
- 明らかに読み間違えてるレスがくると疲れるんで、
一時ファイルを使った場合の例も書いておくは
これは例なんで、この例を修正しろなんてレスは不要
generate-text > /tmp/test.txt
kono-comand "/tmp/test.txt"
この一時ファイル test.txt を作りたくない
なんで?とかいう質問も不要
- 384 :
- >>383
ホントに意味が分からないんだは、
上の例でもこれでいいんじゃないのと思っちゃう。
generate-text | kono-comand
だからこれを直せってほうが意味通じるかも。
- 385 :
- 条件の説明が下手すぎ
- 386 :
- >>384
本当に疲れる。
>>371を読み返せ。
> リダイレクトを受け付けないコマンドに、一時ファイル作らずに渡せると思ったけど、
> リダイレクトを受け付けないコマンド
> リダイレクトを受け付けないコマンド
> リダイレクトを受け付けないコマンド
パイプもリダイレクトだ。
- 387 :
- っていうか、
generate-text | kono-comand
kono-commandの内容は上に書いたとおり↓で
> #!/bin/sh
> cat "$1"
> wc -l "$1"
修正不可能つってるんだから
これでは動きません。の一言でよかったなw
>>385
動かないコードを書いる時点で説明の問題じゃない。
- 388 :
- >>384
コマンドが標準入力をサポートしてない場合のだろう、よってパイプが使えない
標準入力サポートしていてパイプでいいだろうというコマンド例を挙げてくるとか説明が下手すぎなだけだろうなw
- 389 :
- >>388
あ、回答者の説明が下手すぎってことかw
- 390 :
- いつもの自信過剰な人か
- 391 :
- >>390
ん?今回はへこましてみるか?
俺「やっぱできないよなぁ」
→ 俺もできないと思うよ。
で終わればいいやん。
- 392 :
- 標準入力もデバイス(ファイル)としてある
- 393 :
- https://hogem.hatenablog.com/entry/20090530/1243612485
> diff -u hoge.out fuga.out
> diff <(./hoge) <(./fuga)
よくこんな感じで、一時ファイルを作らない例として挙げられてるけど、
これって、diffが引数のファイルを一度しか読み込まないという
内部実装に依存しているってことなんだよな。
だから複数回読み込んでいたりすると使えない。
一度しか読み込まないという仕様はないだろうから
たまたま使えたということ。
- 394 :
- >>392
知ってる
- 395 :
- ストリームでいいのかファイルでなければならないのか条件説明がやっぱり下手すぎ
標準入出力は普通は単なるストリームで戻ったりはしたない、一気通貫するだけ
2度読み??とかストリームでないなら当然ファイルにしなければならないだろうに、あたりまえだろう。結局あたりまえのことを確認したいだけなのか。例で上げてくるのがストリームでいいだろうのを出すから下手なんだよ
- 396 :
- >>395
これを満たせばいいだけ。
いい加減にしろや
「リダイレクトを受け付けないコマンド」例
ファイル内容と行数を表示するために「同じファイルを二回読み込む」
これは "例" でありこのコマンドの内容についてのレスは不要
実際には中身はわからずバイナリで修正不可能なものとする。
#!/bin/sh
cat "$1"
wc -l "$1"
↑このコマンドに対して、一時ファイル(FIFOファイル含む)を作らないでデータを渡す
- 397 :
- はは。catとwcでファイル読み込みを二回実行してるから、
ストリームでは無理なことにも気づいてない(笑)
マヌケか
- 398 :
- それが下手だと言ってもわからないんだな
- 399 :
- >>398
どこが下手なのか言ってないからね。
ストリームで不可能な例を見て、
これストリームで可能じゃん!って
言ってしまった時点で、お前の負け
- 400 :
- 俺が言いたいのは、
> diff <(./hoge) <(./fuga)
が使えるかどうかは、コマンド(この場合はdiff)の
内部実装に依存するから、試してみるまでわからないということ、
ファイルじゃないと二度読みはできないとかそういう話はしてない。
<(./hoge)が使えるかどうかは、コマンド次第という話をしてる
どんなコマンドだって、一度読むだけで実装することは可能(メモリに読み込めばいい)
だから、<(./hoge)が使えるかどうかはやってみるまでわからんのだよな。
という話をしてる。
- 401 :
- >>384
というように、
cat "$1" | wc -l
したいわけじゃないんだよ。後は後出しでいろいろ言ってくるだろう
- 402 :
- ということを、とあるファイルを引数にするコマンドを
一時ファイルを作らないでやろうとして
あれ?となった次第。
そのコマンド、一度だけしか読まないでできるように思えるんだけどな。
- 403 :
- > cat "$1" | wc -l
> したいわけじゃないんだよ。
>>380 を読めばそれぐらいわかる
- 404 :
- catやwcなんぞ各コマンドの入力ソースはストリームでしかないので、できないことはないけどな。お前には教えないがw
- 405 :
- >>404
> これは "例" でありこのコマンドの内容についてのレスは不要
あーあ、やっちまった。コマンドの内容にレスしたね(笑)
- 406 :
- >>405
>>385 そう言うなら、当然これを受け入れろな
- 407 :
- 例だから、実際にはcatやwcが使われているわけじゃないのに
catやwcなんぞとかwww
- 408 :
- >>406
自分の理解力のなさを自覚するように。
こっちは、ちゃんと例を出してる。
その例を満たせなかった時点でアウト
- 409 :
- コマンドの入力がストリームでいいならできる、他のなんか知らんコマンドがストリームじゃダメならできないでしかない。使用するコマンドによるでしかないだろにアホか
- 410 :
- > コマンドの入力がストリームでいいならできる、
そんな当たり前のことを言われてもなw
重要な点は、本来、該当のコマンドは「ファイルを指定する」前提であるということ
diffコマンドみたいにな。
それを半ば無理やり、ストリームから読み込ませる文法が
bashにはあるということ
> diff <(./hoge) <(./fuga)
だが、本来コマンドは、ファイル名を指定させる以上、ストリームを前提としているとは限らないわけで、
そういうコマンドに、bashを使って無理やりストリームで渡して動いたとしても、
それはたまたま動いただけいう話をしてる。
(コマンドの仕様で規定されてないならば)実装依存なので動くという前提に立ってはならない。
- 411 :
- あ、bashの拡張なんて俺は普通使わんけどなw
今回はたまたま利用可能だったってだけで
- 412 :
- では、なにを当たり前のことを延々と言っているのかね?
というような、お前のレスはこんなんばっかだな
- 413 :
- >>412
俺「やっぱできないよなぁ」
→ 俺もできないと思うよ。
で終わればいいやん。
- 414 :
- 基本的に、俺が出した結論が正解なので、
最後の最後でここで他になにかないのか?と聞いても
新しいことは何もわからないというのがいつものパターン
- 415 :
- そうならないのは、
>>385,390
(実は答えは別にもあるのだが、お前には教えないw)
- 416 :
- >>415
その答えは俺も知ってるけどな(笑)
- 417 :
- そういや前にも、
他にもやり方あるけどお前には教えてやんないよ。ばーかばーか
みたいなレスあったなw
結局やり方なかったみたいだけどw
あ、今回は有るんですよね?知ってます。だって俺も知ってるからね!
- 418 :
- ほほー、よくわからんが解決してなにより
めずらしくちゃんと終えられてよかったよ
- 419 :
- ほほー(笑)
- 420 :
- やれやれ、何事かと思ったら……
「そのツール」って何だよ。それを書かない時点で相手にする価値が無いゴミだろ。
- 421 :
- ツール名聞いたって何の意味もないくせにw
じゃあgccとでも言っておこうか。一例として
- 422 :
- チンピラ以下の馬鹿だな
- 423 :
- なぜかシェルスクリプトのスレなのにコマンドの世界の話をしてますね。
- 424 :
- シェルスクリプトはコマンドを使って組むもの。基本的なものですらコマンドだったり。
コマンドの動作がどうだから入出力がどうだからで組みもするもんだろう。
- 425 :
- いつものってことはこいつは常連客なのか
ちゃんとコテ付けてくれないと困るなぁ
- 426 :
- >>424
プログラムですよ?
- 427 :
- なにいってんのこいつ
- 428 :
- やっぱワッチョイ導入しよーぜ
- 429 :
- やはりそれが目的ですか
- 430 :
- どういうこと?
- 431 :
- [ string1 > string2 ] ってPOSIX準拠じゃないよね?
POSIXの範囲で(外部コマンドを使わずに)
文字列の大小の比較ってできたっけ?
- 432 :
- >>427
おまえさ、ここはシェルスクリプトのスレッドだぞ?
コマンド一発にしたいのなら、そういうコマンドを作ればいい。
UNIXの考え方は、あるものの組み合わせで実現できるものはそうすべきだが、無理やりあるものの組み合わせでやれなんて言ってない。
- 433 :
- >>431
どの言語でも、単に文字列を比較する構文は、どういう比較なのか分かりにくいから、まともなプログラマは避ける。
- 434 :
- これまた変なのが現れたな
- 435 :
- >>431
外部コマンドを使わないという制約なら
↓こういうのでは
string1='aaaaa'
string2='bbbb'
[ ${#string1} -le ${#string2} ]
- 436 :
- 「文字列の比較」ができるという触れ込みで文字数の比較を
している言語やデータベースなんか聞いたこと無いなw
普通は現在のロケールに従って文字列の照合順序で比較のことを言う
百歩譲っても文字コード順とか
- 437 :
- >>436
文字列が同じ値かどうかの比較を忘れているのか?
- 438 :
- 変なやつだったようだな
- 439 :
- 文字数の比較じゃないのか。申し訳ない、俺の読解力が不足してた。
後学の為に訊いておきたいんだけども、文字列の比較がごく普通にできるプログラミング言語って例えばなんだろう。
- 440 :
- C言語
- 441 :
- 構文的ならC言語はできない方かなあと
他の(スクリプト)言語でいくらでもあるからそちらでもよかったんじゃないかと
- 442 :
- >>439
ベイシック
- 443 :
- >>440
C は言語機能としての文字列比較は出来ないよ。
strcmp() 等で比較するしかない。
- 444 :
- C言語を基準にしたら文字列同士の比較は簡単な構文ではできない。
しかし、C言語よりあとにできたプログラミング言語は、文字列同士ができ、まったく同じ文字列かどうかの比較ができる。
同じか同じでないか以外の比較は、プログラミング言語によって比較の指定がことなる。
文字列の長さ比較なのか、文字コードの大小比較なのか、よくわからないコードは可読性が低く、シェルスクリプトの場合は、OSが変わっただけで比較方法がかわってしまう。
同じOSでも設定違いで変化するから、バグを埋め込むだけである。
- 445 :
- > シェルスクリプトの場合は、OSが変わっただけで比較方法がかわってしまう。
どんなふうに?
例として2つ(以上)のOSで比較方法を書いてみてよ
- 446 :
- だいたいどの種類のシェルか限定していない状態で具体例を挙げても意味がない。
- 447 :
- 意味有るでしょ?限定してないなら
例として○○のシェルならって書けばいいだけだよ
- 448 :
- シェルスクリプトが環境依存であることを知らない人間に何を言っても時間の無駄。
- 449 :
- 文字コードが異なるだけで、文字照合順序がかわる。
同じシェルスクリプトでもテストコマンドの評価が変わる。
- 450 :
- OS?
- 451 :
- >>450
2 デフォルトの名無しさん sage 2018/09/21(金) 23:36:59.94 ID:/eJt2TVD
お約束
・特記なき場合、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: http://www.speech-lab.org/~hiroki/csh-whynot.euc)
・POSIXに準拠しましょう
有用なリンクはhttps://en.wikipedia.org/wiki/POSIXにまとめられています。
最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh、次点でDebianなどに搭載されているDash shell
Heirloom sh: http://heirloom.sourceforge.net/sh.html
Dash shell: http://gondor.apana.org.au/~herbert/dash/
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります
Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
- 452 :
- >>449
今その話関係ないよ?
- 453 :
- 文字コードが異なる文字列の比較をするときって
どんなとき?
- 454 :
- エンコーディングが変われば文字列の大小比較の結果も変わるかもしれないが
それを指して「比較方法がかわってしまう」と言ってるのか?
そうだとしても OS に依存するものではないだろうし
「シェルスクリプトの場合は」というのもおかしいように思う。
勉強不足な私のためにもう少し説明してはくれないだろうか。
ところで、シェルスクリプトで文字列の大小比較ってする?
- 455 :
- するからbashで拡張されたんじゃねーの?
- 456 :
- >>443
それ言ったらObject.compareTo()な言語全部じゃん
- 457 :
- >>455
Bashってそんなことできたのか。
- 458 :
- >>457
posixじゃないだけで多くのシェルで使える。
使えないのはposhぐらい
- 459 :
- ん? Bashで文字列の大小ってどうやって比較するんだ?
[ "abcd" < "cde" ]
↑こういうのエラーになるぞ。
- 460 :
- [[ "abcd" < "cde" ]]
- 461 :
- 文字列の大小は文字列長のことを言っているのか?
- 462 :
- >>459
[ "abcd" \< "cde" ]
- 463 :
- >>461
いや,この一連のレスの文脈では文字列の比較は
文字列長の比較を意味しない。
俺が>>435を提案したら>>436で否定された。
- 464 :
- 「文字列の比較を行う」という構文やライブラリで
文字列長の比較を行ってるものなんてあるか?
数値の比較はできるんだから「文字列長を取得する」命令だけあれば十分
だから「文字列長の比較を行う」命令なんてないだろ
- 465 :
- Bashで文字列の大小比較って結局なにが基準なのかな。
- 466 :
- 辞書順で先かあとかじゃね?
- 467 :
- (連投すまん)自問自答みたいになっちゃったけど
辞書順でした。
- 468 :
- 他のプログラミング言語を知らなさすぎだろうというのが複数いすぎ
- 469 :
- 日本語すら怪しい日本人がうようよいるご時世ですから
- 470 :
- そういうやつも日本語わかってないというのも定番
- 471 :
- シェルスクリプトはわからないが、文字列長が同じ場合は、文字コードの大小を先頭文字から比較していき、大小比較をするプログラミング言語は存在する。
- 472 :
- で、その名前は?
- 473 :
- >>472
PL/SQL
- 474 :
- へぇ、文字列長が違ったら大小を比較しないんだ
- 475 :
- データベースの場合、文字列の昇順、降順をSQLの仕様で意識するから、文字コードの大小比較をするプログラミング言語の仕様があるのは副産物かもしれないが、簡単にできてしまうので存在する。
年月日を文字列で持っていても過去、未来を判定できる。
- 476 :
- > 年月日を文字列で持っていても過去、未来を判定できる。
Wed May 15 02:01:21 DST 2019
日付を文字列で持っていても?
- 477 :
- >>474
データベースは設定によって並び順が異なる。だから文字列長が変わったら、設定や製品によって動きが変わる。
- 478 :
- >>476
わざと前方からの比較が難しい例を挙げているが、あんたの質問には全部、答えられるよ。
- 479 :
- >>476
だいたい日本でその並び順の日付文字列をデータベースに文字列として格納するアホはいない。
- 480 :
- 日付を文字列で持っていても、過去、未来の判定には型変換をして比較する方がコードとしてはよいコード。
日付文字列を文字列のまま比較するのは悪い例だが、そういうコードを書く人間はいる。
ただし、9999年99月99日等、現実には存在しない年月日に意味を与えて使っているシステムはたくさんあるので、型変換して比較すると、手前でさらに判定ロジックが必要になり、コードが煩雑になる。
言っておくが私はこういう設計は、基本的に好きではないし、良いとは思っていない。
- 481 :
- だから日付を文字列で保つ場合は、文字列照合順で比較すれば、
大小がわかるような「特別に考慮されたフォーマット」で持たなければならないだろ
日本とか関係ねーよ。和暦で持ったら比較できないし、
1月ではなく01月って持たなければならないし
自分が普段使ってるフォーマットと一致しているからたまたまできることを
「年月日を文字列で持っていれば比較できる」って言ってしまうのは思慮が浅い
- 482 :
- >>447
> データベースは設定によって並び順が異なる。だから文字列長が変わったら、設定や製品によって動きが変わる。
文字列長が変わったら、設定や製品によって動きが変わるということは
文字列長が変わらないなら、動きは変わらないってことですよね。
言いたいことがわからない?
なんで全く無関係な文字列長を引き合いに出してるの?って
皮肉を言ってるんだが
- 483 :
- プログラミング言語の具体例を挙げると、今度はそのプログラミング言語がわからなくて文句を言う。
結局、あんたはなんだったらわかるのか?
- 484 :
- >>482
文字列長が同じであれば、同じ結果になる可能性が高いことを言っている。
文字列長が異なれば、コードを見ただけで絶対こうだとは言えなくなる。
- 485 :
- >>483
シェルスクリプトじゃね?
- 486 :
- 最近、目的がわからない粘着書き込みが多いね。
- 487 :
- >>484
> 文字列長が同じであれば、同じ結果になる可能性が高いことを言っている。
壱弐参 と 肆伍陸 は文字列長が同じだけど、
どういう理由で同じ結果になるの?
- 488 :
- 中途半端に抜き出すと意味が分かりづらくなるな
データベースは設定によって並び順が異なる。だから文字列長が変わったら、設定や製品によって動きが変わる。
壱弐参 と 肆伍陸 は文字列長が同じだから、設定や製品が違っても同じ結果になる可能性が高いこと
↑そういう主張をしてるよね?
データベースは設定によって並び順が異なるというのに、どういう理由で
設定や製品が違っても同じ結果(=並び順は異ならない)になる可能性が高いの?
- 489 :
- キモい奴に粘着されてるな
- 490 :
- こういうのはIDをNGしてやりすごすに限る。
- 491 :
- >>486
君が頭悪そうだからつっこまれてるんじゃないの? (頭が悪いとは言ってない)
>>471 が PL/SQL の仕様だというなら PL/SQL の仕様書に書いてあるでしょ?
それを示せばいいんだよ。
- 492 :
- マニュアルはそんな親切に書いてはいない。行動に意味はないがなんとか相手を打ち負かしたいという心情は理解できているよ。
- 493 :
- >>492
なんでマニュアルなんだよ。仕様書って書いてあるじゃんよw
- 494 :
- スペシフィケーション: 仕様書
マニュアル: 手引書
だからな。こればっかりは>>493が正しい。
なお()
- 495 :
- 商用製品に仕様書があるのか?仕様製品の場合はマニュアルに書かれていること、実際の動作が仕様です。
- 496 :
- ただの些末な言い争い。どっちも
どっちでもどうでもいいだろう。いいたいことがわからないわけでもなし
- 497 :
- 外国人は想定仕様と実態仕様が異なるから、仕様書など公開しない。
ユーザーが何かバグらしきものを見つけて報告して初めて仕様なのかバグなのかを答える。
世界基準では仕様通りにできていない、仕様どおりに作らないのが普通。
これが現実なのに、仕様書、仕様書と仕様書が存在すると思っているなら、この業界から去った方がいい。
- 498 :
- このスレッドはOSの種類、シェルの種類も書かずに、質問してくるやつらばかりだけど、なんなのかな?
- 499 :
- いきなり細かいこと言い出すな。どうした?
- 500 :
- 文字列の大小比較をシェルスクリプトで行うなら
sortとか使ったらいいのかな。
[ "$(<<. sort | head -n 1\
$1\
$2\
.)" = "$1" ]
↑こういう感じで。
- 501 :
- >>495
あるに決まってんだろ
商用製品になくてどうやって製品つくるんだ
- 502 :
- 「仕様書」と書いたことにそこまでの意味は無いよ。
客観的に見て信頼できるドキュメントで示しなさいということ。
実際、>>471 だけじゃ等しいかどうかの判定しかできない。
文字列の大小比較の話だというなら、どんな条件でそれが起こるのか
SQL で示すなりしてくれないと伝わらないよ。
それをしていない以上、ID:qxUiM81Y の言うことも正論と認めざるを得ない。
- 503 :
- 飽きてきたなw
つーか、お馬鹿さんは、さっさと、
文字列の比較で、文字列の長さは一切関係ない。
間違っていました。すみませんでした。って謝ればいいのにw
- 504 :
- 飽きてきたんならもう書き込むなよ、荒し。
人を煽ることしかできない癖に議論に参加するんじゃねーよ。
他の皆さん申し訳ない。警告とは言え不快な思いをさせたかもしれない。
ところでもう一度訊くけど、シェルスクリプトで文字列の大小を比較したいときは
sortを使うくらいしか方法はないのかな?
始めに質問した人が条件として設定したような「外部コマンドを使わない」のは無理っぽい……?
- 505 :
- だから大小とは文字列の長さなのかアルファベット順なのか?
出力のフォーマットはどういうのか?
二つの文字列を比較すればいいのか、複数の文字列を比較したいのか?
を書いてくれないと答えられない
- 506 :
- > だから大小とは文字列の長さなのかアルファベット順なのか?
文字列の(現在の)照合順序だって書いてあるし、決まってる。
文字列の比較を文字列の長さの意味で使う開発者なんていない
> 出力のフォーマットはどういうのか?
書いてない=自由なんだから、お前にとって一番都合がいい方法で答えろ
> 二つの文字列を比較すればいいのか、複数の文字列を比較したいのか?
書いてない=自由なんだから、お前にとって一番都合がいい方法で答えろ
なんで、書いてくれないと答えられないんだか
書いてなくても答えられるだろ。
- 507 :
- >>504
> 始めに質問した人が条件として設定したような「外部コマンドを使わない」のは無理っぽい……?
一つ見つけたが、あまりにもひどい方法なので、皆が見つけられるかのお題とする(笑)
- 508 :
- >>453もこいつだろ
- 509 :
- >>507
無理して回答するフリしなくていいからね
- 510 :
- ファイルの名前として文字列郡が与えられてたら
echo *とかで並び換えられる(つまりsortっぽい機能が得られる)んだけど
今回は(恐らく)引数として文字列が渡されるのでやっぱ無理っぽいな。
>>509荒しは無視っとくのが一番だぜ
- 511 :
- >>510
お、俺が見つけた方法に正解にたどり着いたじゃないかw
ファイルがないなら作れば良いんやで?
- 512 :
- 文字列比較をファイル名比較にすり替えるなよ
自演も大概にしろ お前の話は詰まらないんだよ
- 513 :
- >>511
どうやって必要なファイルだけ用意するの?
- 514 :
- 「俺が見つけた方法」か……。
すげぇな。傲慢にも程ってもんがある。
- 515 :
- >>500
http://pubs.opengroup.org/onlinepubs/9699919799/
EXTENDED DESCRIPTION
Returns the result of a decimal integer comparison if both arguments are integers;
otherwise, returns the result of a string comparison using the locale-specific collation sequence. The result of each comparison is 1 if the specified relationship is true, or 0 if the relationship is false.
だって。exprでいいんじゃないかな
- 516 :
- URL貼り間違えた
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/expr.html
- 517 :
- いや、仕様というか使う目的が決まらないと
そもそもプログラミングが始められないわけだが
「何々に決まっている(と私は思っている)」というのはプログラミングで
もっとも危険な言葉。これで誤解して会社がなくなった例は
たくさんある。
- 518 :
- >>517
何をこだわっているのか、何をいいたいのか、何を主張したいのか
「何々に決まっている(と私は思っている)」というレスにみえるよ
- 519 :
- >>517
そのうち数値を比較する方法を教えてって言ったら
その数値は10進数なのか16進数なのか
漢数字なのかローマ数字なのか
それを決めてくれないと答えられん(←嘘、答えられる)
って言い出しそうだなw
- 520 :
- 別にどっちの味方をするつもりもないけど
例えば文字コード順に比較するんであれば七(U+4E03)は六(U+516D)より小さくなるし
そういう前提というか(此ちらの常識と向うの常識の共有というか)を擦り合わせることは重要だと思うけどね
まあ結局なにが言いたいかっていうと
「シェルスクリプトの話をしてください」
- 521 :
- >>520
そういう話じゃなくて、どちらでもいいことなのに
なんでどちらに決めてくれないと、ワカリマセンになるのかってことだよ
文字の順番の定義と
文字の順番を判定する方法
は別の話
本当は答えを知らなくて「わかりません」っていうのが恥ずかしくて
ごまかすために質問してるんだろ?「お前の質問のせいで、わかりません」って言うために
その証拠に現在の文字列照合順序って答えているのに、それを無視し続けている。
- 522 :
- うーん。
- 523 :
- Unicodeでの漢数字を字の意味での大小ってどこでサポートしてんだろ?
コマンドでは無いかなあ。数字(数値)ならLibreOfficeのSpreadSheetならと思ったらこれも字の意味の数字ではなくてなんか文字(文字コード)としてかな
基本的に C standard library がサポートしている範囲でそれがそこまででしかないのはある意味当たり前といえばあたりまえだと思うけどね
いろいろ作っているのがASCIIコードで十分な外人だから。bashも4.0になってstrcmpからstrcollに変えたぐらいという
- 524 :
- 誰もC standard libraryでサポートしてる範囲とか
大幅な制限は書けてないんだが?w
- 525 :
- それが当然のように多数=スタンダードじゃねという意味なんだけどね
漢数字で大小が必要な場合があった場合は何を使うのかなあという疑問だね
- 526 :
- まあ、どうしても必要なら…漢数字から変換できるよ。
https://metacpan.org/pod/Lingua::JA::Numbers
- 527 :
- perlは数値比較としては漢数字対応してんのね。あくまでも数値としてだけっぽいけど
- 528 :
- >>526
ああ、どうも。なる、Perlかw
変換かあ。Unicodeが悪いってことで、変換できない文字がないのならShift-JISにしてしまうのがいいような気がしないでもないw
- 529 :
- 勘違いしてた。Shift-JISでも同じなのか。そうだったのか...
そもそも漢数字をコンピュータで数字(数値)として扱うことなんて全くはなから考えていないのか、先人も後の人も
- 530 :
- いい加減、漢数字の話はやめようか?
今は文字列の大小の話だから
- 531 :
- 漢数字って日常で使うには便利だけど、コンピューターに処理させると面倒だなぁw
Unicode共同事業体によると一→1みたいな変換を文字コードレベルでサポートするかもしれないそうだけど。
- 532 :
- うわ。また無視した。話すり替えようとしてるのミエミエw
- 533 :
- >>531
>サポートするかもしれないそうだけど
ほほう、やっとというか、なにかやる余裕ができてきたのかな
最初にああいう位置に置いた昔の日本人が悪の根源wだろな。漢数字ではなく単なる漢字としてしまったんだろうな
- 534 :
- >>530
派生した別の話題だと思うのだが。
何か都合が悪いの?
- 535 :
- >>534
シェルスクリプトの話じゃないから
- 536 :
- >>535
シェルスクリプトで漢数字の比較をする話じゃないの?
- 537 :
- シェルスクリプトで文字列を比較するにはどうするの?
→バカ「文字列の比較って、文字列の長さの比較のことやろ」
→バカ2「文字列の比較って、漢数字の比較のことやろ」
- 538 :
- >>523が理解できないバカ発見w
- 539 :
- >>535
お前はいつからこのスレの統治者になったんだ?
お前は自分がいつも絶対に正しいと信じて疑っていないようだが少しは自省の念なるものを持ったほうがいいぞ
老婆心ながら忠告しておく。
>>533
でも漢数字を一概に数字と見做してしまうと
「一郎」とかが名前としてではなく数字+助数詞として認識されてしまうおそれがあるよな
- 540 :
- そもそも>>436の決め付けとか。こいつの価値観マジやばいわ
- 541 :
- >>539
コード表中のコード位置でしかないから。単に最初にでもまとめて順番に置いておけばいいだけじゃないかと
数字+助数詞とは別の話。数字+助数詞とかの概念はIMEなどの辞書での話で、文字がコードのどの位置にあるのかはそれにすら関係ないでしょう
- 542 :
- >>539
あのさ、質問者だけどさ、
漢数字の話はしてないんだよ
いい加減にしてくれないか?
- 543 :
- >>542
だからそれは派生した別の話だって言ってんだろしつこい奴だな
- 544 :
- >>543
だからその「派生した別の話」は「シェルスクリプトの話」ではないからよそでやれ
- 545 :
- >>544
シェルスクリプトでやる場合の話だからここでいいだろ何回言わせんだ
- 546 :
- >>545
じゃあさっさとシェルスクリプトでやる話をしろよ
漢数字とはなにか?の話しかしてないだろ
お前がシェルスクリプト以前の話で止まって決められないなら
俺が仕様を定義してやるから
まず使用する文字は一 二 三 四 五 六 七 八 九 十の10種類で1文字だけ(零はなし)
これをシェルスクリプトだけで(外部コマンド呼び出しなしで)比較する方法を書け
それが終わったら使用する文字は同じく一 二 三 四 五 六 七 八 九 十 百 千 の12種類で
九千九百九十九まで。ただし一二みたいな書き方はなし。十二、二十二、二千二のように
必ず十や百や千を含めることする
最後に一 二 三 四 五 六 七 八 九 十 百 千 万 億の14種類で
九千九百九十九億 九千九百九十九万 九千九百九十九まで。
いずれも、以下のような1対1の対応表は作ってはならない。
case
略
"十二")i=12 ;;
"二十二")i=22 ;;
略
case
- 547 :
- つーか、これ文字列比較に比べて簡単すぎだろ(笑)
- 548 :
- >>546に書いてない例外のパターン(例 百百 みたいなありえないもの)には
対応する必要はなし。いちいち仕様の抜け穴を探そうとする輩が多いからなw
- 549 :
- あとこれが終わったら、この応用(?)で
文字列の比較をシェルスクリプトだけでやる方法を答えるように
- 550 :
- >>543,545
全くそのつもりのそのとおり
誰かみたいに俺正しいという論争wしたいわけでもなし、何が気に食わないのかわからんw
何様なんかどういうつもりなのかわからんから、(直接)相手にしない方がよいよ。どうも子供のようだから言ってもわからんだろう
- 551 :
- 問題に難癖つけたいだけで、シェルスクリプトで
実装するという話になったらだんまりなのが
ばれたなw
- 552 :
- アンカーが何のためにあると思ってるんだ
一つのスレで一つの話題しか許されないと思っているなら
さっさと逝ったほうがいい
- 553 :
- >>549
「答えるように」
嫌ですw
俺はもうすでにヒントを提示してるんだけど
お前の態度が気にくわんから詳細は教えない
- 554 :
- 結局シェルスクリプトの話と言いつつ
漢数字での比較をシェルスクリプトで実装しろと言われても
逃げてばっかり(笑)
俺が出した問題じゃなくて、自分で新たに派生させたくせに
派生させたと言いつつ、シェルスクリプトの話をしない
- 555 :
- >>554
なんでこのスレの住人全員が
お前の出したお題とやらにかかりっきになってくれると思ってんだ?
自己中心にもほどがあるだろ
- 556 :
- だから漢数字での比較は、俺が出したお題じゃねーだろw
自分で出したんだから自分で答えろや
- 557 :
- この執拗さと自己中ぶりはいつもの馬鹿だろうとしか思えない
- 558 :
- 結局漢数字はシェルスクリプトの話をしたかったわけじゃないってことでOK?
シェルスクリプトの話しろよ
- 559 :
- 馬鹿なレスだな
- 560 :
- $ ./a.sh <<EOF
> 三千七百七十六 八千八百四十八
> 三十五億 三十五億
> 六百三十四 三百三十
> EOF
三千七百七十六 < 八千八百四十八
三十五億 = 三十五億
六百三十四 > 三百三十
$
漢数字での比較ってこんなのか? そうでないとしてもどうでもいいが。
- 561 :
- 漢数字でシェルスクリプトの話につなげる気はないんだからどうでもいいよ
- 562 :
- 何でもかんでも否定したいだけの子がいるところで
まともな議論はできないしね
- 563 :
- 砂場の幼稚園児の駄々っ子になんか重なるなあ
お砂場だから自由に遊んでもいいと思うけどwリアルと違って無視すれば居ないのと同じだし
- 564 :
- まあ、かまってちゃんの相手をしたかったわけじゃなくて
C でやるようなテキストのパースを普段あまりシェルスクリプトを書かない俺が
どこまで bash でできるのかと思っただけだからね。気は済んだよ。
そして、こんなことでも自分でやってみる方がかまってちゃんよりも絶対楽しい。
- 565 :
- >>546と>>549の回答よろしく
- 566 :
- >>560,564
俺の場合、
sed -e ’いろいろいろいろ' | bc
だけと後は比較だけででけた(三千十六 八八四八 なんぞも)
かまってちゃんは何をこんなのにに必死なんだかなあという感想
- 567 :
- >>566
「外部コマンド呼び出し無しで」という
条件ぐらい読もうよw
- 568 :
- >564
> どこまで bash でできるのかと思っただけだからね。気は済んだよ。
bashでってわざわざ書いてあるってことは
POSIXシェルでの実装は断念したってこと?
- 569 :
- >>565
それなw 文字列の比較が難しいって話をしてるのに
漢数字の比較なら簡単って言っても何の解決にもなってないというか
自分で問題を変更して実装したで(どや)ってされてもなぁw
- 570 :
- 何でもかんでも否定したいだけの子ってよく言ったものだな
目的を果たしているんだからそんなアホな条件にそう気は全くないね(そもそも設問がアホというのも気づいてないみたいだし)
自分がどうしつこく繰り返してたことも忘れたらしいのによく言うよ
- 571 :
- >>569
そんな事どうでもいいから早く>>546と>>549の回答よろしく
- 572 :
- 回答するなら、一般的に使われるであろう漢数字の比較も出してくれたらいいな
変な条件内の使い道のないようなのでない。簡単と言われて文句つけられるんだから簡単だろうw
とりあえず >>571の言う通りお手並み拝見
- 573 :
- >>568
断念も何も、考えてすらいないよ。
「bash でやってみる」がテーマなんだから当たり前だろう?
お前の寝言に付き合ってるわけじゃないんだよ。
一応、やってみた感想を述べるなら
「すげーな bash 。でもやっぱりこれはシェルの仕事じゃないな。」
ってとこかな。
それでも楽しめたし多少なりとも bash を理解できたんだからそれでいいんだよ!
- 574 :
- 回答よろしくってここはお前のお庭じゃねーんだぞw
なにお山の大将気取ってんだ
- 575 :
- どうやらコンセンサスを得られたようだからな
もう一回いうぞ。漢数字の比較の話は
関係ないし誰も求めてないから黙れ、口を閉じろ
bashとPOSIXシェルの違いがわかってないやつが
いるが、bashは許可していない。
文字列の比較はbashで簡単できる(= シェルスクリプトでやるような仕事)
これをPOSIXシェルだけで外部コマンド呼び出し
なしで出来ないかというのがもともとの質問だ
二度とシェルスクリプト以外の話をするなよ
- 576 :
- >>575
だから俺が求めてるんだけども
- 577 :
- >>574
誰に言っているのかわからんな。ID:jXb4UL4k になら、問題出したんだから答えも出して締めてという一般的なことかな
わかりやすくは、回答ではなく解答なんだろうけど。だからヤツも変に間違って>>569なんてアホなレスしてしまったし
まあ、解答ではなく回答の方がやっぱり正しいのかもだがw
- 578 :
- あれだけ最後の方で答えないとか粘っていたのに「関係ないし誰も求めてないから黙れ、口を閉じろ」だって...w
脳みそのメモリ足りなさすぎだろうw
シェルスクリプトはグルー言語とも言われ、コマンドを使うのは普通なので、馬鹿な言い分は聞く必要性は全くないな。shell builtin の意味すら知らなさそう
口を開くほど馬鹿を晒す馬鹿って感じ
- 579 :
- >>575
つうか
>これをPOSIXシェルだけで外部コマンド呼び出し
>なしで出来ないかというのがもともとの質問だ
できない
で終わってんだろこの話
なんでいつまでも出来ない話に粘着してんの?
出来ないことを証明しろとか、キチガイの戯言を言いつのりたいだけなの?
- 580 :
- ああ、もしかして変なの二人いたりするのかな??
だとしたら、勘弁してくれ。アホなことを言うのは一人で十分w
- 581 :
- >>579
できるんだけどなw
: > "いろは"
: > "あいう"
echo *
- 582 :
- $ vi 29581.sh
$ sh 29581.sh
29581.sh あいう いろは
ってなったけど?
- 583 :
- >>582
な?できたろw
- 584 :
- これは文字列の比較ではないなー
お前バカだろ
こんなしょうもないことで>>431から延々とスレを荒らしたのか
- 585 :
- 実用性の欠けらも無いのが大好きだな
それなりにスキルがあってなぞなぞ好きならまだしも。スキル磨けよw
- 586 :
- スキル
- 587 :
- >>580
いや,多分「マジで頭おかしい」のは一人。
もう一人もしくは二人くらい,そいつの煽りに乗せられてちょっとキレ気味なレスバを繰り広げてしまっている。
IDやワッチョイを集団でNG指定できる掲示板だったらよかったんだけどなぁ……。
- 588 :
- NG指定すると、そいつの書き込みが見えなくなるから、
そいつの書き込みに「下らないレスを付けるやつ」が減る。
- 589 :
- >>587
ちょっと安心したwいろいろと。どうも
匿名掲示板だからねえ。それが好きで使ってるのもあるしね、まあ、しょうがない
- 590 :2019/05/19
- 集団NGというか共有NGはPCだと無縁だからねぇ
【Alloy】形式言語による仕様記述【VDM】
JavaScript情報交換所(プログラミング既習者専用)
大唐吐蕃回廊漢宮秋月康秀華南京都大白微宮廷記
MFC vs .NET
関数型プログラミング言語Haskell Part31
プログラミング言語 Rust 4【ワッチョイ】
メガデモを語る fr-08
Ruby 初心者スレッド Part 66
結局開発で最も大切なのはテーブルの正規化と制約
プログラミング言語の難易度ランク作りました ご覧ください
--------------------
劇場版「ドラゴンボール超 ブロリー」★42
日焼けした東方キャラ
天才バレエ・ダンサー★ラスタ・トーマス★
TAKARAZUKA SKY STAGEってどうよ?【94】
【うにょ〜】オンド・マルトノ【ピポパブ】
30代 こいつ童貞じゃね?ってヤツの特徴
【独立】ボトラーズモルトを語ろう 29本目【瓶詰】
爆笑太田「コロナ対策で野党は与党と一時休戦すべき。東日本大震災の時は安倍さんの菅直人さんへのデマがあった」 [385687124]
【薬学部】薬学科6年生のスレ【6年制薬剤師】
ウイニング競馬のミシェル美人過ぎワロタwwwwwwwwwwww
【ボクコネ】こんにちわ私立恵比寿中学の小林歌穂です( ̄? ̄)【テクノカットより120カット】
【Tポイント】Yahoo ! ショッピング289
【荒川と下山のせいで】電撃戦隊チェンジマン11【ゴーカイでは踏み台】
漫画雑誌の懸賞(当たったら報告) PART76
興行収入を見守るスレ3464
【マクロスΔ】ワルキューレ総合スレ 44曲目
【疑問】ハーレー初心者スレ31 【質問】
歴代主人公が兄弟だったらPart99
【概念】保険制度【組織詐欺】
俺は悟った。本命党は控除率に負ける
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼