X



シェルスクリプト総合 その29
レス数が1000を超えています。これ以上書き込みはできません。
0002デフォルトの名無しさん
垢版 |
2018/09/21(金) 23:36:59.94ID:/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オプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
0003デフォルトの名無しさん
垢版 |
2018/09/21(金) 23:39:20.07ID:/eJt2TVD
初心者へのアドバイス
・適した道具を判断するのも頭の重要な使い方。
 シェルスクリプトよりもPerlまたはPythonの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらman(1)を引きましょう。
・思い通りに動かないときは、まずはsh(1)の-xオプションでトレースしましょう。

回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに、「そういうのはPerl, Python使え」と回答するのはやめましょう。
 安易にPerlやPythonに逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。
0004デフォルトの名無しさん
垢版 |
2018/09/21(金) 23:45:34.73ID:/eJt2TVD
次スレを立てる時は>>1の本文の先頭に以下を追加して下さい。
!extend:on:vvvvv:1000:512

という注意書きを>>1の先頭に追加してください。
0008デフォルトの名無しさん
垢版 |
2019/02/09(土) 15:41:36.60ID:6/bHpQ6m
回線って言葉の定義によるが、今どきの優先での光とかでも回線とは言う。光回線とかね。
0009デフォルトの名無しさん
垢版 |
2019/02/09(土) 15:41:50.96ID:6/bHpQ6m
優先じゃなくて有線
0010デフォルトの名無しさん
垢版 |
2019/02/09(土) 22:28:27.73ID:ksUvHKJZ
printfのフォーマットについてなんだけど
printf '%05d' '33' → 00033
みたいなゼロ埋めってどのシステムでもサポートされているのかな。
%5dみたいな記述はPOSIXの仕様書に在ったから確実だけど
ゼロ埋めフラグについて何の言及もしてないっぽいんだよね。
%gとかと違って「実装を要求しない」とも言っていないし。
0013デフォルトの名無しさん
垢版 |
2019/02/16(土) 00:07:44.70ID:FAU3Sbcr
自決か・・・
0014デフォルトの名無しさん
垢版 |
2019/02/16(土) 01:21:53.36ID:SPTGalft
>>11
なんて書いてあった?
シェルのバージョンによっては8進数しか
受け付けなかったりするんだよねー
0015デフォルトの名無しさん
垢版 |
2019/02/16(土) 01:31:05.83ID:k5VPqkkr
シェルスクリプトで数値を扱うのがおかしい。シェルスクリプトは文字として認識しているから、もともと数値の取り扱いは気をつけないといけない。
0016デフォルトの名無しさん
垢版 |
2019/02/16(土) 01:35:36.86ID:SPTGalft
そんな事言われましても、シェルスクリプトに
数値計算の機能がありますし
0017デフォルトの名無しさん
垢版 |
2019/02/16(土) 02:04:59.47ID:k5VPqkkr
>>16
シェルスクリプトそのものにはもともと計算機能は存在しないよ。

shは計算コマンドでの対応しかできない。
0018デフォルトの名無しさん
垢版 |
2019/02/16(土) 06:28:35.63ID:OVG8+uJO
>>14
なんか勘違いしてね?
俺が言ってるのは0フラグ。
pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html#tag_20_94_13

ちなみにprintf '%b' '\0ddd'はPOSIXでは8進数しか定められてない
のでその「8進数しか受け付けない」システムは正当。
0022デフォルトの名無しさん
垢版 |
2019/02/16(土) 14:10:14.71ID:DdK+9zEs
    〃〃∩  _, ,_
     ⊂⌒( つД´) < ヤダヤダ
       `ヽ_ ノ ⊂ノ
              ジタバタ
0023デフォルトの名無しさん
垢版 |
2019/02/16(土) 15:55:59.02ID:FAU3Sbcr
昔はよく expr コマンドを使ったものぢゃよ
0024デフォルトの名無しさん
垢版 |
2019/02/16(土) 16:39:46.54ID:MuF4+GQB
exprは(シェルによるけど)grepみたいな正規表現が単語に対して使えるからすごく重宝してた。
でも最近はそもそもそういう非可搬な機能を使うならbashの[[ <str> ~= "/regexp/" ]]でいいやってなってる。
0026デフォルトの名無しさん
垢版 |
2019/02/21(木) 04:19:12.64ID:LAfLZLuz
そっちには特定のOSでしか動かないで存在しないのが入ってるからじゃね。特定のOSの板かスレが相応しいのだろう
0027デフォルトの名無しさん
垢版 |
2019/02/21(木) 04:24:39.60ID:LAfLZLuz
ああ、特定のOSでしかでもないのか。じゃ、すでに専用スレあるのでってとこか。言葉が違うのに混ぜることもないだろしな
0029デフォルトの名無しさん
垢版 |
2019/02/23(土) 13:42:47.53ID:9pS68leH
月経の文字に反応
0030デフォルトの名無しさん
垢版 |
2019/02/25(月) 15:22:22.19ID:uN5/G9fw
受け取った文字列が想定しているものかを判定する場合で
「特定の種類の文字のみ構成されている」かを調べる方法として
↓こういうのを考えてみた
test "$VAR" = "${VAR#*[^a-z]}"
成功したらVARは[a-z]のみで構成されているということ。
あと一応POSIX 2018にも準拠してる。

grep(1)などを用いて処理するより早いと思うんだが
最近のPCは処理が速すぎて今一違いが分からんw
0031デフォルトの名無しさん
垢版 |
2019/02/25(月) 15:46:48.84ID:jjF3mg4o
case $VAR in
 *[^a-z]*) ;; # a-z以外の文字がある
 *) ;; # a-zのみで構成
esac

でいいやろ?
置換処理しないから更に速いはず
0032デフォルトの名無しさん
垢版 |
2019/03/17(日) 00:42:11.09ID:vYpDkOnV
foo() {
echo 1
echo
echo
echo
}
a="$(foo)"
echo "$a"


ってやったら、最後に改行がいくつあっても消えちゃうんだけどさ
aに改行ごと入れる方法ない?bash依存なしで
0033デフォルトの名無しさん
垢版 |
2019/03/17(日) 01:22:55.25ID:MBTcz8WL
>>32
a="$(foo; echo @)"
a="${a%@}"
0034デフォルトの名無しさん
垢版 |
2019/03/17(日) 22:55:33.85ID:8/J7EWL3
$ ( a="a,,b,,c"; IFS=","; set -- $a; echo $3; )
b

$ ( a="a b c"; IFS=" "; set -- $a; echo $3; )
c


なんでや?
0043デフォルトの名無しさん
垢版 |
2019/03/18(月) 03:39:03.36ID:0Zzw4/NV
あぁ、ブラウザで見るとスペースが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個> も同様
0044デフォルトの名無しさん
垢版 |
2019/03/18(月) 03:41:08.39ID:YXzanjRe
やっぱり、元のヤツか。>>40といい独特というか視野が狭いというか思考理解力が狭いな
>>36が答えでもう終わってるだろうに
0046デフォルトの名無しさん
垢版 |
2019/03/21(木) 22:56:46.84ID:RZb/N1K/
シェルスクリプトにヒアドキュメントって
"HERE" でも 'HERE' でも変数展開行われないのか・・・
"HERE" は HERE と同じだと思っていた
0051デフォルトの名無しさん
垢版 |
2019/03/22(金) 11:57:50.97ID:g5h3mGP7
a = <<"EOT"

EOT

Ruby では、" " なら、バックスラッシュ・式展開が使える。
' ' なら使えない
0052デフォルトの名無しさん
垢版 |
2019/03/22(金) 12:46:19.30ID:eOBuYNEJ
ヒアの中身の話をしてるんじゃないのか?
なんだかrubyとかやってる人ってとんちんかんな人多いよなあ
0055デフォルトの名無しさん
垢版 |
2019/03/22(金) 22:38:33.79ID:z9ChYb8e
あー、もしかして、ヒアドキュメントが
他の言語にもあるって知らない人かな?
もう少し勉強したほうが良いよ
0057デフォルトの名無しさん
垢版 |
2019/03/22(金) 23:42:28.23ID:HU9xhxJ/
この件は別に他の言語での知識経験から故にで全然おかしくないだろう
単にそう思ったのはそうだったのかで済む話でしかないだろうに。何を拘っているんだか
0058デフォルトの名無しさん
垢版 |
2019/03/22(金) 23:44:22.75ID:eOBuYNEJ
環境によって頭を切り替えられない馬鹿だという告白ってこと?
それならまあ納得なのだが。
0059デフォルトの名無しさん
垢版 |
2019/03/22(金) 23:48:13.41ID:HU9xhxJ/
なにを言っているんだか。単に「よく」調べないで経験則で思い込んでいたってだけだろう。そういう人もいてもおかしくはないだろう
誰かのように、どうも最初から馬鹿にしたいだけなら違うんだろうけどな
0060デフォルトの名無しさん
垢版 |
2019/03/23(土) 11:21:25.87ID:V0vJvcu9
「普通は」他の言語の知識があるわけで、
他の言語がそうだったから、シェルスクリプトでもそうだと
思ったのに違っていて驚いたってだけの話だろ

なんで言語が変わったら、0から言語仕様を勉強します。
以前の言語の知識は全て捨てて、最初から学び直しますってなるんだ?
文法は「知らない」 or 「間違いなく知ってる」 のどちらかしか無いはずなんです。
「他の言語がそうだったから、同じだろう」なんて思うやつなんてありえないんです。
そう考えてるのか?そんなやついないだろ。
0061デフォルトの名無しさん
垢版 |
2019/03/23(土) 12:19:57.25ID:O+DUttYl
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\
0062デフォルトの名無しさん
垢版 |
2019/03/23(土) 12:27:43.57ID:daYwWoP0
たかが>>46の独白(?)に何をそんなに必死になっているんだか
何かが気に食わなかったのだろうな>>46のレスの内容ではなくて
0063デフォルトの名無しさん
垢版 |
2019/03/23(土) 13:51:52.81ID:V0vJvcu9
1. シェルスクリプトの仕様に文句言われて悔しい
2. 俺にとっての常識が、井の中の蛙だとばれて悔しい

どっちか
0067デフォルトの名無しさん
垢版 |
2019/03/23(土) 14:51:13.97ID:daYwWoP0
>>66
えーっ、おれが馬鹿を晒してしまったやんけっ
なにを長文で、わかりづらいネチっこい最後の部分。あんたのスタンスなんぞがわかっているのが居るんだからなにをわざわざな...もう
まあ、すまんかった、いろいろと
0069デフォルトの名無しさん
垢版 |
2019/03/23(土) 18:12:02.34ID:V0vJvcu9
理由が書いてないものに意味はないよ。
ばーかばーかっていってるのと同じだからね
0071デフォルトの名無しさん
垢版 |
2019/03/23(土) 23:36:39.28ID:xoOtakOI
やれやれ、延長戦か。昨日ので終わってれば普通のまともな人に見えたのに。
0072デフォルトの名無しさん
垢版 |
2019/03/24(日) 11:30:58.75ID:WkQ3cHj8
ジョブって使ったことあります?
fgとかbgぐらいはあると思うんですが、
そういうのってコマンドラインじゃなくて
シェルスクリプトで使うことって考えられますかね?
0073デフォルトの名無しさん
垢版 |
2019/03/25(月) 08:32:22.35ID:Gker1m8S
俺はないけど
単に経験が浅いだけかも知れない

ただ,似非の非同期処理として,ネットワーク資源をwgetなんかで取得しているジョブと同時に
その資源に依存しない種々の作業を同時に実行して,
その資源が必要になった段階でwaitコマンドでwgetの終了を待つ,
みたいなことはよくやる。
0075デフォルトの名無しさん
垢版 |
2019/03/29(金) 08:09:44.39ID:iZJL5S3u
いいや
シグナルに対してハンドラが無い場合死ぬのであって、trapしてんだか死なない
0076デフォルトの名無しさん
垢版 |
2019/03/29(金) 10:51:28.75ID:KhBeLwdl
いや死ぬんだが? これ実行してみ

[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"
0077デフォルトの名無しさん
垢版 |
2019/03/29(金) 14:30:15.21ID:iZJL5S3u
ただの正常終了、main.sh処理全部終わりましたでしょがー
意図した動きになるようには書いてないだけでしょう
0078デフォルトの名無しさん
垢版 |
2019/03/29(金) 15:51:57.16ID:KhBeLwdl
>>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
0080デフォルトの名無しさん
垢版 |
2019/03/29(金) 16:07:09.38ID:KhBeLwdl
>>79
はいどうぞ。

wait [n ...]
n が与え
られていない場合には、現在アクティブな全ての子プロセスを wait し、 返却ステータスは 0 となります。


疑問点があれば受け付けますよ?
0081デフォルトの名無しさん
垢版 |
2019/03/29(金) 16:08:06.24ID:iZJL5S3u
なんか続きそうでメンドくさくなった
ただの正常終了、「main.sh処理全部終わりました」
だよ。
wait
じゃなくて
until wait
do
:
done
とかだろう。どう意図した動きにしたいのか知らんけど、間違いは
0084デフォルトの名無しさん
垢版 |
2019/03/29(金) 16:16:44.69ID:iZJL5S3u
「シグナルんとこ読みなさい」だよ。くそがw
よく笑ってるな。まじでなんなん?ただのプライドが高いアレか
0085デフォルトの名無しさん
垢版 |
2019/03/29(金) 23:35:25.52ID:6TL4Muj2
どこまで本気なのかなあ。
小学生が頭の悪そうななぞなぞで得意がってるとか、そういう雰囲気を感じる。
とりあえず
「シグナルで死んだんなら、なんで echo が実行されてんだよ!」
とつっこんでおくよ。
0086デフォルトの名無しさん
垢版 |
2019/03/30(土) 15:21:37.81ID:iJ+PacLA
シグナルで死んでるんじゃなくて全てのプロセスが終了する前に wait から抜けちゃうってことだな。
理由はシグナル受け取っているからだが。
0087デフォルトの名無しさん
垢版 |
2019/03/30(土) 23:21:26.53ID:s3xILrfA
Ruby のSignal モジュールを使え

割り込み : Ctrl + C

Signal.trap("INT") { |signo| puts Signal.signame(signo) }
Process.kill("INT", 0)
0092デフォルトの名無しさん
垢版 |
2019/04/01(月) 08:49:30.39ID:IKNNLLYB
へー、取得したいのは最初の一個だけでいいんだけど、
その最初の一個は、小さいものになるんか

というか、一個だけ取得する速い方法ないかな?
でもソートしてるなら、結局内部で全部読み込むのか?
0096デフォルトの名無しさん
垢版 |
2019/04/04(木) 00:24:00.86ID:opkeFDjY
1.txt, 2.txt, 3.txt と3つファイルがあるディレクトリでecho * したら
これらのファイルがでてくるのに空のディレクトリで、
echo * したら * と表示されるのなんで?
何も表示されないでほしいんだけど、この仕様、なにか便利なの?
0098デフォルトの名無しさん
垢版 |
2019/04/04(木) 03:21:22.66ID:xQGJKB0I
エコーさんはね、もらったものをエコーするだけだってね、ママがいってたの
0104デフォルトの名無しさん
垢版 |
2019/04/04(木) 15:08:08.53ID:vligoyoR
>>102
echo は渡された文字列をそのまま出力する仕様なので、* を渡されたら * が出力される。というのが回答だよ。
0105デフォルトの名無しさん
垢版 |
2019/04/04(木) 16:46:44.95ID:/xpppM3k
まあ、「'*' はいらない」というのももっともなことだしね。
bash を使ってるなら man の「パス名展開」の項を読めばいいかも。
bash じゃない場合は…読めばなんとかなるでしょ。
0111デフォルトの名無しさん
垢版 |
2019/04/04(木) 19:23:19.35ID:opkeFDjY
最近、無いものをあると言いはるのが増えてるのか?
無いものはいくら探してもないし、
有るならさっと出すことぐらいできるだろ
0112デフォルトの名無しさん
垢版 |
2019/04/04(木) 19:24:58.44ID:19nHnpBp
なんかいたね、ちょっと前のシグナルの質問してたのとか
煽って自分では労力さかずに答え出させようしてんの?w
0116デフォルトの名無しさん
垢版 |
2019/04/04(木) 20:21:01.39ID:19nHnpBp
マンザイとしてはそれはないな。オモロクないやん、マンザイとして。いい感じだったのにw

その言い張り方が、なんか既視感ありすぎ。そしてよく「言いはるのが増えてるのか」なんて言えるなあ
まあ、ふんわりとした答えは>>99で答えてるんだけどね。それはmanに書いてた説明からだよ
ところでOSなに使ってるの?
0117デフォルトの名無しさん
垢版 |
2019/04/04(木) 20:24:57.07ID:opkeFDjY
catが困るのは、単にcatの仕様がクソってだけだろう
標準入力から読み込むためのオプションの - があるのに、
引数なしだと標準入力から読み込もうとするわけだから
0118デフォルトの名無しさん
垢版 |
2019/04/04(木) 20:28:22.13ID:19nHnpBp
浅いな、catは一例なのに
そのやたらプライド高そうだけど、全然そのプライドを裏付けるもの無いから、こんなことになってんやで?まあ、プライド高いから言ってもわからんだろけど

ちなみに、'*'でなくて''でもよさげなんだけど、'*'の方がやっぱりいいんだな(と、思う。そう具体的に書いてない、''に言及してはいないけど)。さて、どうしてでしょう?
0119デフォルトの名無しさん
垢版 |
2019/04/04(木) 20:45:06.72ID:opkeFDjY
> さて、どうしてでしょう?

お前にその答えが言えんの? *の方が良いと思ってるようだが、
正確にはディレクトリが空の時に帰ってくるのは、正確には*じゃないんだが
0120デフォルトの名無しさん
垢版 |
2019/04/04(木) 20:49:41.59ID:19nHnpBp
うん、>>117なんて宣える人にそう言われてたくないけど。やっぱ想像はつかないのね。なのになんで疑われているのかさっぱり。また煽って喋らせる手法?w

正確にはってのはイミフ。なんの正確?なにを言いたいのかイミフだがほぼデフォルトの環境ではそうだよ、てか、そう決められているはずなんだがなあ
0121デフォルトの名無しさん
垢版 |
2019/04/04(木) 20:54:08.11ID:opkeFDjY
聞いてるのは、決められているかどうかじゃなくて
なぜそういう風に決めたかだって言ってるだろ
0122デフォルトの名無しさん
垢版 |
2019/04/04(木) 20:55:07.83ID:opkeFDjY
だいたい、俺の想像していることがわかってない時点で
お前はダメダメなんやで?わかってるか?

俺の想像していることぐらい読み取れ!
0123デフォルトの名無しさん
垢版 |
2019/04/04(木) 20:56:45.08ID:opkeFDjY
ディレクトリが空の時に帰ってくるのは * ではありません。
echo ? だと ? が帰ってきます。
0124デフォルトの名無しさん
垢版 |
2019/04/04(木) 20:58:07.29ID:opkeFDjY
echo *[a-z]* だと *[a-z]* が帰ってきますが、

さて、このディレクトリは空でしょうか?
それとも *[a-z]* という名前のファイルがあるのでしょうか?
0125デフォルトの名無しさん
垢版 |
2019/04/04(木) 20:58:24.17ID:19nHnpBp
だから、なぜそういう風に決められたかっていうことをずーーっと言っているんだけど?
あんたが自分勝手な自分だけの思いで自分の考えに固執してるから先に進んでないんだけなのに。既視感ありまくりw

'*'の方がいいとまでちょっと進んで言っているのに聞かないで反発してるだけだし。答えは書いてある。さあ、理解に向けて進んでみようw
0126デフォルトの名無しさん
垢版 |
2019/04/04(木) 21:02:36.29ID:19nHnpBp
>>123,124
そりゃそうだ。根本的に勘違いしてる。*なんだから'*'、?なんだから'?'、[a-z]*なんだから'[a-z]*'でしょに。なにを言っているのだか

なんで、ますますプライドを裏打ちするものが無いって自ら開陳するかなあ。捨てなその意味ないプライドは。文字通りプライドが邪魔する(意味が違うか?w)でしょうに
0128デフォルトの名無しさん
垢版 |
2019/04/04(木) 21:04:35.25ID:opkeFDjY
だから答えは書いてないって言ってるだろ

いい加減、悪魔の証明は辞めてくれ。
無いものは無い。無いという証拠を見つけられないなら
悪魔はいるってことだ!←ほんと馬鹿みたいだ
0129デフォルトの名無しさん
垢版 |
2019/04/04(木) 21:07:34.48ID:19nHnpBp
答えは書いてあるよ。ふんわりと。あんたに理解できるようには書いてないかもだけどwいや、プライド高いお人だからわかると思うんだけどということでw

悪魔の証明でもなんでもないのになあ。なんとか言わせたくて必死な感じ?通用しないよ何度もはw
0131デフォルトの名無しさん
垢版 |
2019/04/04(木) 21:09:37.50ID:19nHnpBp
>>127
俺のこと?違うよww わざとやってます。なんかオモロイから
なんで自分の労力を割くのが嫌いなくせに、まわーーーーーり道してんのかなあと。どこまで回り道すんのかなとw
0133デフォルトの名無しさん
垢版 |
2019/04/04(木) 21:46:57.92ID:gljFUA1G
もうどっちがどっちなのか分からんけど
グロブに関する疑問なら答えられそうなので,
最初の質問を教えてくれ。
0134デフォルトの名無しさん
垢版 |
2019/04/04(木) 21:49:48.14ID:19nHnpBp
ありゃりゃ。終わっちゃうかっw
親切だな。まあいいことだけど。ヤツにとっていいこととは思えないけど(余計なお世話)
0136デフォルトの名無しさん
垢版 |
2019/04/04(木) 22:06:28.63ID:opkeFDjY
>>133
echo * (別にechoである必要はない)で
ファイルが見つからない時になぜ * を返すのか?
そういう仕様にした理由
0137デフォルトの名無しさん
垢版 |
2019/04/04(木) 22:52:03.02ID:opkeFDjY
ありゃ? もうすぐ答え出るかと思ってひとっ風呂浴びてきたんだが
まだでてないや。誰か曰くmanに書いてあるらしいから
知らなくても答える気があるなら、答えられるはずなんだけどなー

な?書いてないだろ?
0138デフォルトの名無しさん
垢版 |
2019/04/04(木) 22:55:28.86ID:19nHnpBp
そこまで言い張ってあったらどうすの?いやあるんだけど
黙って逃げるだけの未来しか見えないw
0139デフォルトの名無しさん
垢版 |
2019/04/04(木) 23:03:19.00ID:opkeFDjY
じゃあ先に答えを言ってくれた人へ

ありがとう


これでもう黙って逃げるだけの未来はなくなりました。
0140デフォルトの名無しさん
垢版 |
2019/04/04(木) 23:04:43.01ID:19nHnpBp
やかましわっ、アホっw

なんでこうも強情というか自信満々なのかなあと、実際にあるのに書いてあるのを知っている方は思うんだよ
で、ここまで強情で自身満々故になのか逃げるだけかというのも透けて見えるんだよ

まあ、>>133のお人が答えてもらえるんだからもっと待ちなさいな
なんでそうも自己都合なんだかw。俺が>>133だったら答えるのやめるw。別に>>133のお人に答えるなとか風なことでではない、あくまでも俺だったらね
0142デフォルトの名無しさん
垢版 |
2019/04/04(木) 23:13:02.33ID:19nHnpBp
そうだよ?言われなくても、そうだよ?(すでに>>131で書いてあるやん?w)
なにを急に言い出してるの?それもあんたも律儀にレスしてんのに
0144デフォルトの名無しさん
垢版 |
2019/04/04(木) 23:17:24.59ID:19nHnpBp
いやいや、それを言うならあんたもだって。なんだかなあ。それに俺はちゃんと答えている(ふんわりと)、それにあーだこーだ言っているのはあんたなんですけど?どっちがよりでしょうねえ?
第三者から荒らしと言われてもしょうがないかと思うが、あんたが言い出すとは、まあ、先の「言い張る〜」と同じパターンやね

てかさ、せっかく>>133が出てきたのにそうやってなぜ流すようなことすんの?w
0147デフォルトの名無しさん
垢版 |
2019/04/08(月) 15:20:56.18ID:NNFII5Ih
横からだけど面倒臭いから答えを書いとくよ
bash なら man bash の Pathname Expansion に書かれてるから、それをちゃんと読んでから質問してね。
0148デフォルトの名無しさん
垢版 |
2019/04/08(月) 15:59:00.29ID:3hZl3Wdo
>>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'が設定されていても、 '..'は常に明示的に一致しなければなりません。
それ以外の場合は、「。」 文字は特別扱いされません。

ファイル名を一致させる場合、スラッシュ文字は常にパターン内のスラッシュと明示的に一致させる必要がありますが、
他の一致コンテキストでは、後述のように特殊なパターン文字と一致させることができます。
0149デフォルトの名無しさん
垢版 |
2019/04/08(月) 15:59:15.40ID:3hZl3Wdo
nocaseglob'、 'nullglob'、 'failglob'、および 'dotglob'オプションの説明については、* note The Shopt Builtin ::の 'shopt'の説明を参照してください。

'GLOBIGNORE'シェル変数はパターンにマッチするファイル名のセットを制限するために使用されるかもしれません。
「GLOBIGNORE」が設定されている場合、「GLOBIGNORE」のパターンの1つとも一致する各一致ファイル名は、一致リストから削除されます。
'nocaseglob'オプションが設定されている場合、 'GLOBIGNORE'のパターンとのマッチングは大文字小文字の区別なしに実行されます。
ファイル名 '。' 'GLOBIGNORE'が設定されていてヌルでない場合は、 '..'は常に無視されます。
ただし、 'GLOBIGNORE'をNULL以外の値に設定すると、 'dotglob'シェルオプションが有効になるので、他のすべてのファイル名は '。'で始まります。 一致します。
'。'で始まるファイル名を無視するという古い動作をするには、 '。*'を 'GLOBIGNORE'のパターンの1つにします。
'GLOBIGNORE'が設定されていない場合、 'dotglob'オプションは無効になります。
0151デフォルトの名無しさん
垢版 |
2019/04/08(月) 16:56:27.29ID:3hZl3Wdo
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である必要はない)で
ファイルが見つからない時になぜ * を返すのか?
そういう仕様にした理由
0152デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:06:51.60ID:6GvfotlI
なぜかは、
だいたいは、こんな感じ(だろうで)、
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がググれるよ
0155デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:16:06.60ID:6GvfotlI
エラーだもの。「エラーの方がわかりやすく」ってとこ?すまん変な文になった
そのままの方がわかりやすく(?)
かな。
0157デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:19:09.45ID:6GvfotlI
ああ、「どれがエラーとして適切?」もか。「どれもエラーだがどれが適切?」というつもりだったんだが。「どれもエラーだがどれがエラメッセージとして適切?」までか
0160デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:23:26.97ID:3hZl3Wdo
>>157
for i in *.txt; do rm "$i"; done
(すでに拡張子txtのファイルが全て削除されている場合)
rm: '*.txt' を削除できません: そのようなファイルやディレクトリはありません

これは適切なエラーメッセージだと思いますか?
0162デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:24:53.61ID:6GvfotlI
>>152の最後に書いてあるだろう。なんでいちいちいちいち教えなきゃならんのねん
コマンドとしては適切だろう
0163デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:27:49.54ID:6GvfotlI
>>161
いちいち教えてもらわなきゃならないのに、隙あらば文句つけるようなヤツに丁寧に教える必要はないってことだよ。社会的に一般的なことだなw
まあ、もともとはあんたに具体的に教えたくないから、あんたじゃない人に他にあるよと言ってみただけだな

てか、ぜんぜん進んでねーな。こんなやりとりしてもぜんぜん進まないよ?少しは頭を働かせて自力でやってみなさいな
0164デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:29:55.75ID:3hZl3Wdo
1. man bashにある
2. ありませんでした。
3. 他のmanにある
4. ありませんでした。

この流れか
0165デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:31:26.91ID:3hZl3Wdo
日本語に訳してあげないと、書いてないことを認めなかったくせに
何言ってるんだろうね。
0169デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:37:34.84ID:6GvfotlI
あんたが進まなだけだからな、別にあんたが進まないのは俺はどうでもいいんだけど、なにか進みたがってるあんたがどう動くのかが興味ありの
なんで俺にいちいちレスしてんの?w
0170デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:42:21.44ID:3hZl3Wdo
> なんで俺にいちいちレスしてんの?w

お前が言ってることが嘘だからだよ。
manにそういう仕様にした理由は書いてませんでした。
0172デフォルトの名無しさん
垢版 |
2019/04/08(月) 17:44:22.86ID:6GvfotlI
ちょっとは進んで(ID:3hZl3Wdo がヤツだとは思わなかったのでw)、>>152を書いてみたが、ヤツはやっぱり聞かないだけだったという
俺は単に最初からmanにあるとしか言ってない、man bashに言及してるのはあったけど(>>105ですでになのに、なんでいまごろなんだ?)、まあそこからでもたどり着くかなとw

>>164なんてお前の勝手な妄想解釈。あるよ本当に
(「言っちゃった」とちょっと悔しくもある。また、「言っちゃった」のになんで探せないないねんwwwここまで言えばさすが自分で探すか?)
0173デフォルトの名無しさん
垢版 |
2019/04/08(月) 18:02:56.45ID:6GvfotlI
探せたか?wwまあ、探せても「読めない」可能性が高いかな
・やっぱり、探せない
・探せたが、読めなくて文句つける
・探せて、黙って逃げる
・他
どれでしょう。まあこう書いたら「他」にする可能性が高いか
0174デフォルトの名無しさん
垢版 |
2019/04/08(月) 18:16:37.06ID:3hZl3Wdo
> なんでいまごろなんだ?

>>105の「パス名展開」の項にないのはわかっていて、そこにないと言ってるのに
性懲りもなく、>>147で「bash なら man bash の Pathname Expansion に書かれてるから」と
いうから、こいつ読んでないなってことで日本語に訳してあげたんだろ

そして
> ファイルが見つからない時になぜ * を返すのか?
> そういう仕様にした理由
は、そこに書いてないと同意取れたはずだが?

なんでそんな説明をせにゃいかんのよ?
0175デフォルトの名無しさん
垢版 |
2019/04/08(月) 18:23:16.92ID:6GvfotlI
「性懲りもなく」...「訳してあげた」んだろ
すんげええなあ、今までさんざん無能っぷりを自ら披露しているのにw 単によくレスを見なかった人がと考えはしないのね。自分がレスをよく見ないくせにw

お前のレスはぜーーーーんぶ自分内で完結している。こんな他人と交わらない方がいいんじゃないの?
呆れ果てるな。まあ、その自己の世界で妄想ダダ漏れすればいいと思うよ
0177デフォルトの名無しさん
垢版 |
2019/04/08(月) 18:28:18.84ID:6GvfotlI
そりゃ、否定するよ。矛盾自己肯定だらけだもの
もしかして、あんたって40超えたおっさんで外人にクソガキ呼ばわりされたことない?って気になったり。まあ、違うかw
0180デフォルトの名無しさん
垢版 |
2019/04/08(月) 18:37:29.49ID:6GvfotlI
いや、そういう(一部で有名な)有名人がいてな、あんたの属性が似すぎててな。幾つかは知らんが、あんたもそのうちそうなるだろうな
年意外同じだからw 年取ればそれが変わるわけでもないぞw
0182デフォルトの名無しさん
垢版 |
2019/04/08(月) 18:43:03.63ID:6GvfotlI
イミフ。なんで「嫌い」とかアホなこと言っているのだか。人のふり見て我がふり直すとかあるでしょ?そういう意味だよ、そういう有名人
誰ともわからないハズなのに「嫌い」とだけの理由にできるとは...さては...ww
0183デフォルトの名無しさん
垢版 |
2019/04/08(月) 18:45:02.15ID:3hZl3Wdo
はいはい。話戻すぜ。

ファイルが見つからない時になぜ * を返すのか?
そういう仕様にした理由
^^^^^^^^^^^^^^^^^^^^^^

manに書いてあるそーです。やつのたわごとを信じる人は
(ネットじゃなくて)manの中から探してみてください。
信じない or 信じたけど裏切られたら、
ここにmanの場所が書かれることはないでしょう(予言)
0185デフォルトの名無しさん
垢版 |
2019/04/08(月) 18:50:10.35ID:3hZl3Wdo
>>184
安心しろ。俺以外の人も見つけられない。
だからここに俺とお前以外の人間が書くこともない。
俺が言ってることが正しければな(笑)
0186デフォルトの名無しさん
垢版 |
2019/04/08(月) 18:56:04.68ID:6GvfotlI
ほんと「読めないのな」。よかったはそういう意味じゃない
わざとかと思えなくもないけど、いままでの「読めなさ」からはわざとではないとしか思えない

どう見ても、お前の都合のよいことだな、さすがだよ
場所のレスもらえればお前がいままで知りたかったことがわかり、黙って逃げるだけw(そこにお前の苦悩とかなさげ)
もらえなかったら、お前の中では自己肯定の補強にになるだけとういう。間違いでもな

しょうがないな、1ヶ月後に教えてやるよw何もなかったら1ヶ月後に、この話題はw
0189デフォルトの名無しさん
垢版 |
2019/04/08(月) 19:20:16.01ID:3hZl3Wdo
それまで別の話題でお会いしましょう(笑)

あ、他の人、manにないのは明らかなんで探さなくていいですよ〜w
時間の無駄でしょうし。
0191デフォルトの名無しさん
垢版 |
2019/04/08(月) 21:48:40.20ID:9U0C5XME
>>136
bashがそういう仕様にした理由は, shにあわせたからです.
shがそういう動作をする理由は, expand()が0をかえしたときはもとの引数文字列でmakearg()するようにつくられているからです. おそらく, そういう仕様をきめてからそういう動作をさせたわけではないとおもいます.
0192デフォルトの名無しさん
垢版 |
2019/04/08(月) 22:28:59.33ID:Ejuihx1D
ようやくまともなレスがw

>>191
その動き(expandやmakearg)はソースコードから?

補足しておくと俺は「"bashは"なぜそうしたのか?」とは
聞いてなくて、シェルスクリプト(元をたどればsh?)が
どうしてそういう動作をするのかの理由を聞いてる。

で、それは特に理由はないのかな?たまたま最初の実装した人が
あまり考えず、そうしましたぐらいの理由で。
だから理由を探しても見つからないと
0193デフォルトの名無しさん
垢版 |
2019/04/08(月) 22:36:01.12ID:Ejuihx1D
まとめ

for i in *.txt; do
 echo "$i"
done

何もファイルがないディレクトリで↑を実行すると
「*.txt」 というファイルが見つかったかのような動きをします。

「*.txt」というファイルだけがあるディレクトリで実行すると
全く同じように「*.txt」 というファイル名が表示されます。

つまり空ディレクトリでも「*.txt」というファイルがあっても
表示結果が全く同じになります。これは驚き最小の原則に反しています。
0196デフォルトの名無しさん
垢版 |
2019/04/08(月) 23:37:03.41ID:8H4AhNTa
>>194
これを読んでも同じ結論になるわけだけど

> 先に与えた、わかりやすく簡単なルール、 「ワイルドカードパターンをマッチしたパス名のリストに展開する」と言うのは、
> オリジナルの UNIX における定義であった。 これはパターンが空のリストに展開されることも許可されていた。 例えば

> において、*.gif ファイルが全くない場合でも、 これは空のリストに展開されるため、エラーにならない。
> しかし POSIX では、文法的に正しくないパターンや、 マッチがなかったパターンは、 そのまま変更されずに残されることになっている。

なぜ、わかり易く簡単なルールを捨てて、POSIXでは「そのまま変更されずに残されることになっている。 」を
選んだのかが書かれてないんだよね。
0197デフォルトの名無しさん
垢版 |
2019/04/08(月) 23:45:50.70ID:Ih2qq+NP
・探せたが、読めなくて文句つける
か... 探してじゃなくてっぽいけどw
書いてあることが。読めれば」>>152もわかるだろうに。どういう意味で言ったかわからん最小の原則wとかやらにあっているだろう

まあ、単に「認めたくない」だけだろな
何か他にファイルなどがあるとこで、*.hogeなんてファイルがなかったとしよう、
ls *.hoge
でどう動くのが望ましい?この例「だけ」に噛み付くのじゃなく、ちゃんと頭を使って考えような
0198デフォルトの名無しさん
垢版 |
2019/04/08(月) 23:50:01.35ID:8H4AhNTa
>>197

1. 見つからない場合はエラーとなってls自体が実行されない
2. ls "" とみなされる

のどちらかだろうな。

次はあんたが、頭を使ってレスしてくれなw
0199デフォルトの名無しさん
垢版 |
2019/04/08(月) 23:52:32.47ID:8H4AhNTa
>>197
ついでだから、ファイルが見つからない時

for i in *.txt; do
 echo "$i"
done

はどう動くのが望ましいか書いてくれよ。
今の動きや仕様を書くんじゃなくて
どう動くのが望ましいかをね
0200デフォルトの名無しさん
垢版 |
2019/04/08(月) 23:53:17.08ID:Ih2qq+NP
ほんとに脊髄だけで、頭使わないのな
POSIXはシェルスクリプトだけを考えてるわけではないのだよ
ls *.a *.c *.c
で、どれかがあってどれかが無い場合の動作は?よくそれで頭使ってる風に言えるもんだ。
0203デフォルトの名無しさん
垢版 |
2019/04/08(月) 23:55:27.24ID:8H4AhNTa
空のディレクトリで実行するとこうなるのかw

$ ls *.a *.c *.c
ls: '*.a' にアクセスできません: そのようなファイルやディレクトリはありません
ls: '*.c' にアクセスできません: そのようなファイルやディレクトリはありません
ls: '*.c' にアクセスできません: そのようなファイルやディレクトリはありません
0205デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:00:36.62ID:cRtn1aSe
>>202
そうだね。ファイルが見つからないときは
ちゃんと空のリストを返してくれる。
シェルスクリプトのように、「*」を返すことはないね。

irb(main):001:0> Dir.glob('*')
=> []
0207デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:01:53.02ID:b0dEtQwc
まだ、ゴネてる。自分の思ったようにならないってだけでよくそれだけ粘れるな
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
イミフ。なにを言いたいの?

なんで、いちいちいちいちいちいち説明教えなきゃならいないねん
0210デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:15:06.05ID:b0dEtQwc
その例だけなら、回らないのが望ましいだろな。だが、POSIXはシェルスクリプトだけを考えてるわけではないからしょうがないうちだろな
で?
0211デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:16:54.68ID:b0dEtQwc
>>209
何を言いたいのかわからんな。どゆこと?まさか「正確」と同じパターンじゃないよな?その気しか思えないので具体的に言って
0212デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:18:30.84ID:cRtn1aSe
ついでにPHPの場合

$ php -r "print_r(glob('*'));"
Array
(
)

Perlの場合
perl -MData::Dumper -e 'print Dumper [glob "*"]'
$VAR1 = [];

Rubyと同じく、見つからない場合は
デフォルトでは空のリストが帰ってくる。
0213デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:19:17.64ID:cRtn1aSe
>>210
さっきから

> POSIXはシェルスクリプトだけを考えてるわけではないから

を繰り返してるけど、シェルスクリプト以外とは何の話をしてるの?
そして、シェルスクリプト以外ではどうだって言いたいの?
0214デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:20:20.88ID:cRtn1aSe
>>211
だからお前、"lsの場合では" *だったらエラーがわかりやすいって言ってるだけじゃん。

forの場合では、当てはまらないじゃん。
0217デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:24:19.08ID:b0dEtQwc
>>214
ああ、なんだ「シェルスクリプト」の(それも特定な)場合か。「ls」なんて言ってるから他のコマンドとかと思ったぞ
POSIXはシェルスクリプトだけを考えてるわけではないからw
話にならない、POSIXを勉強して出直してね
0219デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:25:50.97ID:b0dEtQwc
>>216
逃げるも何も「文句をつける対象を理解してない」のにどう相手をすれと?あんたにこれ以上こまごまこまごま教えてなきゃならんのか?
だったら、逃げるよ
0220デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:26:21.07ID:cRtn1aSe
POSIXはシェルスクリプトだけを〜とか、じゃあC言語のことなんですかねぇ
でもC言語でも空のディレクトリで * が返ってくることはないし
ほんと何が言いたいんだかw
0221デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:27:47.89ID:cRtn1aSe
POSIXはシェルスクリプトだけを考えてるわけではないから

→ Ruby・・・空の配列を返す
→ Perl・・・空の配列を返す
→ PHP・・・空の配列を返す
→ C言語・・・空の配列を返す

シェルスクリプト以外は空の配列を返します。
0226デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:31:21.79ID:b0dEtQwc
Supports rule 3 in the Shell and Utilities volume of IEEE Std 1003.1-2001, Section 2.13.3, Patterns Used for Filename Expansion.
0228デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:32:37.61ID:cRtn1aSe
>>226
何度も言ってるが、
俺が聞いているのは、そういう仕様にした"理由"であって
仕様の場所は聞いてはいない。

ほんと、脊髄反射しかしねーなw
0229デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:34:36.17ID:b0dEtQwc
>>228
言っているけど。「読めれば」そう書いてあるんだけどな。「読めない読めない」言われてもしょうがない
あんただって、「空」だったらマズいときもあるって認めてるやん
本当にただただ「認めたくない」だけなんだな。その「コロ」っとあんたの原点に戻るあたり
まあ、がんばりや
0230デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:35:06.66ID:cRtn1aSe
そして面白いのが、シェルスクリプトは glob で見つからない場合に
検索パターンを返すのに対して、シェルスクリプト以外では
見つからない場合に、空のリストを返すって所だな。
0231デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:37:41.48ID:cRtn1aSe
>>229
お前、マズイときもあるし、マズくない時もあるって
自分で認めてるやんw

ということはお前の主張は、所詮マズイときの例でしかなく
マズくない時には当てはまらないってことになるんだぞ
わかってるのか?お前の主張が崩れてるの

で、シェルスクリプト以外は空のリストを返しているのに
シェルスクリプトだけは、見つからなかった時に * という
文字列を返すという仕様にした理由は?
0232デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:39:30.00ID:cRtn1aSe
結局、一番マトモな理由は >>191が書いた

> おそらく, そういう仕様をきめてからそういう動作をさせたわけではないとおもいます.

これだけなんだよな。特に理由はない。
(深く考えずに)そうしてしまった。

もちろん、正式なドキュメントとして
この理由が、書かれている文書は見つかってないがね。
0233デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:42:08.93ID:cRtn1aSe
あ、みなさん。もし ID:b0dEtQwc を擁護したい人がいるならば
ID:b0dEtQwc が示したドキュメントの中から、
「そういう仕様にした"理由"」を書いてある所を指摘して構わないんですよ?

ないでしょう? 誰も指摘しないもんね。それが証拠だよ。
0234デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:42:13.89ID:b0dEtQwc
何言っているの?
>この仕様、なにか便利なの?
が、お前の原点だろ?それ以後「認めなたくない」のであーだこーだ言っているだけだな
0236デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:46:08.72ID:cRtn1aSe
>>234
ちゃんと流れを読むように

107 自分:デフォルトの名無しさん[sage] 投稿日:2019/04/04(木) 17:59:04.72 ID:opkeFDjY [4/21]
>>104
聞いてるのは仕様ではなくて、
どうしてそうしたかの理由です。
0237デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:50:22.73ID:b0dEtQwc
>>236
流れというかレスを読めないあんたに言われたくないw
いや、原点の話でしかないな。あんたの都合に(それもあんたの都合の良いようになだけな)合わせる必要性はこれっぽちもないな
とりあえず、原点の問題は解消した&マズい場合もあるそれが理由ってことも解消したってことで、おしまい
0238デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:51:41.47ID:cRtn1aSe
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/glob.7.html

> において、*.gif ファイルが全くない場合でも、 これは空のリストに展開されるため、エラーにならない。
> しかし POSIX では、文法的に正しくないパターンや、 マッチがなかったパターンは、 そのまま変更されずに残されることになっている。
> bash では、次のコマンドで昔からの振る舞いに設定することができる。
>
> shopt -s nullglob

なぜ昔からの振る舞いから替えたのか?その理由が謎
(理由を明確に述べているドキュメントがない)
0240デフォルトの名無しさん
垢版 |
2019/04/09(火) 00:54:45.59ID:cRtn1aSe
> POSIXはシェルスクリプトだけを考えてるわけではないから

↑これも結局何が言いたいのか不明だったな
まあ、何も考えずに(調べずに)シェルスクリプト以外の言語でも
* を返してるはずだって思い込んだんだろうなw
(実際には見つからない場合は空のリストを返します。)
0241デフォルトの名無しさん
垢版 |
2019/04/09(火) 01:01:34.97ID:b0dEtQwc
なにか勝ち誇って妄想全開のようだが、全然違う
>>195をよく読もうな。>>226と注目すべきとこあげたのに

他の言語でもglobなんて自ら実装したりはしないんじゃないの。単にそのオプションがデフォルトでは設定されていない、オプションが設定できるのは設定すれば同じになるんじゃないの。妄想お疲れさん
0242デフォルトの名無しさん
垢版 |
2019/04/09(火) 01:09:06.87ID:cRtn1aSe
> POSIXはシェルスクリプトだけを考えてるわけではないから

↑これで何が言いたいのかを書けば済む話
それが出来ないのはなぜだろうw
0243デフォルトの名無しさん
垢版 |
2019/04/09(火) 01:09:51.04ID:cRtn1aSe
あ、ちなみに「注目すべきとこ」には何も書いてませんよ。
いつもどおりです。
0245デフォルトの名無しさん
垢版 |
2019/04/09(火) 01:16:58.07ID:cRtn1aSe
読めないって言わずに、具体的に引用すればいいだけなのに
それをしないのは、結局引用する場所がないからなんだよね
0246デフォルトの名無しさん
垢版 |
2019/04/09(火) 01:23:40.88ID:b0dEtQwc
「無い」から「引用できない」に変わったけど、同じパターンやな。そして前言はなかったことにという前々からの同じパターン
0247デフォルトの名無しさん
垢版 |
2019/04/09(火) 01:25:22.47ID:cRtn1aSe
>>246はとりあえずレスしてみましたってだけで
中身がなにもないことに、皆さん気づきましたか?
0248デフォルトの名無しさん
垢版 |
2019/04/09(火) 01:26:56.18ID:b0dEtQwc
なんか少しは自分を見直すとかあって、ここでもこんなクソ(俺のも含めて)なレスの応酬もなく、見てためになる万人が楽しめるレス、Q&Aになるかと思ったが、無理かやっぱ(偉そう偉そう)
そりゃ無理かっ。なんか急に飽きた、じゃな
0251デフォルトの名無しさん
垢版 |
2019/04/10(水) 12:14:47.90ID:sSiaigIF
>>250
それ俺も欲しいんだよね。

前にやった実装は、小数点以下2位固定だったから
1.23 を 123 にして計算してから、後ろ2桁の間にドットを入れて対応したけど
小数点以下の桁数が1.2とか1.234とかだったら面倒なんだよね。

bcコマンドとか呼び出せば簡単なんだが。
0252デフォルトの名無しさん
垢版 |
2019/04/11(木) 17:03:23.97ID:bMTFn+JP
exec 3>&1; exec >&-; exec >&3
たまにこんなのを見ますがこれはどんな時に使うんです?
ファイルディスクリプタ自体は理解しましたがfdの複製や切り替える目的が分からなくて
cmd 2>err.txtは意識せず使えてますが
0253デフォルトの名無しさん
垢版 |
2019/04/11(木) 17:46:50.14ID:cVfQRf/N
>>252
不勉強なんで「3」ってfdは知らないんだけど、「>&」ってリダイレクトを
使うと書き込みじゃなくて切替になるんだけど、これを使うとエラー
出力を標準出力に切り替えて標準出力で両方の出力を得たりする
ことができるです

「Command > FileName 2>&1」ってするとエラー出力の内容が標準
出力になってFileNameに両方の内容が書き込まれる
逆に「Command 2> FileName 1>&2」ってすると標準出力がエラー
出力になっるので、エラー出力でFileNameに書き込むことが出来る

で、何に使うのかっていうと、「grep」なんかは検索結果は標準出力に
でるけど「指定されたのはディレクトリだよ」みたいなメッセージは
エラー出力に出される
両方の出力をみて処理したいとかの時にはこれで切り替えて標準
出力の内容を変数に保存しておいて処理するとかに使うです

例が雑でわかりにくいかもだけど、エラーと通常の出力を同じ出力で
使う方法ってことで、あとはスクリプトなんでアイデアしだいなんで
0255デフォルトの名無しさん
垢版 |
2019/04/12(金) 00:07:43.92ID:XpqpR76r
>>252 はリダイレクトを知りたいんじゃなくて、fd=1 を 3 にコピーして 1 をクローズして再度 3 から 1 にコピーする意味
が何なのかを質問しているんだと思う。
結局もとのファイルに繋ぎなおすだけだよね。
一旦クローズするから flush されるとか?ならわかるんだが、実際どうなのかわからん。
0256デフォルトの名無しさん
垢版 |
2019/04/12(金) 00:45:21.11ID:L59U/aC1
ファイルディスクリプタに関しては
逆引き辞書が必要なんだと思う

○○をしたい時 → こうします。っていうやつ
0257デフォルトの名無しさん
垢版 |
2019/04/12(金) 03:08:23.09ID:WO5SLys3
ファイルディスクリプタ(FD) 3番からは、システムが使うけど、ユーザーも使うことができる。
FD0 : 標準入力、FD1 : 標準出力、FD2 : 標準エラー出力

端末に、ls と打つと、
1. シェルが、lsコマンドのプロセスを起動して、それに、FD0〜2 を渡す
2. lsプロセスは、FD3 を使って、ファイル一覧を作って、FD1 に出力する

主なFD3 の使用方法は、標準入力を、ファイル・キーボードの2つで、切り替えて使いたい時

標準入力をファイルからにすると、キーボード入力が出来なくなるため、
一旦、標準入力(FD0)をFD3 にして、ファイルから入力して、済んだら元に戻す

こんな事を一々、シェルスクリプトでやるよりも、Ruby でやればよい。
FD何番を使っているとか、意識せずにすむ
0258257
垢版 |
2019/04/12(金) 04:14:55.73ID:WO5SLys3
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版には載っているかどうか、知らないけど
0261デフォルトの名無しさん
垢版 |
2019/04/12(金) 16:22:09.16ID:zYICSkfs
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と表示される。トラップできる。)

なんでこうなって、どれが正しい動きで、どれでも同じ動きさせるには、どうすりゃいいの?
0263デフォルトの名無しさん
垢版 |
2019/04/13(土) 06:04:26.25ID:blG/UTRx
Ruby では、カスタムハンドラを定義した場合、終了しない。
デフォルトのままなら、Ctrl+C で終了する

つまり、デフォルトハンドラから、カスタムハンドラへ付け替えたため

sleep 7 #=> ここではデフォルトハンドラだから、Ctrl+C で終了する

previous_handler = Signal.trap( :INT ) do
puts "シグナルハンドラへ入った!"
end

print "previous_handler = "
p previous_handler #=> "DEFAULT"

sleep 7 #=> ここでは、カスタムハンドラへ付け替えたので、終了はしない
0264デフォルトの名無しさん
垢版 |
2019/04/13(土) 06:40:14.96ID:mImzJn5T
それはシェルスクリプトも同じだろうな。上の終了しているのは set -e しているからじゃないのかな
シェルスクリプトは子プロセスを起動していてシグナルを受けるのが子プロセスでが多くタイミング的に〜以下省略
0265デフォルトの名無しさん
垢版 |
2019/04/13(土) 07:34:12.37ID:bIdtQ5MW
> set -e しているからじゃないのかな
それをわかってるから、サンプルコードにも入れてるんだけどねw

問題はそこじゃなくて、なんでシェル毎に挙動違うんだよ!?
どれが正しいんだよ!?という話なわけで
0266デフォルトの名無しさん
垢版 |
2019/04/13(土) 07:57:58.58ID:i5T2wQ7z
CTRL-Cを入力するタイミングが下手すぎるって話だろ
まさか手入力じゃあるまいな?
0268デフォルトの名無しさん
垢版 |
2019/04/13(土) 08:08:38.43ID:bIdtQ5MW
いやkill使うのは知ってる。それをどういう風に使えば、
手入力と全く同じことを再現できるのかという話だ。
0269デフォルトの名無しさん
垢版 |
2019/04/13(土) 08:12:44.72ID:bIdtQ5MW
2つの端末を使って一方で実行してから
もう一方で(手入力で)実行するっていうのは
結局手入力してるのと変わらないし、

1つのスクリプトでkillすると、
それこそわけわからんことになる。
イベントハンドラ内でkillするか、違う場所でkillするか
シェルによって挙動が違う
0270263
垢版 |
2019/04/13(土) 08:51:59.71ID:blG/UTRx
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 で排他制御してる
0271263
垢版 |
2019/04/13(土) 09:02:30.89ID:blG/UTRx
シングルスレッドでは、sleep 7、としてる間に同時に、

Process.kill :INT, Process.pid
と、自プロセスの命令を実行できない

マルチスレッドなら出来るのだろうが、マルチスレッド・プログラミングはややこしい!
0272デフォルトの名無しさん
垢版 |
2019/04/13(土) 09:27:42.11ID:bIdtQ5MW
>>271
マルチスレッドのほうが楽だな。

それらをマルチプロセスでやってくれ。
子プロセスは自分で作成したものだけじゃなくて
既存のプログラムも使い、バックグラウンドプロセスも使ってみること
0273デフォルトの名無しさん
垢版 |
2019/04/13(土) 09:36:25.97ID:bIdtQ5MW
zshの謎な挙動はこれが原因か?
https://fumiyas.github.io/2013/12/05/trap-exit.sh-advent-calendar.html

> でました、zsh の非互換! zsh はシグナルハンドラー※内で終了すると、 EXIT ハンドラーを実行してくれません。酷い。 (※この例では SIGINT のデフォルトのシグナルハンドラー)

> こんな感じで bash, ksh, zsh には微妙な動作の違いがあったりするので、 ちょっと変わったことしようとするときは特に注意しましょう。
0274デフォルトの名無しさん
垢版 |
2019/04/13(土) 09:39:48.45ID:bIdtQ5MW
読みづらいなw

$ zsh -c '
atexit(){ echo "Bye!"; };
trap atexit EXIT;
trap "trap - EXIT; atexit; exit -1" TERM;
kill -TERM $$
'
0276263
垢版 |
2019/04/13(土) 11:39:28.75ID:blG/UTRx
Ruby で、at_exit に、終了処理を書いておけばよい

シェルスクリプトで、書く必要がない
0277デフォルトの名無しさん
垢版 |
2019/04/13(土) 11:55:58.29ID:6byp94bf
時たま出来てしまうゾンビは何が原因なんだろう?
kill -TERM 0 してるから全部死んでくれるはずなんだが・・・
0278デフォルトの名無しさん
垢版 |
2019/04/13(土) 11:57:21.41ID:6byp94bf
あ、バックグラウンド処理とかしてる
そしてCTRL-Cで強制終了した時の話
ゾンビだから消せなくて困る
0279デフォルトの名無しさん
垢版 |
2019/04/13(土) 13:02:33.69ID:blG/UTRx
ゾンビは、子プロセスが終了して、
OS が、その終了コードをどう扱えば良いのか、わからないから、ひとまず保存している状態

普通なら、子プロセスの終了コードは、親プロセスへ渡されるのかな?

ゾンビが生まれた時に、親プロセスがどうなっているのか?
0280デフォルトの名無しさん
垢版 |
2019/04/13(土) 14:09:25.74ID:mImzJn5T
>>265
お前には言ってない

>>266
タイミング的に子プロセスが受け取るのかシェルが受け取るのかってことなんだけどね。コマンドを実行中なのかシェルが実行中なのか
set -e を使うからややこやしい、シグナルの基本をわかってないんじゃないんだろなとしか思えんけど。コマンドがINTシグナルで終了した場合、シェルが擬似的にシグナルハンドラ呼んでるっぽいかな(もしくは自らにINTシグナル出してるのかな?)

何したいのか知らんけど、set -e 使わずに、INTシグナルハンドラでexitすればいいんじゃないの
0281デフォルトの名無しさん
垢版 |
2019/04/13(土) 14:29:06.39ID:6byp94bf
>>279
その理屈はわかるんだけどねぇ

まず必ずゾンビになるんじゃなくてたまになる。だからタイミングの問題
CTRL-Cを押した時になる。通常の処理では発生しない。
CTRL-Cのハンドラでは作業ディレクトリの削除を行っている。

ワーカー(& によるバックグラウンド処理)が複数ある。サブシェルを使ってるせいか
同じな名前のプロセスがたくさんいる。ワーカーを生成した後はwait(引数なし)を実行している。
ゾンビの存在は確認しているが、誰がゾンビになったのかその親が誰かはよくわかっていない。
(たまにしかならんので探しにくい)ただし内部で呼び出してるtrやmvがゾンビになったこともある。

CTRL-Cのハンドラでは作業ディレクトリの削除の他、多数生きてるワーカー(労働者)を
皆殺しにするためにジェノサイド(kill -TERM 0)を発動している。
ただし労働者を消した後に、労働者の作業場(作業ディレクトリ)も片付ける
必要があるので自分だけは死なないようにしている。(trap ':' TERM)
実際にはもっと複雑だけど、死なないのは自分だけなはずなんだけどな

バグでゾンビになったこともあるので記憶が曖昧だけど
(バグを修正した今は)zshだけしか発生しなくなっているかもしれない。
もしかしたらzsh内蔵のkillにバグがあって殺す順番とか
子供が生まれるタイミングで発生してるとか?

でもまあなんだかんだでシンプルにしていったら
ゾンビの発生率も下がってきたし諦めるかな
0282デフォルトの名無しさん
垢版 |
2019/04/13(土) 14:40:48.63ID:6byp94bf
うーん、おかしい。trってワーカー(バックグラウンドプロセス)の
中で使っているとはいえ、パイプの右側でしか使ってないんだが?
0283279
垢版 |
2019/04/13(土) 15:17:27.06ID:blG/UTRx
漏れにも、ゾンビになるプログラムとならないプログラムの、違いがわからない

ゾンビになるメカニズムを検索してみれば?
0284デフォルトの名無しさん
垢版 |
2019/04/13(土) 15:21:25.04ID:6byp94bf
「ゾンビになるメカニズム」で検索してみた

管理テーブルにデータが残ってるだけなら
消す方法(もしくは隠す方法)があってもいいと思うんだがねぇ
0285デフォルトの名無しさん
垢版 |
2019/04/13(土) 16:27:29.48ID:i5T2wQ7z
>>284
wait()すりゃいいんだよ。
普通はinitが拾ってくれるんだが、誰にでも好き嫌いはあるということだろう。
0286デフォルトの名無しさん
垢版 |
2019/04/13(土) 16:33:30.75ID:mImzJn5T
>>280
>コマンドがINTシグナルで終了した場合、シェルが擬似的にシグナルハンドラ呼んでるっぽいかな(もしくは自らにINTシグナル出してるのかな
違うか。control-cでのINTシグナル送るやつの文献ってどこぞにあるかなあ
0287279
垢版 |
2019/04/13(土) 17:05:08.41ID:blG/UTRx
Ctrl+C が、子プロセスやパイプラインのジョブグループに、

どのように伝達されていくかとか、難しい
0288デフォルトの名無しさん
垢版 |
2019/04/13(土) 17:21:22.57ID:6byp94bf
いろいろ間違っていた。訂正する。

まずCTRL-Cは関係なさそう。実は正常な動作でも(プログラム実行中に)ゾンビができることがあった。
ゾンビができると今は無限ループ状態になるので気づいたが、ちょっと前まではプログラムの構造上、
ゾンビを放置して正常終了していたと思う。zshではあまりテストしていなかったから気づかなかった。

バックグラウンドプロセスが関係あるかないかはよくわからない。
何回か動かしているがバックグラウンドプロセスを使用しない場合は今の所再現していない。

あとなんかWSLとのからみな気がしてきた。
速度が違うから断定は出来ないがLinuxだと再現しない。

今の所、WSL環境にて、zshで、バックグラウンドプロセスを使用し、
その中でパイプを使った処理を行うと、まれにゾンビプロセスができる。
0289デフォルトの名無しさん
垢版 |
2019/04/13(土) 17:27:02.88ID:i5T2wQ7z
>>286
シグナル一般の話ではなくてttyの話だったら、詳解Unixに載ってた気がするが、
当然そのくらいは読んでるよね。
0290デフォルトの名無しさん
垢版 |
2019/04/13(土) 17:36:42.95ID:mImzJn5T
>>287,289
なるほど
すまん、読んでない。遠い記憶では読んでいたような気もするが忘れたので読んでない
0291デフォルトの名無しさん
垢版 |
2019/04/13(土) 17:43:50.87ID:6byp94bf
再現コード出来た。このコード、なにか問題有る?

これを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
0293デフォルトの名無しさん
垢版 |
2019/04/13(土) 17:54:41.69ID:6byp94bf
dash、bashでは再現しない。kshでも再現した。
いずれもWSLのみ。これもうWSLの問題だろ・・・
きっとWSLのバグをzshとkshが踏んじゃったんだな
0295デフォルトの名無しさん
垢版 |
2019/04/13(土) 18:09:57.29ID:6byp94bf
次の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.
0296デフォルトの名無しさん
垢版 |
2019/04/14(日) 14:12:09.49ID:uU4FE3J6
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とはまた違った挙動だ。
とゆうかどういう仕様なんだろう?
0297デフォルトの名無しさん
垢版 |
2019/04/14(日) 17:50:16.12ID:21MN1CXY
$ 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 に書いてあるよ。
$ # 簡単に言うと、単語の分割というのは最初に行われるものと
$ # 変数が展開された後に行われるものがあるんだ。
$
0298デフォルトの名無しさん
垢版 |
2019/04/15(月) 17:41:03.59ID:ZXb+3x2v
シェルスクリプト(対話操作含め)が実行される手順って結構複雑な割に他の言語よりずっと単純だから
理論から実践(この場合はシステム処理とか?)への、かなり良い足掛かりになるよね。
0299デフォルトの名無しさん
垢版 |
2019/04/21(日) 01:20:29.51ID:Has+aDs1
http://www.sample/{01..10}.jpg
これが書かれたtxtを読み込んでブレース展開して出力する方法ないです?

$ printf "%s\n" < foo.txt
適当にこうやっても上手く行かなくて
0305デフォルトの名無しさん
垢版 |
2019/04/21(日) 10:59:40.33ID:Has+aDs1
>>304
内側のリダクレクトが何かと思えば $(cat file)の変形があったとは
複数行も対応してるしこれなら行けそうですわ
0307デフォルトの名無しさん
垢版 |
2019/04/22(月) 02:03:07.74ID:KyfckjPA
>>306
これいいね!
……正直,実際に使う機会は少なそうだけど
シェルの処理をしっかり把握してないと思い付かない回答。
0308デフォルトの名無しさん
垢版 |
2019/04/22(月) 11:54:54.98ID:c8JzoHXu
例えばさ、

bash -n -c 'a=(a b c)'
↑これはbashとして正しい文法だけどさ

sh -n -c 'a=(a b c)'
↑これは文法エラーになるじゃん? 実行していなくても

これみたいに、実行してないのにあるシェルではOKで
別のシェルではNGみたいな文法って他に何かしらない?
0310デフォルトの名無しさん
垢版 |
2019/04/22(月) 15:47:58.78ID:8XF5nS5J
eval 'printf "%s\n" '$(cat foo.txt)
これprintfをシングルクォートで囲まないと改行されないのね
http://www.sample/01.jpgnhttp://www.sample/02.jpgnhみたいな結果ばかりでちょっと悩んだ
zsh使ってないけどこれはforの後の二重括弧に空白が必要だとかなんとか
{には空白がいるのにfor((が通るbashの方が不自然なのか
0312デフォルトの名無しさん
垢版 |
2019/04/22(月) 18:36:38.02ID:oyNQbI7u
\n の処理をだれがいつやらかすのかってとこかな。printfにやらせたいprintfに \n のまま渡さなくてはという感じ
eval printf "'%s\n'" $(cat foo.txt)
eval printf '%s\\n' $(cat foo.txt)
0313デフォルトの名無しさん
垢版 |
2019/04/22(月) 23:58:52.60ID:htDMK2AO
そもそもなぜ eval を使うのかというと、コマンドラインの解釈において
ブレース展開がコマンド置換より前だから
コマンド置換してからブレース展開するためには
eval を使って解釈を最初からやり直す必要があるためで
しかしながら printf と "%s\n" にはその必要がないのだから、つまり
printf "%s\n" $(eval echo $(<foo.txt))
でいいんじゃないかな。
0314デフォルトの名無しさん
垢版 |
2019/04/23(火) 08:44:15.00ID:q7kwqzjj
ダブルクリックで実行できるのとできないシェルスクリプトの違いって一体
whileとcaseで簡易メニュー作ってたんだけどダブルクリックしても画面に何も出ない上に
起動されたbashがCPUがかなり食ってた
無論端末から実行はしっかり通る
ls結果を外部保存するような単純な奴はダブルクリックでも正常通りなんだけど
0316デフォルトの名無しさん
垢版 |
2019/04/23(火) 18:19:48.00ID:/EY0Mv6x
>>311
マニュアル嫁
つーか実行すれば一目瞭然だぞ
……と思ってやってみたらexportはオプション成しで起動すると
export -pと同じ動作をするんだね
0317デフォルトの名無しさん
垢版 |
2019/04/23(火) 18:22:18.78ID:/EY0Mv6x
>>314
使ってるGUIシステムがX11なら
x-terminal-emulatorなんかを使って仮想端末を立ち上げてからじゃないと
メニューみたいな端末出力を必要とするものは期待した通りに動かないよ。
0319デフォルトの名無しさん
垢版 |
2019/04/23(火) 21:51:37.02ID:zhMneqp1
模範解答

export -p がどう表示されるかはPOSIXで規定されていますが、
export がどう表示されるかは未定義です。(同じとは限りません)
つまり、exportがどうなるかはシェル毎に異なります。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#export

更にexport -pはbashではPOSIXに反してdeclareで表示されます。
これらは各シェルのマニュアルには書いていません。
0321デフォルトの名無しさん
垢版 |
2019/04/24(水) 08:22:12.86ID:6O+4Q2Ek
bashで abc*が展開できると出来ないときがあって
それをテストするのに
[  "abc*" = 'abc*' ]
とやりたいのにできません
どうやったらできますか?
0322デフォルトの名無しさん
垢版 |
2019/04/24(水) 17:25:06.62ID:bQUFU5ml
>>321
何がどうできないのかよく分からないけどシングルクォートとダブルクォートは
処理が違うから「=」にならないと思うよ
シングルクォート側は文字列なので「abc*」っていう文字列になるけど
ダブルクォート側は解釈されるので「*」にあたるものが存在しないと何もない
状態なので「abc」って文字列になるんじゃないかな
0324デフォルトの名無しさん
垢版 |
2019/04/24(水) 17:42:31.98ID:6O+4Q2Ek
abc*が展開できない時はそのままabc*になるのでそう思って書いてみました
0326デフォルトの名無しさん
垢版 |
2019/04/24(水) 18:32:06.10ID:6O+4Q2Ek
ええです
0327デフォルトの名無しさん
垢版 |
2019/04/24(水) 18:45:29.21ID:6T3A9gnL
ダブルクォートで囲んでも囲んじゃうとglob展開は行われない変数などのようには。(>>322見るとデフォでは??展開できるなんかあっったかなあ)

[ "$(echo abc*)" = "abc*" ]
とかかな
any='abc*'; [ "$(echo $any)" = "$any" ]
0328デフォルトの名無しさん
垢版 |
2019/04/24(水) 19:43:12.00ID:uakSx5ac
日本語がダメな奴と日本語がダメな奴が
初心者同士の会話をしてる。
ついていけない。
0329デフォルトの名無しさん
垢版 |
2019/04/24(水) 19:56:20.38ID:6O+4Q2Ek
>>327
ありがとうございます
echoを使わずできたらお願いします
無理なら諦めます
0330デフォルトの名無しさん
垢版 |
2019/04/24(水) 20:25:30.92ID:6T3A9gnL
>>328
答えてやれよ。マウントとりではなくて。ふたレスもするくらいな
(>>322は正直お前の>>323と同じだが、それだけじゃなというのと、もしかしてもしかしてもしかしてだけど)
0331デフォルトの名無しさん
垢版 |
2019/04/24(水) 20:29:18.25ID:6T3A9gnL
>>329
echoを使わずの条件がわからない。他にもやり方があるけど、複数行にだったり
stackoverflowではなんか凝ったのより ls が人気みたい。見た目でわかりやすからかな
0332デフォルトの名無しさん
垢版 |
2019/04/24(水) 21:08:22.56ID:uakSx5ac
何をやりたいのかわからない。

端末にecho *って入力して
あぁ、展開されましたねって
確認すりゃいいだけじゃんか

なんで[ ]とか使うのか
0333デフォルトの名無しさん
垢版 |
2019/04/24(水) 21:16:12.73ID:6T3A9gnL
>>332
お前が何言っているのかわからない
シェルスクリプトで判断してなにかその後にする部分のことを聞いてきているのだろう。その判断するとこだけを書いているのだろうと読むと思うけど

(日本語どうの言うなら、他人の日本語より自分の日本語を疑った方がいいようなw)
0334デフォルトの名無しさん
垢版 |
2019/04/24(水) 21:29:00.43ID:6T3A9gnL
>bashで abc*が展開できると出来ないときがあって
abc* としても、該当するものがあってglob展開する場合と、該当するものがなくてglob展開しない(出来ない=globのまま)ときがあって
>それをテストするのに
展開できなかった場合はマズいので(とかなんとで)、それをテストするのに
[  "abc*" = 'abc*' ]
>とやりたいのにできません
としてみましたが、思ったようになりません

だよ。たぶんw
0335デフォルトの名無しさん
垢版 |
2019/04/24(水) 22:15:49.65ID:kFXKi6KY
Ruby で該当するファイル数を数えれば?
それが、0 なら、該当なし

p Dir.glob( 'C:/Users/Owner/Documents/*.txt' ).length #=> 0
0336デフォルトの名無しさん
垢版 |
2019/04/24(水) 22:19:13.46ID:uakSx5ac
>>333
お前はさ、なぜこういう質問に至ったかまで考えられてないんだよ。
意味不明なんだよ。

>>334
そう思うやろ?だったら意味不明って気づかなきゃ。

> 展開できなかった場合はマズいので

つまり、現時点で「展開できてる」はずなわけだよ。
展開の仕方を知ってる。
なのに展開できないと言ってる。意味不明だろう?
0337デフォルトの名無しさん
垢版 |
2019/04/24(水) 22:37:08.62ID:6T3A9gnL
>>336
なにを言っているのかさっぱりわからん。意図目的とすることがな。いや後半はまったくわからん、お前の頭の世界の話だけのようで。ちょっと怖いぞw
ただマウントとりたいだけというのはわかるぞw
0338デフォルトの名無しさん
垢版 |
2019/04/24(水) 22:39:35.88ID:6T3A9gnL
読めなかったらのをごまかすためにむちゃくちゃ言っているんだな
うん。そゆことにしとこ。でないとアレだなということで
0339デフォルトの名無しさん
垢版 |
2019/04/24(水) 22:49:53.80ID:uakSx5ac
だーかーらー、いつもどおりのやってるやり方で展開して
それをチェックすればいいだけだろと
0340デフォルトの名無しさん
垢版 |
2019/04/24(水) 23:04:43.57ID:6T3A9gnL
ぜんぜん「だーかーらー」でもなんでもないな。お前の言っていることはわからん
どうも自称初心者じゃない自称日本語ダメじゃない人の自分の脳の世界でなんか言ってるとしか見えない

お前の言う初心者の ID:6T3A9gnL は >>327 ので不満があるようだがそれでも答えになってるらしいぞ

お前の変な言い分はお前のためでしかなく、他に対する目的も意味もない。マウントとりたいだけのお前には意味があってもな。マウントとりたいから延々続くのか?
0341デフォルトの名無しさん
垢版 |
2019/04/24(水) 23:06:17.58ID:6T3A9gnL
誤 お前の言う初心者の ID:6T3A9gnL は
正 お前の言う初心者の ID:6O+4Q2Ek は
なんかすまん
0342デフォルトの名無しさん
垢版 |
2019/04/24(水) 23:14:58.44ID:uakSx5ac
> お前の言う初心者の ID:6T3A9gnL は >>327 ので不満があるようだがそれでも答えになってるらしいぞ

だからなんなのか知らんが、お前ら、いつもどおりの展開ってecho使ってんのか?
使ってないだろ。いつもどおりの使えばいいだけなのに、
悩んで(?)別の方法模索してるから、意味不明だって言ってるんだよ。
質問者にも回答者にも
0343デフォルトの名無しさん
垢版 |
2019/04/24(水) 23:22:52.75ID:6T3A9gnL
むちゃくちゃww
自分で>>332って書いているのに
言うにことかいて「だからなんなのか知らんが」だってwwwもろマウントとりたいだけ、マウントとり失敗してわけわからんだけだな
0344デフォルトの名無しさん
垢版 |
2019/04/24(水) 23:54:51.80ID:uakSx5ac
展開されるかどうかの確認はそれでいいし、
プログラムでならいつもどおりのやり方で展開すればいい
何をやりたいのかわからないのに、どちらの話かわかるわけないだろ
どちらにしろ「は?」なわけだが
0346デフォルトの名無しさん
垢版 |
2019/04/25(木) 00:02:54.32ID:zUwJ78d6
っていうか、正しいやり方知らんのか?
echo使って検査するんじゃないぞ(それじゃできない)
0347デフォルトの名無しさん
垢版 |
2019/04/25(木) 00:05:34.10ID:zUwJ78d6
それじゃできないっていうのはコレな

> abc* というファイルが実際にあるというというのは除外でいいのね?

abc* というファイルが実際にあることも考慮するやり方をするべき
そうすれば正解にたどり着く
0348デフォルトの名無しさん
垢版 |
2019/04/25(木) 00:16:01.39ID:2wE9GZDh
ダメな場合もあるのはわかって聞いているんだけど。本人がいいっていったからそれに合わせてだよ

だれかみたいに「すべき」とか強要するつもりも知識自慢したくてたまらないとかもないからな。その最後のといい、なんか偉そうにしたいのね、質問者の意図とか読まずに、知識自慢するためのw質問者の他の情報も引き出そうともせずに

shopt使うとかいう知識自慢だったら笑うぞ。別にabc*という実ファイルがあった場合でものshopt使わずにの方法もあるけどな
0349デフォルトの名無しさん
垢版 |
2019/04/25(木) 00:21:59.00ID:zUwJ78d6
本当に差があるやつとの会話は疲れるw

> bashで abc*が展開できると出来ないときがあって
展開でするやり方知っってるよな?それ使え

> それをテストするのに
展開できないことのテストはいらん

お前が知ってるはずの、展開するやり方を使って、
-f (もしくは -d や -e 等)で、その名前の
そのファイルが実査に有るかどうかを調べるだけ

shoptとかもしらん
0351デフォルトの名無しさん
垢版 |
2019/04/25(木) 00:34:11.93ID:2wE9GZDh
やっぱり、まだわかってないんだな、「展開〜」という質問を
shoptとかもしらん....
-f とか、まさかそんな「当たり前の」こと言い出すとは
まさか「その程度」だとは思わなかったわっ。なんだろこれw
0352デフォルトの名無しさん
垢版 |
2019/04/25(木) 01:03:28.37ID:zUwJ78d6
× shoptとかもしらん
○ shoptとかもいらん

なんで当たり前の正解を言ったら
お前悔しがってんの?w

知識自慢したのお前じゃん
そして「は?」の意味わかっただろ。
全く見当違いのことをやろうとして、
全く見当違いの解答をしてるんだよ。
クソガキどもが
0353デフォルトの名無しさん
垢版 |
2019/04/25(木) 01:09:13.03ID:2wE9GZDh
そりゃ、お前が悪い。shoptもな
なんかもったいぶってるだけでだからな。自覚がないのか?さんざん偉そう俺は初心者じゃないってだけの、質問から外れたことばっかり言っている
お前が>>349>>352で書けば終わってることだからな

俺は別にお前みたいな知識自慢したくてなんてないぞ。おまえがさんざん俺偉いというだけのような&「そうすれば正解にたどり着く」とかうやむやなこと言うからだろうに

とうとう、「クソガキども」のお言葉いただきましたっ。なんだじじいかw自称他人を自分より劣ると言える
0355デフォルトの名無しさん
垢版 |
2019/04/25(木) 01:15:09.23ID:zUwJ78d6
だから何をやりたいのかわかったのは
それ以降のレス読んでからだろうが

意味不明だし、馬鹿がクソな回答しやがるし
ほんと低い
0356デフォルトの名無しさん
垢版 |
2019/04/25(木) 01:17:21.45ID:2wE9GZDh
>だから何をやりたいのかわかったのは
イミフ。おまえもたいがい日本語ダがメだぞ?w いままでのレスの数々でも

やっぱり「俺高いお前低い」とは言いたいのね。なんでそう言いたいのか自分に問いてみような
0357デフォルトの名無しさん
垢版 |
2019/04/25(木) 01:19:37.90ID:2wE9GZDh
ああ、「クソガキども」のお言葉いただいたので(なんでそんなこと言いたくなったのか自分に問いてみようなw)、もういいや
0358デフォルトの名無しさん
垢版 |
2019/04/25(木) 01:20:59.82ID:zUwJ78d6
> なんでそう言いたいのか自分に問いてみような

邪魔だからだな。頭悪そうな兄ちゃんがきて
頭悪そうな会話をしてる。そんな感じだ。
0360デフォルトの名無しさん
垢版 |
2019/04/25(木) 04:25:44.56ID:Q6RVSnnY
質問する側が馬鹿すぎると馬鹿を引き寄せるだけなんだよなあ。
まず、まともな質問をするために man を読もうよ。
0361デフォルトの名無しさん
垢版 |
2019/04/25(木) 09:00:30.11ID:XBKhyEHe
よくわからんが、なんで -f が出てくるんだ?
ファイルの有無が問題じゃないんだろう?
globしたかしないかが問題なんだろう?
0362デフォルトの名無しさん
垢版 |
2019/04/25(木) 10:40:29.00ID:xhj9dxYD
""で囲むと展開されなくて""で囲まないと複数の引数として認識するから出来ないので諦めますね
0363デフォルトの名無しさん
垢版 |
2019/04/25(木) 10:43:57.02ID:zUwJ78d6
>>361
globでファイル名に展開されるかどうかは
ファイル(ディレクトリなども含む)の有無で決まるから
0365デフォルトの名無しさん
垢版 |
2019/04/25(木) 13:29:45.25ID:wpotMNKo
そもそも、ファイル名に、半角英数字、- _ (base64url encoding)以外を使うような、
システムを作る奴が悪い

さらに、Windows では、大文字小文字だけが異なる、ファイル名も作れないし。
例、aB, Ab
0366デフォルトの名無しさん
垢版 |
2019/04/25(木) 14:58:23.69ID:zUwJ78d6
>>364
セキュリティホールを作るのは、
お前のように正しく理解してないからだよ。

問題が有るというのなら言ってみな。
0371デフォルトの名無しさん
垢版 |
2019/05/03(金) 15:34:52.90ID:m+FxQhlt
bashのさ、<() ってさ、sort test.txt みたいなのを sort <(cat test) って書けるから
リダイレクトを受け付けないコマンドに、一時ファイル作らずに渡せると思ったけど、
そうとはかぎらないよな?例えば、同じファイルを二回読み込むとかさ
そういうのってやっぱ一時ファイル作らないと無理だよな?
0372デフォルトの名無しさん
垢版 |
2019/05/03(金) 18:08:45.95ID:/bmAVHAq
>>371
パイプの概念がないのか?

sortコマンドもどこでどうなったのかを気にしないで使うというのもよくわからない。
0373デフォルトの名無しさん
垢版 |
2019/05/03(金) 21:10:21.19ID:m+FxQhlt
>>372
知らんがな。俺に言うなや。
そのツールが、そうなってるんだから
sortコマンドはただの例だからこれ以上追求しなくていい

てか、複数ファイルを入力したり複数ファイルを出力したりすることだって
あるんだから、必ずパイプで解決できるわけじゃない
diffコマンドとかそうだろ
0374デフォルトの名無しさん
垢版 |
2019/05/03(金) 21:28:48.60ID:wXl0ssRE
同じ出力のデータを分けて処理することは可能だが、なぜ魔法文にこだわっているのかがわからない。
0375デフォルトの名無しさん
垢版 |
2019/05/03(金) 21:31:24.78ID:m+FxQhlt
>>374
その話は関係ないから打ち切ろう

あるツールが「引数で指定した同じファイルを二回読込みしている」
そういう処理をしている。(そのツールの修正は不可能)
ここまでは理解しているかな?
0376デフォルトの名無しさん
垢版 |
2019/05/03(金) 21:32:23.63ID:m+FxQhlt
まあ結論としては無理ってわかってんだけどさ
bashの拡張を持ってしても
0377デフォルトの名無しさん
垢版 |
2019/05/03(金) 21:35:32.54ID:m+FxQhlt
あ、一時ファイル(FIFOファイル含む)作りたくないっていうのが最終的な希望ね。
メモリだけ(tmpfsや類似のメモリベースのファイルシステムやブロックデバイス除く)でやりたい。
無理ってわかってるけど。
0378デフォルトの名無しさん
垢版 |
2019/05/03(金) 23:01:24.06ID:wXl0ssRE
ただの無知か。
0379デフォルトの名無しさん
垢版 |
2019/05/04(土) 09:14:36.29ID:HnSBFy63
>>371
例がないと何を言っているか意味がよく分からない。
teeとかファイルに出力しながら標準出力にも出力しているけど、
そのようなことがbashだけで表現できればOK?
0380デフォルトの名無しさん
垢版 |
2019/05/04(土) 09:40:10.00ID:eyQzK648
>>379
「リダイレクトを受け付けないコマンド」例
ファイル内容と行数を表示するために「同じファイルを二回読み込む」
これは "例" でありこのコマンドの内容についてのレスは不要
実際には中身はわからずバイナリで修正不可能なものとする。

#!/bin/sh
cat "$1"
wc -l "$1"


↑このコマンドに対して、一時ファイル(FIFOファイル含む)を作らないでデータを渡す
0381デフォルトの名無しさん
垢版 |
2019/05/04(土) 09:47:38.10ID:HnSBFy63
>>380
ファイルを作らないでメモリだけでっていうことなら、
↓こんな感じならOKなの?
dat=$(cat $1)
0383デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:01:46.67ID:eyQzK648
明らかに読み間違えてるレスがくると疲れるんで、
一時ファイルを使った場合の例も書いておくは
これは例なんで、この例を修正しろなんてレスは不要

generate-text > /tmp/test.txt
kono-comand "/tmp/test.txt"

この一時ファイル test.txt を作りたくない
なんで?とかいう質問も不要
0384デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:05:16.07ID:HnSBFy63
>>383
ホントに意味が分からないんだは、
上の例でもこれでいいんじゃないのと思っちゃう。
generate-text | kono-comand
だからこれを直せってほうが意味通じるかも。
0386デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:07:09.78ID:eyQzK648
>>384
本当に疲れる。

>>371を読み返せ。

> リダイレクトを受け付けないコマンドに、一時ファイル作らずに渡せると思ったけど、
> リダイレクトを受け付けないコマンド
> リダイレクトを受け付けないコマンド
> リダイレクトを受け付けないコマンド

パイプもリダイレクトだ。
0387デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:08:50.78ID:eyQzK648
っていうか、

generate-text | kono-comand

kono-commandの内容は上に書いたとおり↓で

> #!/bin/sh
> cat "$1"
> wc -l "$1"

修正不可能つってるんだから
これでは動きません。の一言でよかったなw

>>385
動かないコードを書いる時点で説明の問題じゃない。
0388デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:09:39.22ID:ic6F2rX1
>>384
コマンドが標準入力をサポートしてない場合のだろう、よってパイプが使えない
標準入力サポートしていてパイプでいいだろうというコマンド例を挙げてくるとか説明が下手すぎなだけだろうなw
0391デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:11:55.19ID:eyQzK648
>>390
ん?今回はへこましてみるか?

俺「やっぱできないよなぁ」
→ 俺もできないと思うよ。

で終わればいいやん。
0393デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:16:50.69ID:eyQzK648
https://hogem.hatenablog.com/entry/20090530/1243612485

> diff -u hoge.out fuga.out
> diff <(./hoge) <(./fuga)

よくこんな感じで、一時ファイルを作らない例として挙げられてるけど、
これって、diffが引数のファイルを一度しか読み込まないという
内部実装に依存しているってことなんだよな。

だから複数回読み込んでいたりすると使えない。
一度しか読み込まないという仕様はないだろうから
たまたま使えたということ。
0395デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:23:29.06ID:ic6F2rX1
ストリームでいいのかファイルでなければならないのか条件説明がやっぱり下手すぎ
標準入出力は普通は単なるストリームで戻ったりはしたない、一気通貫するだけ
2度読み??とかストリームでないなら当然ファイルにしなければならないだろうに、あたりまえだろう。結局あたりまえのことを確認したいだけなのか。例で上げてくるのがストリームでいいだろうのを出すから下手なんだよ
0396デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:24:53.38ID:eyQzK648
>>395
これを満たせばいいだけ。
いい加減にしろや


「リダイレクトを受け付けないコマンド」例
ファイル内容と行数を表示するために「同じファイルを二回読み込む」
これは "例" でありこのコマンドの内容についてのレスは不要
実際には中身はわからずバイナリで修正不可能なものとする。

#!/bin/sh
cat "$1"
wc -l "$1"


↑このコマンドに対して、一時ファイル(FIFOファイル含む)を作らないでデータを渡す
0397デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:26:01.06ID:eyQzK648
はは。catとwcでファイル読み込みを二回実行してるから、
ストリームでは無理なことにも気づいてない(笑)
マヌケか
0399デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:27:31.82ID:eyQzK648
>>398
どこが下手なのか言ってないからね。

ストリームで不可能な例を見て、
これストリームで可能じゃん!って
言ってしまった時点で、お前の負け
0400デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:30:40.72ID:eyQzK648
俺が言いたいのは、

> diff <(./hoge) <(./fuga)

が使えるかどうかは、コマンド(この場合はdiff)の
内部実装に依存するから、試してみるまでわからないということ、
ファイルじゃないと二度読みはできないとかそういう話はしてない。


<(./hoge)が使えるかどうかは、コマンド次第という話をしてる

どんなコマンドだって、一度読むだけで実装することは可能(メモリに読み込めばいい)
だから、<(./hoge)が使えるかどうかはやってみるまでわからんのだよな。
という話をしてる。
0401デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:31:29.76ID:ic6F2rX1
>>384
というように、
cat "$1" | wc -l
したいわけじゃないんだよ。後は後出しでいろいろ言ってくるだろう
0402デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:32:27.87ID:eyQzK648
ということを、とあるファイルを引数にするコマンドを
一時ファイルを作らないでやろうとして
あれ?となった次第。

そのコマンド、一度だけしか読まないでできるように思えるんだけどな。
0404デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:36:59.95ID:ic6F2rX1
catやwcなんぞ各コマンドの入力ソースはストリームでしかないので、できないことはないけどな。お前には教えないがw
0405デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:38:28.81ID:eyQzK648
>>404

> これは "例" でありこのコマンドの内容についてのレスは不要

あーあ、やっちまった。コマンドの内容にレスしたね(笑)
0407デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:40:24.64ID:eyQzK648
例だから、実際にはcatやwcが使われているわけじゃないのに
catやwcなんぞとかwww
0408デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:40:58.27ID:eyQzK648
>>406
自分の理解力のなさを自覚するように。

こっちは、ちゃんと例を出してる。
その例を満たせなかった時点でアウト
0409デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:44:00.90ID:ic6F2rX1
コマンドの入力がストリームでいいならできる、他のなんか知らんコマンドがストリームじゃダメならできないでしかない。使用するコマンドによるでしかないだろにアホか
0410デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:53:18.47ID:eyQzK648
> コマンドの入力がストリームでいいならできる、

そんな当たり前のことを言われてもなw


重要な点は、本来、該当のコマンドは「ファイルを指定する」前提であるということ
diffコマンドみたいにな。

それを半ば無理やり、ストリームから読み込ませる文法が
bashにはあるということ

> diff <(./hoge) <(./fuga)

だが、本来コマンドは、ファイル名を指定させる以上、ストリームを前提としているとは限らないわけで、
そういうコマンドに、bashを使って無理やりストリームで渡して動いたとしても、
それはたまたま動いただけいう話をしてる。
(コマンドの仕様で規定されてないならば)実装依存なので動くという前提に立ってはならない。
0411デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:54:58.56ID:eyQzK648
あ、bashの拡張なんて俺は普通使わんけどなw
今回はたまたま利用可能だったってだけで
0412デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:55:49.57ID:ic6F2rX1
では、なにを当たり前のことを延々と言っているのかね?
というような、お前のレスはこんなんばっかだな
0414デフォルトの名無しさん
垢版 |
2019/05/04(土) 10:58:48.90ID:eyQzK648
基本的に、俺が出した結論が正解なので、
最後の最後でここで他になにかないのか?と聞いても
新しいことは何もわからないというのがいつものパターン
0417デフォルトの名無しさん
垢版 |
2019/05/04(土) 11:04:39.93ID:eyQzK648
そういや前にも、

他にもやり方あるけどお前には教えてやんないよ。ばーかばーか

みたいなレスあったなw
結局やり方なかったみたいだけどw


あ、今回は有るんですよね?知ってます。だって俺も知ってるからね!
0418デフォルトの名無しさん
垢版 |
2019/05/04(土) 11:05:09.17ID:ic6F2rX1
ほほー、よくわからんが解決してなにより
めずらしくちゃんと終えられてよかったよ
0420デフォルトの名無しさん
垢版 |
2019/05/04(土) 20:25:44.11ID:ifYIOobQ
やれやれ、何事かと思ったら……
「そのツール」って何だよ。それを書かない時点で相手にする価値が無いゴミだろ。
0421デフォルトの名無しさん
垢版 |
2019/05/04(土) 21:30:57.91ID:eyQzK648
ツール名聞いたって何の意味もないくせにw

じゃあgccとでも言っておこうか。一例として
0423デフォルトの名無しさん
垢版 |
2019/05/05(日) 01:20:16.53ID:kL93aIfd
なぜかシェルスクリプトのスレなのにコマンドの世界の話をしてますね。
0424デフォルトの名無しさん
垢版 |
2019/05/05(日) 01:55:58.03ID:BV99JfCS
シェルスクリプトはコマンドを使って組むもの。基本的なものですらコマンドだったり。
コマンドの動作がどうだから入出力がどうだからで組みもするもんだろう。
0425デフォルトの名無しさん
垢版 |
2019/05/05(日) 04:20:05.42ID:HUD7QHVp
いつものってことはこいつは常連客なのか
ちゃんとコテ付けてくれないと困るなぁ
0426デフォルトの名無しさん
垢版 |
2019/05/05(日) 13:10:37.85ID:ptHRpxR9
>>424
プログラムですよ?
0431デフォルトの名無しさん
垢版 |
2019/05/11(土) 15:19:07.32ID:D877RybE
[ string1 > string2 ] ってPOSIX準拠じゃないよね?
POSIXの範囲で(外部コマンドを使わずに)
文字列の大小の比較ってできたっけ?
0432デフォルトの名無しさん
垢版 |
2019/05/12(日) 02:15:32.41ID:0u/cIV/f
>>427
おまえさ、ここはシェルスクリプトのスレッドだぞ?

コマンド一発にしたいのなら、そういうコマンドを作ればいい。

UNIXの考え方は、あるものの組み合わせで実現できるものはそうすべきだが、無理やりあるものの組み合わせでやれなんて言ってない。
0433デフォルトの名無しさん
垢版 |
2019/05/12(日) 02:18:26.37ID:0u/cIV/f
>>431
どの言語でも、単に文字列を比較する構文は、どういう比較なのか分かりにくいから、まともなプログラマは避ける。
0435デフォルトの名無しさん
垢版 |
2019/05/12(日) 18:06:37.34ID:VATOmp33
>>431
外部コマンドを使わないという制約なら
↓こういうのでは
string1='aaaaa'
string2='bbbb'
[ ${#string1} -le ${#string2} ]
0436デフォルトの名無しさん
垢版 |
2019/05/12(日) 19:46:54.27ID:OoMn1CYl
「文字列の比較」ができるという触れ込みで文字数の比較を
している言語やデータベースなんか聞いたこと無いなw

普通は現在のロケールに従って文字列の照合順序で比較のことを言う
百歩譲っても文字コード順とか
0437デフォルトの名無しさん
垢版 |
2019/05/12(日) 20:03:17.70ID:0u/cIV/f
>>436
文字列が同じ値かどうかの比較を忘れているのか?
0438デフォルトの名無しさん
垢版 |
2019/05/12(日) 22:54:11.71ID:OoMn1CYl
変なやつだったようだな
0439デフォルトの名無しさん
垢版 |
2019/05/12(日) 23:14:03.33ID:VATOmp33
文字数の比較じゃないのか。申し訳ない、俺の読解力が不足してた。
後学の為に訊いておきたいんだけども、文字列の比較がごく普通にできるプログラミング言語って例えばなんだろう。
0440デフォルトの名無しさん
垢版 |
2019/05/12(日) 23:17:08.65ID:OoMn1CYl
C言語
0441デフォルトの名無しさん
垢版 |
2019/05/13(月) 03:22:38.08ID:gc1mJry9
構文的ならC言語はできない方かなあと
他の(スクリプト)言語でいくらでもあるからそちらでもよかったんじゃないかと
0444デフォルトの名無しさん
垢版 |
2019/05/13(月) 18:11:06.86ID:/95lNMvT
C言語を基準にしたら文字列同士の比較は簡単な構文ではできない。

しかし、C言語よりあとにできたプログラミング言語は、文字列同士ができ、まったく同じ文字列かどうかの比較ができる。

同じか同じでないか以外の比較は、プログラミング言語によって比較の指定がことなる。

文字列の長さ比較なのか、文字コードの大小比較なのか、よくわからないコードは可読性が低く、シェルスクリプトの場合は、OSが変わっただけで比較方法がかわってしまう。

同じOSでも設定違いで変化するから、バグを埋め込むだけである。
0445デフォルトの名無しさん
垢版 |
2019/05/13(月) 18:27:44.64ID:biecMsFD
> シェルスクリプトの場合は、OSが変わっただけで比較方法がかわってしまう。

どんなふうに?

例として2つ(以上)のOSで比較方法を書いてみてよ
0446デフォルトの名無しさん
垢版 |
2019/05/13(月) 18:33:43.96ID:/95lNMvT
だいたいどの種類のシェルか限定していない状態で具体例を挙げても意味がない。
0447デフォルトの名無しさん
垢版 |
2019/05/13(月) 18:34:56.16ID:biecMsFD
意味有るでしょ?限定してないなら
例として○○のシェルならって書けばいいだけだよ
0448デフォルトの名無しさん
垢版 |
2019/05/13(月) 20:41:17.20ID:/95lNMvT
シェルスクリプトが環境依存であることを知らない人間に何を言っても時間の無駄。
0449デフォルトの名無しさん
垢版 |
2019/05/13(月) 20:42:45.31ID:/95lNMvT
文字コードが異なるだけで、文字照合順序がかわる。

同じシェルスクリプトでもテストコマンドの評価が変わる。
0451デフォルトの名無しさん
垢版 |
2019/05/13(月) 20:56:23.36ID:/95lNMvT
>>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オプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
0454デフォルトの名無しさん
垢版 |
2019/05/13(月) 23:06:37.15ID:zTqgOdMW
エンコーディングが変われば文字列の大小比較の結果も変わるかもしれないが
それを指して「比較方法がかわってしまう」と言ってるのか?
そうだとしても OS に依存するものではないだろうし
「シェルスクリプトの場合は」というのもおかしいように思う。
勉強不足な私のためにもう少し説明してはくれないだろうか。
ところで、シェルスクリプトで文字列の大小比較ってする?
0459デフォルトの名無しさん
垢版 |
2019/05/14(火) 09:55:51.06ID:M5HaQ5Df
ん? Bashで文字列の大小ってどうやって比較するんだ?
[ "abcd" < "cde" ]
↑こういうのエラーになるぞ。
0461デフォルトの名無しさん
垢版 |
2019/05/14(火) 11:17:21.83ID:4FRIObo4
文字列の大小は文字列長のことを言っているのか?
0464デフォルトの名無しさん
垢版 |
2019/05/14(火) 16:30:21.51ID:upCBpEzH
「文字列の比較を行う」という構文やライブラリで
文字列長の比較を行ってるものなんてあるか?

数値の比較はできるんだから「文字列長を取得する」命令だけあれば十分
だから「文字列長の比較を行う」命令なんてないだろ
0471デフォルトの名無しさん
垢版 |
2019/05/14(火) 23:19:21.13ID:+OBjJPst
シェルスクリプトはわからないが、文字列長が同じ場合は、文字コードの大小を先頭文字から比較していき、大小比較をするプログラミング言語は存在する。
0473デフォルトの名無しさん
垢版 |
2019/05/15(水) 01:49:21.77ID:MwugOkQt
>>472
PL/SQL
0475デフォルトの名無しさん
垢版 |
2019/05/15(水) 01:59:24.19ID:MwugOkQt
データベースの場合、文字列の昇順、降順をSQLの仕様で意識するから、文字コードの大小比較をするプログラミング言語の仕様があるのは副産物かもしれないが、簡単にできてしまうので存在する。

年月日を文字列で持っていても過去、未来を判定できる。
0476デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:01:38.78ID:qxUiM81Y
> 年月日を文字列で持っていても過去、未来を判定できる。

Wed May 15 02:01:21 DST 2019

日付を文字列で持っていても?
0477デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:04:28.58ID:MwugOkQt
>>474
データベースは設定によって並び順が異なる。だから文字列長が変わったら、設定や製品によって動きが変わる。
0478デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:06:57.93ID:MwugOkQt
>>476
わざと前方からの比較が難しい例を挙げているが、あんたの質問には全部、答えられるよ。
0479デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:08:36.95ID:MwugOkQt
>>476
だいたい日本でその並び順の日付文字列をデータベースに文字列として格納するアホはいない。
0480デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:16:25.95ID:MwugOkQt
日付を文字列で持っていても、過去、未来の判定には型変換をして比較する方がコードとしてはよいコード。

日付文字列を文字列のまま比較するのは悪い例だが、そういうコードを書く人間はいる。

ただし、9999年99月99日等、現実には存在しない年月日に意味を与えて使っているシステムはたくさんあるので、型変換して比較すると、手前でさらに判定ロジックが必要になり、コードが煩雑になる。

言っておくが私はこういう設計は、基本的に好きではないし、良いとは思っていない。
0481デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:21:07.76ID:qxUiM81Y
だから日付を文字列で保つ場合は、文字列照合順で比較すれば、
大小がわかるような「特別に考慮されたフォーマット」で持たなければならないだろ
日本とか関係ねーよ。和暦で持ったら比較できないし、
1月ではなく01月って持たなければならないし

自分が普段使ってるフォーマットと一致しているからたまたまできることを
「年月日を文字列で持っていれば比較できる」って言ってしまうのは思慮が浅い
0482デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:22:49.88ID:qxUiM81Y
>>447
> データベースは設定によって並び順が異なる。だから文字列長が変わったら、設定や製品によって動きが変わる。

文字列長が変わったら、設定や製品によって動きが変わるということは
文字列長が変わらないなら、動きは変わらないってことですよね。

言いたいことがわからない?
なんで全く無関係な文字列長を引き合いに出してるの?って
皮肉を言ってるんだが
0483デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:31:25.71ID:MwugOkQt
プログラミング言語の具体例を挙げると、今度はそのプログラミング言語がわからなくて文句を言う。

結局、あんたはなんだったらわかるのか?
0484デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:33:37.63ID:MwugOkQt
>>482
文字列長が同じであれば、同じ結果になる可能性が高いことを言っている。

文字列長が異なれば、コードを見ただけで絶対こうだとは言えなくなる。
0486デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:39:28.74ID:MwugOkQt
最近、目的がわからない粘着書き込みが多いね。
0487デフォルトの名無しさん
垢版 |
2019/05/15(水) 03:07:05.55ID:qxUiM81Y
>>484
> 文字列長が同じであれば、同じ結果になる可能性が高いことを言っている。

壱弐参 と 肆伍陸 は文字列長が同じだけど、
どういう理由で同じ結果になるの?
0488デフォルトの名無しさん
垢版 |
2019/05/15(水) 03:10:25.42ID:qxUiM81Y
中途半端に抜き出すと意味が分かりづらくなるな

データベースは設定によって並び順が異なる。だから文字列長が変わったら、設定や製品によって動きが変わる。
壱弐参 と 肆伍陸 は文字列長が同じだから、設定や製品が違っても同じ結果になる可能性が高いこと

↑そういう主張をしてるよね?
データベースは設定によって並び順が異なるというのに、どういう理由で
設定や製品が違っても同じ結果(=並び順は異ならない)になる可能性が高いの?
0491デフォルトの名無しさん
垢版 |
2019/05/15(水) 09:22:52.04ID:CNfTVKOT
>>486
君が頭悪そうだからつっこまれてるんじゃないの? (頭が悪いとは言ってない)
>>471 が PL/SQL の仕様だというなら PL/SQL の仕様書に書いてあるでしょ?
それを示せばいいんだよ。
0492デフォルトの名無しさん
垢版 |
2019/05/15(水) 16:16:49.74ID:rgIB+CAi
マニュアルはそんな親切に書いてはいない。行動に意味はないがなんとか相手を打ち負かしたいという心情は理解できているよ。
0494デフォルトの名無しさん
垢版 |
2019/05/15(水) 17:02:18.13ID:GDL/z8kb
スペシフィケーション: 仕様書
マニュアル: 手引書
だからな。こればっかりは>>493が正しい。
なお()
0495デフォルトの名無しさん
垢版 |
2019/05/15(水) 18:03:00.31ID:rgIB+CAi
商用製品に仕様書があるのか?仕様製品の場合はマニュアルに書かれていること、実際の動作が仕様です。
0496デフォルトの名無しさん
垢版 |
2019/05/15(水) 18:09:47.46ID:vLW8hIEw
ただの些末な言い争い。どっちも
どっちでもどうでもいいだろう。いいたいことがわからないわけでもなし
0497デフォルトの名無しさん
垢版 |
2019/05/15(水) 18:12:01.21ID:rgIB+CAi
外国人は想定仕様と実態仕様が異なるから、仕様書など公開しない。

ユーザーが何かバグらしきものを見つけて報告して初めて仕様なのかバグなのかを答える。

世界基準では仕様通りにできていない、仕様どおりに作らないのが普通。

これが現実なのに、仕様書、仕様書と仕様書が存在すると思っているなら、この業界から去った方がいい。
0498デフォルトの名無しさん
垢版 |
2019/05/15(水) 18:14:29.75ID:rgIB+CAi
このスレッドはOSの種類、シェルの種類も書かずに、質問してくるやつらばかりだけど、なんなのかな?
0500デフォルトの名無しさん
垢版 |
2019/05/15(水) 18:24:53.91ID:GDL/z8kb
文字列の大小比較をシェルスクリプトで行うなら
sortとか使ったらいいのかな。
[ "$(<<. sort | head -n 1\
$1\
$2\
.)" = "$1" ]
↑こういう感じで。
0502デフォルトの名無しさん
垢版 |
2019/05/15(水) 18:49:05.20ID:CNfTVKOT
「仕様書」と書いたことにそこまでの意味は無いよ。
客観的に見て信頼できるドキュメントで示しなさいということ。
実際、>>471 だけじゃ等しいかどうかの判定しかできない。
文字列の大小比較の話だというなら、どんな条件でそれが起こるのか
SQL で示すなりしてくれないと伝わらないよ。
それをしていない以上、ID:qxUiM81Y の言うことも正論と認めざるを得ない。
0503デフォルトの名無しさん
垢版 |
2019/05/15(水) 19:12:50.12ID:qxUiM81Y
飽きてきたなw

つーか、お馬鹿さんは、さっさと、
文字列の比較で、文字列の長さは一切関係ない。
間違っていました。すみませんでした。って謝ればいいのにw
0504デフォルトの名無しさん
垢版 |
2019/05/15(水) 21:45:08.88ID:GDL/z8kb
飽きてきたんならもう書き込むなよ、荒し。
人を煽ることしかできない癖に議論に参加するんじゃねーよ。

他の皆さん申し訳ない。警告とは言え不快な思いをさせたかもしれない。
ところでもう一度訊くけど、シェルスクリプトで文字列の大小を比較したいときは
sortを使うくらいしか方法はないのかな?
始めに質問した人が条件として設定したような「外部コマンドを使わない」のは無理っぽい……?
0505デフォルトの名無しさん
垢版 |
2019/05/15(水) 21:48:58.32ID:8+QjeEhQ
だから大小とは文字列の長さなのかアルファベット順なのか?
出力のフォーマットはどういうのか?
二つの文字列を比較すればいいのか、複数の文字列を比較したいのか?
を書いてくれないと答えられない
0506デフォルトの名無しさん
垢版 |
2019/05/15(水) 22:04:31.16ID:qxUiM81Y
> だから大小とは文字列の長さなのかアルファベット順なのか?

文字列の(現在の)照合順序だって書いてあるし、決まってる。
文字列の比較を文字列の長さの意味で使う開発者なんていない

> 出力のフォーマットはどういうのか?
書いてない=自由なんだから、お前にとって一番都合がいい方法で答えろ

> 二つの文字列を比較すればいいのか、複数の文字列を比較したいのか?
書いてない=自由なんだから、お前にとって一番都合がいい方法で答えろ

なんで、書いてくれないと答えられないんだか
書いてなくても答えられるだろ。
0507デフォルトの名無しさん
垢版 |
2019/05/15(水) 22:05:43.02ID:qxUiM81Y
>>504
> 始めに質問した人が条件として設定したような「外部コマンドを使わない」のは無理っぽい……?

一つ見つけたが、あまりにもひどい方法なので、皆が見つけられるかのお題とする(笑)
0510デフォルトの名無しさん
垢版 |
2019/05/16(木) 01:20:41.38ID:vwl5T96/
ファイルの名前として文字列郡が与えられてたら
echo *とかで並び換えられる(つまりsortっぽい機能が得られる)んだけど
今回は(恐らく)引数として文字列が渡されるのでやっぱ無理っぽいな。

>>509荒しは無視っとくのが一番だぜ
0511デフォルトの名無しさん
垢版 |
2019/05/16(木) 01:24:03.49ID:M/ddkVVC
>>510
お、俺が見つけた方法に正解にたどり着いたじゃないかw
ファイルがないなら作れば良いんやで?
0512デフォルトの名無しさん
垢版 |
2019/05/16(木) 01:37:32.04ID:Hp+66qW2
文字列比較をファイル名比較にすり替えるなよ
自演も大概にしろ お前の話は詰まらないんだよ
0515デフォルトの名無しさん
垢版 |
2019/05/16(木) 06:47:03.30ID:x+0B705t
>>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でいいんじゃないかな
0517デフォルトの名無しさん
垢版 |
2019/05/16(木) 07:51:42.22ID:0AR+7D8t
いや、仕様というか使う目的が決まらないと
そもそもプログラミングが始められないわけだが
「何々に決まっている(と私は思っている)」というのはプログラミングで
もっとも危険な言葉。これで誤解して会社がなくなった例は
たくさんある。
0518デフォルトの名無しさん
垢版 |
2019/05/16(木) 07:56:40.94ID:LVaXUmAu
>>517
何をこだわっているのか、何をいいたいのか、何を主張したいのか
「何々に決まっている(と私は思っている)」というレスにみえるよ
0519デフォルトの名無しさん
垢版 |
2019/05/16(木) 12:02:41.41ID:M/ddkVVC
>>517
そのうち数値を比較する方法を教えてって言ったら
その数値は10進数なのか16進数なのか
漢数字なのかローマ数字なのか
それを決めてくれないと答えられん(←嘘、答えられる)
って言い出しそうだなw
0520デフォルトの名無しさん
垢版 |
2019/05/16(木) 12:17:22.10ID:zHdFWFB/
別にどっちの味方をするつもりもないけど
例えば文字コード順に比較するんであれば七(U+4E03)は六(U+516D)より小さくなるし
そういう前提というか(此ちらの常識と向うの常識の共有というか)を擦り合わせることは重要だと思うけどね
まあ結局なにが言いたいかっていうと
「シェルスクリプトの話をしてください」
0521デフォルトの名無しさん
垢版 |
2019/05/16(木) 12:46:01.37ID:M/ddkVVC
>>520
そういう話じゃなくて、どちらでもいいことなのに
なんでどちらに決めてくれないと、ワカリマセンになるのかってことだよ

文字の順番の定義と
文字の順番を判定する方法
は別の話

本当は答えを知らなくて「わかりません」っていうのが恥ずかしくて
ごまかすために質問してるんだろ?「お前の質問のせいで、わかりません」って言うために
その証拠に現在の文字列照合順序って答えているのに、それを無視し続けている。
0523デフォルトの名無しさん
垢版 |
2019/05/16(木) 20:10:15.17ID:RxfYxsuF
Unicodeでの漢数字を字の意味での大小ってどこでサポートしてんだろ?
コマンドでは無いかなあ。数字(数値)ならLibreOfficeのSpreadSheetならと思ったらこれも字の意味の数字ではなくてなんか文字(文字コード)としてかな

基本的に C standard library がサポートしている範囲でそれがそこまででしかないのはある意味当たり前といえばあたりまえだと思うけどね
いろいろ作っているのがASCIIコードで十分な外人だから。bashも4.0になってstrcmpからstrcollに変えたぐらいという
0524デフォルトの名無しさん
垢版 |
2019/05/16(木) 20:16:24.45ID:M/ddkVVC
誰もC standard libraryでサポートしてる範囲とか
大幅な制限は書けてないんだが?w
0525デフォルトの名無しさん
垢版 |
2019/05/16(木) 20:21:36.45ID:RxfYxsuF
それが当然のように多数=スタンダードじゃねという意味なんだけどね
漢数字で大小が必要な場合があった場合は何を使うのかなあという疑問だね
0527デフォルトの名無しさん
垢版 |
2019/05/16(木) 21:39:30.50ID:RxfYxsuF
perlは数値比較としては漢数字対応してんのね。あくまでも数値としてだけっぽいけど
0528デフォルトの名無しさん
垢版 |
2019/05/16(木) 21:43:04.24ID:RxfYxsuF
>>526
ああ、どうも。なる、Perlかw
変換かあ。Unicodeが悪いってことで、変換できない文字がないのならShift-JISにしてしまうのがいいような気がしないでもないw
0529デフォルトの名無しさん
垢版 |
2019/05/16(木) 21:50:25.27ID:RxfYxsuF
勘違いしてた。Shift-JISでも同じなのか。そうだったのか...
そもそも漢数字をコンピュータで数字(数値)として扱うことなんて全くはなから考えていないのか、先人も後の人も
0531デフォルトの名無しさん
垢版 |
2019/05/16(木) 22:49:36.61ID:vwl5T96/
漢数字って日常で使うには便利だけど、コンピューターに処理させると面倒だなぁw
Unicode共同事業体によると一→1みたいな変換を文字コードレベルでサポートするかもしれないそうだけど。
0533デフォルトの名無しさん
垢版 |
2019/05/16(木) 23:19:20.59ID:RxfYxsuF
>>531
>サポートするかもしれないそうだけど
ほほう、やっとというか、なにかやる余裕ができてきたのかな
最初にああいう位置に置いた昔の日本人が悪の根源wだろな。漢数字ではなく単なる漢字としてしまったんだろうな
0537デフォルトの名無しさん
垢版 |
2019/05/17(金) 01:08:01.02ID:6dJ1FJgX
シェルスクリプトで文字列を比較するにはどうするの?
→バカ「文字列の比較って、文字列の長さの比較のことやろ」
→バカ2「文字列の比較って、漢数字の比較のことやろ」
0539デフォルトの名無しさん
垢版 |
2019/05/17(金) 01:32:13.98ID:AJ2dA4T/
>>535
お前はいつからこのスレの統治者になったんだ?
お前は自分がいつも絶対に正しいと信じて疑っていないようだが少しは自省の念なるものを持ったほうがいいぞ
老婆心ながら忠告しておく。

>>533
でも漢数字を一概に数字と見做してしまうと
「一郎」とかが名前としてではなく数字+助数詞として認識されてしまうおそれがあるよな
0541デフォルトの名無しさん
垢版 |
2019/05/17(金) 01:44:31.45ID:eic3Lxe/
>>539
コード表中のコード位置でしかないから。単に最初にでもまとめて順番に置いておけばいいだけじゃないかと
数字+助数詞とは別の話。数字+助数詞とかの概念はIMEなどの辞書での話で、文字がコードのどの位置にあるのかはそれにすら関係ないでしょう
0546デフォルトの名無しさん
垢版 |
2019/05/17(金) 07:03:46.75ID:+DCiWWVl
>>545
じゃあさっさとシェルスクリプトでやる話をしろよ
漢数字とはなにか?の話しかしてないだろ
お前がシェルスクリプト以前の話で止まって決められないなら
俺が仕様を定義してやるから

まず使用する文字は一 二 三 四 五 六 七 八 九 十の10種類で1文字だけ(零はなし)
これをシェルスクリプトだけで(外部コマンド呼び出しなしで)比較する方法を書け

それが終わったら使用する文字は同じく一 二 三 四 五 六 七 八 九 十 百 千 の12種類で
九千九百九十九まで。ただし一二みたいな書き方はなし。十二、二十二、二千二のように
必ず十や百や千を含めることする

最後に一 二 三 四 五 六 七 八 九 十 百 千 万 億の14種類で
九千九百九十九億 九千九百九十九万 九千九百九十九まで。

いずれも、以下のような1対1の対応表は作ってはならない。
case
 略
 "十二")i=12 ;;
 "二十二")i=22 ;;
 略
case
0548デフォルトの名無しさん
垢版 |
2019/05/17(金) 07:08:41.43ID:+DCiWWVl
>>546に書いてない例外のパターン(例 百百 みたいなありえないもの)には
対応する必要はなし。いちいち仕様の抜け穴を探そうとする輩が多いからなw
0549デフォルトの名無しさん
垢版 |
2019/05/17(金) 07:14:37.25ID:+DCiWWVl
あとこれが終わったら、この応用(?)で
文字列の比較をシェルスクリプトだけでやる方法を答えるように
0550デフォルトの名無しさん
垢版 |
2019/05/17(金) 07:19:17.37ID:eic3Lxe/
>>543,545
全くそのつもりのそのとおり
誰かみたいに俺正しいという論争wしたいわけでもなし、何が気に食わないのかわからんw
何様なんかどういうつもりなのかわからんから、(直接)相手にしない方がよいよ。どうも子供のようだから言ってもわからんだろう
0551デフォルトの名無しさん
垢版 |
2019/05/17(金) 08:57:56.14ID:9c2BcXsa
問題に難癖つけたいだけで、シェルスクリプトで
実装するという話になったらだんまりなのが
ばれたなw
0552デフォルトの名無しさん
垢版 |
2019/05/17(金) 10:17:57.59ID:SV+iTwUF
アンカーが何のためにあると思ってるんだ
一つのスレで一つの話題しか許されないと思っているなら
さっさと逝ったほうがいい
0553デフォルトの名無しさん
垢版 |
2019/05/17(金) 10:53:33.15ID:AJ2dA4T/
>>549
「答えるように」
嫌ですw
俺はもうすでにヒントを提示してるんだけど
お前の態度が気にくわんから詳細は教えない
0554デフォルトの名無しさん
垢版 |
2019/05/17(金) 10:55:06.48ID:+DCiWWVl
結局シェルスクリプトの話と言いつつ
漢数字での比較をシェルスクリプトで実装しろと言われても
逃げてばっかり(笑)

俺が出した問題じゃなくて、自分で新たに派生させたくせに
派生させたと言いつつ、シェルスクリプトの話をしない
0555デフォルトの名無しさん
垢版 |
2019/05/17(金) 10:57:54.16ID:AJ2dA4T/
>>554
なんでこのスレの住人全員が
お前の出したお題とやらにかかりっきになってくれると思ってんだ?
自己中心にもほどがあるだろ
0556デフォルトの名無しさん
垢版 |
2019/05/17(金) 11:05:46.65ID:+DCiWWVl
だから漢数字での比較は、俺が出したお題じゃねーだろw
自分で出したんだから自分で答えろや
0558デフォルトの名無しさん
垢版 |
2019/05/17(金) 11:12:01.45ID:+DCiWWVl
結局漢数字はシェルスクリプトの話をしたかったわけじゃないってことでOK?
シェルスクリプトの話しろよ
0560デフォルトの名無しさん
垢版 |
2019/05/17(金) 21:23:51.74ID:rpsKTByN
$ ./a.sh <<EOF
> 三千七百七十六 八千八百四十八
> 三十五億 三十五億
> 六百三十四 三百三十
> EOF
三千七百七十六 < 八千八百四十八
三十五億 = 三十五億
六百三十四 > 三百三十
$

漢数字での比較ってこんなのか? そうでないとしてもどうでもいいが。
0562デフォルトの名無しさん
垢版 |
2019/05/18(土) 04:10:45.05ID:Qoy0pg1H
何でもかんでも否定したいだけの子がいるところで
まともな議論はできないしね
0563デフォルトの名無しさん
垢版 |
2019/05/18(土) 05:05:24.43ID:arw0wGqU
砂場の幼稚園児の駄々っ子になんか重なるなあ
お砂場だから自由に遊んでもいいと思うけどwリアルと違って無視すれば居ないのと同じだし
0564560
垢版 |
2019/05/18(土) 09:02:03.67ID:524JDXbW
まあ、かまってちゃんの相手をしたかったわけじゃなくて
C でやるようなテキストのパースを普段あまりシェルスクリプトを書かない俺が
どこまで bash でできるのかと思っただけだからね。気は済んだよ。
そして、こんなことでも自分でやってみる方がかまってちゃんよりも絶対楽しい。
0566デフォルトの名無しさん
垢版 |
2019/05/18(土) 11:21:30.92ID:arw0wGqU
>>560,564
俺の場合、
sed -e ’いろいろいろいろ' | bc
だけと後は比較だけででけた(三千十六 八八四八 なんぞも)
かまってちゃんは何をこんなのにに必死なんだかなあという感想
0568デフォルトの名無しさん
垢版 |
2019/05/18(土) 12:45:20.90ID:JuXjXOXc
>564
> どこまで bash でできるのかと思っただけだからね。気は済んだよ。

bashでってわざわざ書いてあるってことは
POSIXシェルでの実装は断念したってこと?
0569デフォルトの名無しさん
垢版 |
2019/05/18(土) 12:48:00.53ID:JuXjXOXc
>>565
それなw 文字列の比較が難しいって話をしてるのに
漢数字の比較なら簡単って言っても何の解決にもなってないというか
自分で問題を変更して実装したで(どや)ってされてもなぁw
0570デフォルトの名無しさん
垢版 |
2019/05/18(土) 14:31:15.80ID:arw0wGqU
何でもかんでも否定したいだけの子ってよく言ったものだな
目的を果たしているんだからそんなアホな条件にそう気は全くないね(そもそも設問がアホというのも気づいてないみたいだし)
自分がどうしつこく繰り返してたことも忘れたらしいのによく言うよ
0572デフォルトの名無しさん
垢版 |
2019/05/18(土) 14:46:37.88ID:arw0wGqU
回答するなら、一般的に使われるであろう漢数字の比較も出してくれたらいいな
変な条件内の使い道のないようなのでない。簡単と言われて文句つけられるんだから簡単だろうw
とりあえず >>571の言う通りお手並み拝見
0573デフォルトの名無しさん
垢版 |
2019/05/18(土) 17:05:06.76ID:524JDXbW
>>568
断念も何も、考えてすらいないよ。
「bash でやってみる」がテーマなんだから当たり前だろう?
お前の寝言に付き合ってるわけじゃないんだよ。
一応、やってみた感想を述べるなら
「すげーな bash 。でもやっぱりこれはシェルの仕事じゃないな。」
ってとこかな。
それでも楽しめたし多少なりとも bash を理解できたんだからそれでいいんだよ!
0574デフォルトの名無しさん
垢版 |
2019/05/18(土) 17:10:57.93ID:c9LKncuu
回答よろしくってここはお前のお庭じゃねーんだぞw
なにお山の大将気取ってんだ
0575デフォルトの名無しさん
垢版 |
2019/05/18(土) 17:28:33.45ID:G+P7ooBK
どうやらコンセンサスを得られたようだからな
もう一回いうぞ。漢数字の比較の話は
関係ないし誰も求めてないから黙れ、口を閉じろ

bashとPOSIXシェルの違いがわかってないやつが
いるが、bashは許可していない。
文字列の比較はbashで簡単できる(= シェルスクリプトでやるような仕事)

これをPOSIXシェルだけで外部コマンド呼び出し
なしで出来ないかというのがもともとの質問だ
二度とシェルスクリプト以外の話をするなよ
0577デフォルトの名無しさん
垢版 |
2019/05/18(土) 17:33:07.99ID:arw0wGqU
>>574
誰に言っているのかわからんな。ID:jXb4UL4k になら、問題出したんだから答えも出して締めてという一般的なことかな

わかりやすくは、回答ではなく解答なんだろうけど。だからヤツも変に間違って>>569なんてアホなレスしてしまったし
まあ、解答ではなく回答の方がやっぱり正しいのかもだがw
0578デフォルトの名無しさん
垢版 |
2019/05/18(土) 17:40:14.85ID:arw0wGqU
あれだけ最後の方で答えないとか粘っていたのに「関係ないし誰も求めてないから黙れ、口を閉じろ」だって...w
脳みそのメモリ足りなさすぎだろうw

シェルスクリプトはグルー言語とも言われ、コマンドを使うのは普通なので、馬鹿な言い分は聞く必要性は全くないな。shell builtin の意味すら知らなさそう

口を開くほど馬鹿を晒す馬鹿って感じ
0579デフォルトの名無しさん
垢版 |
2019/05/18(土) 17:45:12.45ID:Qoy0pg1H
>>575
つうか
>これをPOSIXシェルだけで外部コマンド呼び出し
>なしで出来ないかというのがもともとの質問だ
できない

で終わってんだろこの話
なんでいつまでも出来ない話に粘着してんの?
出来ないことを証明しろとか、キチガイの戯言を言いつのりたいだけなの?
0580デフォルトの名無しさん
垢版 |
2019/05/18(土) 17:47:31.61ID:arw0wGqU
ああ、もしかして変なの二人いたりするのかな??
だとしたら、勘弁してくれ。アホなことを言うのは一人で十分w
0584デフォルトの名無しさん
垢版 |
2019/05/18(土) 19:25:10.70ID:jXb4UL4k
これは文字列の比較ではないなー
お前バカだろ

こんなしょうもないことで>>431から延々とスレを荒らしたのか
0585デフォルトの名無しさん
垢版 |
2019/05/18(土) 19:43:02.94ID:arw0wGqU
実用性の欠けらも無いのが大好きだな
それなりにスキルがあってなぞなぞ好きならまだしも。スキル磨けよw
0587デフォルトの名無しさん
垢版 |
2019/05/19(日) 00:01:51.89ID:40XRh0yv
>>580
いや,多分「マジで頭おかしい」のは一人。
もう一人もしくは二人くらい,そいつの煽りに乗せられてちょっとキレ気味なレスバを繰り広げてしまっている。

IDやワッチョイを集団でNG指定できる掲示板だったらよかったんだけどなぁ……。
0588デフォルトの名無しさん
垢版 |
2019/05/19(日) 00:14:35.61ID:jyVnriUQ
NG指定すると、そいつの書き込みが見えなくなるから、
そいつの書き込みに「下らないレスを付けるやつ」が減る。
0589デフォルトの名無しさん
垢版 |
2019/05/19(日) 03:57:16.75ID:4/AsmfPZ
>>587
ちょっと安心したwいろいろと。どうも
匿名掲示板だからねえ。それが好きで使ってるのもあるしね、まあ、しょうがない
0591デフォルトの名無しさん
垢版 |
2019/05/28(火) 00:30:04.64ID:WhpCGVUS
$ timer.sh 1h30m
引数がこう指定された場合1hと30mはどう捌けばいいんでしょう?
練習で簡易タイマーを作ったんですが時間の複数指定がどうも上手く行かず
この場合は1時間半の指定にしたいんです
一応1.5hのような数値指定にも対応はさせましたが

timer(){
for arg in "$@" ;do
if [[ "$arg" =~ ([0-9]+\.?[0-9]+?)(.?) ]] ;then
num=${BASH_REMATCH[1]}
unit=${BASH_REMATCH[2]}

case "$unit" in
[s])
count=$(bc -l <<< "scale=2;$num")
echo $(date "+%x(%a) %X") 待機:${num}秒
echo $(date "+%x(%a) %X" -d "$count sec") 再開
sleep $count
;;
...
中はこんなcase文が後mとhと続きます
まだ初学段階ですがもっとマシな書き方はありますかね
0592デフォルトの名無しさん
垢版 |
2019/05/28(火) 01:11:40.50ID:vCL2HYTO
echo 1h30m | { echo 'scale=0;'; sed 's/h/*3600+/;s/m/*60+/;s/s//;s/+$//;s:.*:(&)/1:'; } | bc

とかかな。
0595デフォルトの名無しさん
垢版 |
2019/05/29(水) 19:32:57.87ID:UDeAAaE3
katochan -pe
0599デフォルトの名無しさん
垢版 |
2019/05/30(木) 00:44:29.88ID:nqYCZCfw
遅いからそれがなんなの?って意味なんだけど
そんなに意味がない速さにこだわるなら、なんでもかんでもCで書くべきだろうにw
0603デフォルトの名無しさん
垢版 |
2019/05/30(木) 03:17:49.10ID:nqYCZCfw
>>591は何度も繰り返すわけでもなく単なるタイマー起動するまでだけという、また、例の指定時間が1h30mという
起動するのに、0.1秒かかるのと0.01秒もしくは0.001秒でになんの差があるというのか、なんでそんなとこ気になんの?病気じゃないのってとこかな
0604デフォルトの名無しさん
垢版 |
2019/05/30(木) 19:27:13.10ID:9DfhdkhJ
>>603
同じく。
なんで一回かぎりの処理(しかも要求される精度は1分程度)に
そんなコンマ数秒の速度の違いを考慮しなくちゃならないんだろうか。
0605デフォルトの名無しさん
垢版 |
2019/06/01(土) 00:35:45.39ID:qWUYdvcJ
自分の方が賢いと思って知ったかぶりしてるだけでしょ。子供にはよくあることだよ。
ここには悪質な荒らしも来るんだから、スルーできないと荒らしの思う壺じゃないかな。
0609デフォルトの名無しさん
垢版 |
2019/06/02(日) 20:55:19.29ID:SX5hebJf
>>608
それを言うなら,お題には「プログラムの起動が遅かったらだめ」とも書いてねーよw
だからsedを使っても何ら問題ない。

↓こんなのでいいんじゃないかな?
ちょっと抜けがある(..h..mみたいな不正な指定も通してしまう)けど
自分で使うプログラムなら,これくらい入力時に注意できるから
そこまで厳密な判定は要らないと判断した。
sleep $(echo "($(echo '1h30m' | sed -e 's/\([0-9.][0-9.]\)*h\([0-9.][0-9.]\)*m/\1 * 60 + \2/')) * 60" | bc -l)
0613デフォルトの名無しさん
垢版 |
2019/06/03(月) 01:08:52.27ID:0fpHz+xZ
Ubuntu 19.04 だと

(standard_in) 1: syntax error
sleep: missing operand

となる。

echo "($(echo '1.5h' | sed -e 's/\([0-9.][0-9.]\)*h\([0-9.][0-9.]\)*m/\1 * 60 + \2/')) * 60"

が (1.5h) * 60 になるので bc でエラーになる
0614デフォルトの名無しさん
垢版 |
2019/06/03(月) 03:44:14.58ID:60TnqmAc
>>613
ドットは \ でのエスケープが必用なのでは?
0615デフォルトの名無しさん
垢版 |
2019/06/03(月) 04:14:04.85ID:xnZUjfNJ
>>592は冗長やな

echo 1h30m | { echo 'scale=0;'; sed 's/h/*3600+/;s/m/*60+/;s/s//;s/+$//;s:.*:(&)/1:'; } | bc
echo 1h30m | sed 's/h/*3600+/;s/m/*60+/;s/s/+/;s:.*:scale=0;(&0)/1:' | bc

scale=0はデフォルトだからいらんと思うけど
0616デフォルトの名無しさん
垢版 |
2019/06/03(月) 04:53:12.91ID:xnZUjfNJ
>>613
仕様です。

・1h23m45s みたいな秒には対応していません。エラーになります。
・mは必須です。mを省略した場合エラーになります。1.5hの場合は1.5h00mと入力してください。
・1文字のmには対応していません。エラーになります。1mは01mと入力してください。
・mが3文字以上で文字数が奇数の場合は、対応していません。エラーになります。
・mが4文字以上で文字数が偶数の場合は、下位2文字のみが使用されます。(例 1234m の場合 34、12.345の場合45)
・1文字のhには対応しています。
・hの文字数が偶数の場合は、下位2文字のみが使用されます。(例 1234h の場合 34、1.23の場合23)
・hの文字数奇数の場合は、最初の1文字と下位2文字をあわせた、3文字が使用されます。(例 12345h の場合 145、123.5の場合1.5、1.23の場合23)
0618デフォルトの名無しさん
垢版 |
2019/06/03(月) 05:00:32.74ID:xnZUjfNJ
仕様漏れ

・hは必須です。hを省略した場合エラーになります。30mの場合は0h30mと入力してください。
0621デフォルトの名無しさん
垢版 |
2019/06/03(月) 07:25:22.55ID:amnwC05e
>>616
> ・mが4文字以上で文字数が偶数の場合は、下位2文字のみが使用されます。(例 1234m の場合 34、12.345の場合45)
この仕様の意味ってなに?
この仕様を無視して,
「mの前の数字は2桁でなくてはならない」
という仕様に統一すれば,すごく書き易いシェルスクリプトになると思うんだけど。
0622デフォルトの名無しさん
垢版 |
2019/06/03(月) 07:29:35.13ID:amnwC05e
>>616
追加で質問。
なんでhやmの前の数字の桁数の偶奇に拘るの?
例えば,
・mの前には二桁の整数(0埋め)しか許されない
・hの前には小数点以下一位の精度で99以下の数しか許されない
という仕様のほうが,仕様も短かいし実装も簡潔になると思うんだけど。
0623デフォルトの名無しさん
垢版 |
2019/06/03(月) 08:15:05.64ID:8eXXlkO0
Ruby では、

re = /([^h]+)h([^m]+)m/

# str = "1h0m"
str = "1.5h0m"

md = str.match( re )
# p md[ 1 ], md[ 2 ] #=> capture 部分

begin # 整数じゃなければ、浮動小数点にする
hour = Integer( md[ 1 ] )
rescue ArgumentError
hour = Float( md[ 1 ] )
end

minute = md[ 2 ].to_i # 整数

p hour, minute #=> 1.5, 0
0624デフォルトの名無しさん
垢版 |
2019/06/03(月) 09:09:22.60ID:8ZNdPBG6
行き当たりばったりでコードを書く人(>>609とか>>623)ってのは
お題がでたら、そのお題だけ通るコードを書く。
通らない例が現れたら、その通らない例のためのコードを追加する
別の通らない例が現れたら(以下同文
こんな感じでコードがどんどん長くなっていく

ちゃんと考えてコードを書いている人は短いコードで実現できる
物事を抽象化して考える。そのせいでいろんな場合に対応できる。
行き当たりばったりでコードを書く人は、いろんな場合に対応したら
コードが長くなると考える。だが抽象化するといろんな場合に対応し、かつコードは短くなる
0626デフォルトの名無しさん
垢版 |
2019/06/03(月) 09:33:21.71ID:0fpHz+xZ
>>614
\([0-9.][0-9.]\)*m が入ってしまっているので、

echo "($(echo '1.5h00m' | sed -e 's/\([0-9.][0-9.]\)*h\([0-9.][0-9.]\)*m/\1 * 60 + \2/')) * 60"

とかするしかない

echo "($(echo '1.5h' | sed -e 's/\([0-9.][0-9.]\)*h\(\([0-9.][0-9.]\)*m\)\?/\1 * 60 + \3/')) * 60"

なんてすると、 (1.5 * 60 + ) * 60 になって bc で syntax error
0628デフォルトの名無しさん
垢版 |
2019/06/03(月) 09:40:07.68ID:z2LdD30j
代わりに俺が同じアプローチのまとなコード書いてやるからよ

echo '1.5h' | sed -E 's/(([0-9.]+)h)?(([0-9.]+)m)?(([0-9.]+)s)?/(\2-0)*3600+(\4-0)*60+(\6-0)/' | bc

(.0を消したければ>>615を参考に /1 すればいい)
0630デフォルトの名無しさん
垢版 |
2019/06/03(月) 09:52:56.88ID:z2LdD30j
クソコードはクソコードで終わりでいいって話
あ、クソコードですね♪使い物になりませんね♪でいいってことよ。
いちいちこういう場合にエラーがなりますとかやらなくていい
さっさと廃棄処分してしまおう。
0631623
垢版 |
2019/06/03(月) 11:22:16.99ID:8eXXlkO0
まず設計がおかしい!
バグのほとんどは、設計がおかしいから起きる

時間は、0〜24 の整数のみ。
分は、0〜60 の整数のみ

最大で、24時間までとか

整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!
0632デフォルトの名無しさん
垢版 |
2019/06/03(月) 11:25:36.69ID:8qtiF3dA
>>623 = >>631 の発言

>>623「整数に変換できなければ、浮動小数点に変換する」

>>631「整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!」
0633デフォルトの名無しさん
垢版 |
2019/06/03(月) 11:26:56.98ID:amnwC05e
>>632
やめたれw
0634デフォルトの名無しさん
垢版 |
2019/06/03(月) 12:27:27.29ID:3fU/jk6b
つまりrubyを使うと統合失調症になってしまうということ?
0636デフォルトの名無しさん
垢版 |
2019/06/03(月) 13:28:47.52ID:3fU/jk6b
やっぱりなってしまうんだね…
0637623
垢版 |
2019/06/04(火) 05:26:37.80ID://1XsOfQ
整数に変換できなければ、浮動小数点に変換するとか、明らかにおかしいでしょ?
だから、質問者に言われた通りに書いたら、おかしいと言うこと!

>>631
>時間は、0〜24 の整数のみ。
>分は、0〜60 の整数のみ

多くの言語が採用しているのは、
時間は、0〜23 の整数のみ。
分は、0〜59 の整数のみ

色んな言語の、Time クラスのメソッドを参照
0638デフォルトの名無しさん
垢版 |
2019/06/04(火) 05:55:02.35ID:oQKNEIyc
>>623「整数に変換できなければ、浮動小数点に変換する」

>>631「整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!」

>>637「質問者が整数に変換できなければ、浮動小数点に変換するって言った!浮動小数点でスレを検索してみろ!」

【検索結果】
623 名前:デフォルトの名無しさん[sage] 投稿日:2019/06/03(月) 08:15:05.64 ID:8eXXlkO0 [1/2]
631 名前:623[sage] 投稿日:2019/06/03(月) 11:22:16.99 ID:8eXXlkO0 [2/2]
637 名前:623[] 投稿日:2019/06/04(火) 05:26:37.80 ID://1XsOfQ
0639デフォルトの名無しさん
垢版 |
2019/06/04(火) 06:05:44.33ID:oQKNEIyc
>>637
俺はシェルスクリプトもRubyも上級者なんだよなぁ(苦笑)

$ irb
irb(main):001:0> require 'active_support/time'
=> true
irb(main):002:0> 1.5.hours
=> 5400.0 seconds
0641デフォルトの名無しさん
垢版 |
2019/06/04(火) 23:40:36.15ID:91A1BNDa
>>591
最初に引数を"h"→"h "、"m"→"m "に変換するといいんじゃないかな
0642デフォルトの名無しさん
垢版 |
2019/06/05(水) 00:03:31.85ID:uJguGtrO
小数点を含んだ時刻表記(単位は時・分)を秒数に正規化する,みたいな話かね
0643デフォルトの名無しさん
垢版 |
2019/06/05(水) 01:44:13.04ID:Rs8bMd2A
練習のために書いてて、うまい書き方は無いかという話だった気がするのだが…
0644デフォルトの名無しさん
垢版 |
2019/06/05(水) 12:04:44.96ID:UTQhx3T7
だよな、単に。sedならという応えも直後にあっての
変なのが変な話に変えてる
0645デフォルトの名無しさん
垢版 |
2019/06/05(水) 12:17:13.51ID:HgsnwJuZ
質問者「今から1時間後とか、あと1.5時間後とかにも対応してみました」

Ruby厨「整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!」
Ruby厨「時間は0〜24の整数のみ! 午前1時30分のことを1.5時とか言わない!」
0646デフォルトの名無しさん
垢版 |
2019/06/05(水) 15:13:01.25ID:ufQ3ijM/
バッシュでファイル名がアスキーコードが判定する方法教えて下さい一番簡単に
アスキーコードはUTF8の一部でもあるのでnkfは確認出来ないとおもいました
0647デフォルトの名無しさん
垢版 |
2019/06/05(水) 16:22:42.00ID:ujLKUPuk
if iconv -t ASCII <<< "$filename" > /dev/null 2>&1; then

必要なら -f を。必要なら ASCII 以外の他のエンコーディングを
0648デフォルトの名無しさん
垢版 |
2019/06/05(水) 16:47:06.73ID:HgsnwJuZ
>>646
この程度でbash専用にする必要ない。nkfもiconvも遅い。

case $filename in
*[!a-z]*) # a-z以外の文字がある
*) # a-zのみ
esac

あとはASCIIのみになるようにすればいい
POSIX文字クラスを使うと楽
https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions#Character_classes

制御コード入れたいのかにもよるのとASCIIコード以外にあてはまるかどうか調べてないが
例えば [![:cntrl:][:print:]] とかかな? 最悪一文字ずつ書けばいいだろう。
0653デフォルトの名無しさん
垢版 |
2019/06/05(水) 17:27:42.29ID:xkVLsoK0
やはりRuby厨と変わらないw
正しく動くのを示せばいいだけでしょ、勝手にa-zだけじゃなく。それがちゃんとASCIIと判定できるなら
0657デフォルトの名無しさん
垢版 |
2019/06/05(水) 17:37:01.79ID:xkVLsoK0
意味わからん。ちゃんと正しく動くのを示せばいいだけじゃん
なんでそんな妄想に走る?まあ、>>645と言っておきながらの>>648でそういうのがデフォなんだろうけど
俺はRuby厨でもなんでもないよ、ざんねん
0658デフォルトの名無しさん
垢版 |
2019/06/05(水) 17:39:55.68ID:HgsnwJuZ
だからお前と問答する必要はない話だよねw
質問者にヒントを出した。あとは自分でやるか、"質問者"が泣きつくかどうかだろ
なんでお前が泣きついてるんだ?えーんえーん(笑)
0659デフォルトの名無しさん
垢版 |
2019/06/05(水) 17:43:17.72ID:xkVLsoK0
ヒントを出した、泣きつくかどうか
よくそんな言葉吐けるな。ちょっと前のいつものヤツか、その子供のような最後といい、よく恥ずかしげもなく書けるなw
0665デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:01:04.69ID:ye33y5kG
bash や zsh の場合、locale 依存なんだなぁ

$ bash -c 'LC_CTYPE=C; case 1 in *[![:cntrl:][:print:]]*) echo 'x';; *) echo 'y';; esac'
x
$ bash -c 'LC_CTYPE=ja_JP.UTF-8; case 1 in *[![:cntrl:][:print:]]*) echo 'x';; *) echo 'y';; esac'
y

bash で [:ascii:] を使う場合には locale は関係なし

$ bash -c 'LC_CTYPE=C; [[ 1 = *[![:ascii:]]* ]] && echo x || echo y'
x
$ bash -c 'LC_CTYPE=ja_JP.UTF-8; [[ 1 = *[![:ascii:]]* ]] && echo x || echo y'
x
0666デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:05:10.12ID:xpgfEjrk
>>665
そうそう。だから面倒なので「ASCIIコード以外にあてはまるかどうか調べてない」し
「最悪一文字ずつ書けばいい」
あとbashやzshって限定しなくて良いよ。全部そうだから

> bash で [:ascii:] を使う場合には
[:ascii:]はPOSIXクラスじゃない
0667デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:12:43.44ID:9iVEjLSM
なんで誰も求めていないPOSIXや速さにそんなにこだわるんだかな
>>665はちゃんと前段と分けて「bash で [:ascii:] を使う場合」とも言っている=「bashで」と言っているのに、なんでそうも自分は知ってるを出したいんだか
0668デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:15:02.41ID:ye33y5kG
ところが Ubuntu の dash(conform with the POSIX 1003.2 and
1003.2a specifications for the shell)は依存しないのよね…(上の例ではどちらも x を返す)
0670デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:15:31.51ID:xpgfEjrk
「求めていない」と明言していない以上、
「求めていない」なんてお前が断定するなってことだよ。
0672デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:21:58.87ID:9iVEjLSM
>>668
なんだろ、C Standard Libraryにそういうのがなくて各々独自実装とかかな?
POSIXで明確に文字(コード)として、これこれと規定してなくて独自判断実装とかか
0673デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:29:57.26ID:9iVEjLSM
dashはプログラムでロケール(LC_CTYPE)の設定をしてない手抜きとかか。も考えられるね。どうであろうとデフォ= Cという
0674デフォルトの名無しさん
垢版 |
2019/06/06(木) 17:44:19.74ID:KuydtzNG
>>651
> 正しく動くASCII判定のをどうぞ
どうぞじゃなくて、それをやってみせる大チャンスだったのでは?
そうすることに意義があると思うならね。
0676デフォルトの名無しさん
垢版 |
2019/06/07(金) 08:04:35.63ID:rFfmCjQx
「助ける」って表現おかしくね?
だって誰も「助けてくれ」なんて言ってないじゃん。
既に質問者の「助けて」には親切な奴が答えてくれている途中だった。

正しく動くプログラムに勝手にケチ付けた挙句、なんの案も出さずに「間違ってる」だけしか言ってないよね。
0677デフォルトの名無しさん
垢版 |
2019/06/07(金) 09:02:53.19ID:wbS/xMGA
それな。

こっちは「こんな感じで作れますよー」って言ってるだけ
あとは簡単なので質問者でもできるだろう
(できないなら何かしらのレスをするだろう)

そこにいちいち、それは完璧に動かないって言うだけ。言うだけ厨w
0679デフォルトの名無しさん
垢版 |
2019/06/07(金) 23:38:40.76ID:sMkNqk8q
>>645
>Ruby厨「時間は0〜24の整数のみ!

時間と時刻が混ざってるようだな
こういう奴が仕様作成すると大変なことになる
0681デフォルトの名無しさん
垢版 |
2019/06/14(金) 01:38:30.44ID:ndORQo1H
某知恵袋で見かけた「ID非公開」さんの質問。

> Linuxのシェルスクリプトで質問です。
> リダイレクトの0は標準入力、1は標準出力、2は標準エラー出力。
> 0、1、2の他にも、3以上の番号もあるそうです。
> これら、3以上の番号を使った例を教えてください。

カテゴリマスター sle********さんの回答

> ファイルをオープンすれば3から順に使われるのだけど。
> 0,1,2の3つしか呼び出すプログラムには伝わらないのでできないのじゃないかな。

シェルスクリプトの話だということすら理解できてないなら回答するなよ。
シェルスクリプト リダイレクト exec
でググれよとか思ったけど、「ID非公開」という時点で相手にする価値が無いしなあ…
0683デフォルトの名無しさん
垢版 |
2019/06/14(金) 14:10:08.67ID:BMAIfRwQ
まあ確かにその説明は間違ってるけど
態々Yahoo知恵袋の回答を5chに持って来てまで叩くことあるかね……。
0684デフォルトの名無しさん
垢版 |
2019/06/14(金) 22:48:51.07ID:0KPEzZXE
そう言えば以前 flock コマンドを使ってここに書かれているような排他ロックを掛けるのを書いたことがある。
http://fj.hatenablog.jp/entry/2016/03/12/223319
で、リダイレクトはこの例のように 200 とか使ったのだが、しかし、これが使われていたらまともに動かないのではないかと思う。
かといって現在使われていないファイルデスクリプタを探す方法があるのかというと、Linux なら /proc/$$/fd/ 以下を見れば
良いんだろうが多分OSごとにやり方が違っていると思う。ということで開きファイルでスクリプタを探す方法は bash にあるんだ
ろうか? (bash でなくても良いが)。それとも探さずともシステムコールの open() 等のように空きを探し出して使ってくれる
みたいな書き方はできるんだろうか?
0686デフォルトの名無しさん
垢版 |
2019/06/14(金) 23:00:24.10ID:gXbRy3uY
>>680
そこは「くだらねえ質問」だろ

シェルスクリプトの事も書き込んでもよいけど、
シェルスクリプト専用のスレではない!
0688デフォルトの名無しさん
垢版 |
2019/06/14(金) 23:21:07.72ID:kMuJFPPh
>>684,685
空いているではなく、開いているまたは開いていないならわかりそうだが
: >&200
しかし、なんで012以外をも直値にしたんだろうね
0689デフォルトの名無しさん
垢版 |
2019/06/18(火) 06:18:56.48ID:3nOE2mBA
プログラム板にキチガイ降臨中!botに一晩も反応する異常さ
一般人(学校恩師)に殺害予告をしているのでスレ建て通報してください。
https://mevius.5ch.net/test/read.cgi/tech/1559872586/

142 名前:a4 ◆700L1Efzuv 投稿日:2019/06/18(火) 05:29:55 ID://qVkzO
>>141
名古屋の人な 俺ね、君の問題を大橋先生と混ぜないことにする。つまりね、
片桐孝洋のことをボコろうと思う。普通に顎の骨を折る。これくらいで警察来るか?
一般市民とかさ、普通にさ、俺らの秘密なんだけどさ、日本人なんて復活ねーから。
0690デフォルトの名無しさん
垢版 |
2019/06/18(火) 15:03:38.59ID:3Qr44a8e
shebangの書き方について教えてください。

#!/bin/sh
# Next line is comment in Tcl, but not in sh... \
exec tclsh "$0" ${1+"$@"}
( 出典: https://rosettacode.org/wiki/Multiline_shebang )

コメント解釈の違いを利用して複数行に云々は分かります。
ただ気になった箇所が...

${1+"$@"}

これは一体どういう意味合いが込められてるのでしょうか?
Tcl 以外にも Perl とかでも同様の箇所があります。

引数 $1 が unsetなら null
そうでなければ "$1" "$2" "$3" . . . って事ですよね。
それって、ただ "$@" と書くのと違いが分かりません。

ちなみに公式推奨は
man tclsh8.5 までは "$@"
man tclsh8.6 からは ${1+"$@"} になっています。ただし説明文はそのままでした。
0691デフォルトの名無しさん
垢版 |
2019/06/18(火) 15:38:35.82ID:3Qr44a8e
良い解説があったので解決しました。
https://www.in-ulm.de/~mascheck/various/bourne_args/

スクリプトに引数を与えない場合、
一部の古いシステムでは "$@" の解釈が
nothing (何もない) ではなく "" (空文字)になってしまうからだそうです。
0693デフォルトの名無しさん
垢版 |
2019/06/18(火) 16:43:58.58ID:+9W61W8S
参考までに言っておくと、>>691のリンク先にも書いてあるが、
古いzshは ${1+"$@"} は期待したとおりに動かない
完璧な解決方法は、例 eval exec tclsh "\"$0\"" ${1+'"$@"'}
0695デフォルトの名無しさん
垢版 |
2019/06/18(火) 21:39:14.68ID:ADqK1Q88
お約束
・特記なき場合,Bourne ShellもしくはPOSIX準拠のsh互換(というより再現=jシェルが質問・議論の前提です。
 つまりシェルスクリプトのシバンは#!/bin/shです。
 他のシェル(Bash, Zsh, Ksh, BusyBox sh, DASH, Yash, posh, fish, (t)csh)などの専用機能に依存する場合は,その旨を明示しましょう。
  macOS及び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なので注意。
 (t)cshでのシェルスクリプトは*まったく推奨しません*。
  (参考URL: http://www.speech-lab.org/~hiroki/csh-whynot.euc)
・POSIX (Portable Operating System Interface) に準拠しましょう。
 有用なリンクはhttps://en.wikipedia.org/wiki/POSIX末節などを参照。
 最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
  (左上の「Shell & Utilities」から各コマンドの仕様を閲覧できます。また,コマンドだけでなく,ファイルその他の仕様も閲覧できます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh,次点でDebianなどに搭載されているDASH。
  Heirloom sh: http://heirloom.sourceforge.net/sh.html
  Dash shell: http://gondor.apana.org.au/~herbert/dash/
・Unixにはシェルスクリプトに便利な小さなコマンド類がいろいろあります。
「並び換え (sort(1))」「検索 (grep(1))」等々。
 Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
 apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
0696デフォルトの名無しさん
垢版 |
2019/06/22(土) 11:26:37.15ID:RW0mnOsC
bashしか使ったことないけど下手に汎用性を意識してshで書くと裏目に出るってことか
某原理主義者涙目だなそりゃ
0698デフォルトの名無しさん
垢版 |
2019/06/22(土) 17:23:54.76ID:QCRIg0Bb
以前(といっても10年以上前)は汎用性を考えて、
ブレース展開とかを使わずに書くようなこともしてたけど、
今はもうbashベッタリな書き方をするようになったわ。
それで困ったことはなかったし。
0700デフォルトの名無しさん
垢版 |
2019/06/22(土) 17:48:50.05ID:7bhVGeaO
macはzshになるんだってなw
0704デフォルトの名無しさん
垢版 |
2019/06/22(土) 21:47:38.28ID:wZKOjh5O
2倍遅いくらい?
システムコールでのシステム内滞在(?)の方は4倍弱かかってんのね。なんらかのシステムコールの呼び出し回数が多いのか
0706デフォルトの名無しさん
垢版 |
2019/06/22(土) 22:48:15.57ID:nLud9E0Q
>>705
もし理由わかったら教えてくれない?
bashもだけどzshもなんでdashにくらべてあんなに遅いんだろうか
kshが速いのは特定条件下でサブシェルを回避してるからってわかってるんだが
0707デフォルトの名無しさん
垢版 |
2019/06/23(日) 00:33:42.02ID:T9PQd+F5
シェルスクリプトというより対話シェルの話題なんだけど
Kshを「業務上 仕方無く(AIX案件とか)」とかではなく使ってる人っています?
今までBashを対話シェルに使ってきたけどKshもかなり便利そうだし何より高速らしいので興味はある
公式サイト(http://www.kornshell.com/)もあってドキュメントも充実してそうだから使ってみたくはあるんだけど
実際に令和にもなってKshを常用してる人がいるのか知りたい。
0708デフォルトの名無しさん
垢版 |
2019/06/23(日) 01:41:24.67ID:ZvVZ9R+J
bashですら「業務上 仕方無く(Linux案件とか)」、だなあ
AIXで生活できるような金持ちっているのかねw
0709デフォルトの名無しさん
垢版 |
2019/06/23(日) 08:23:09.41ID:EWmWLeCI
私は業務上の制限がないので、自分の意志で bash を使っているけどね
不便を感じたことは一度もない
0710デフォルトの名無しさん
垢版 |
2019/06/23(日) 08:40:08.51ID:ZvVZ9R+J
お題はkshで生活してる人は?なのにbashで不便がないとか言われても可哀想だ
0711デフォルトの名無しさん
垢版 |
2019/06/23(日) 09:17:09.53ID:fwFAut7X
for でループすると遅いから、while を使えばよい
0712デフォルトの名無しさん
垢版 |
2019/06/23(日) 20:48:21.80ID:Hk4wLzeC
シェルスクリプトで遅いと感じるのなら
それはシェルスクリプト向きではないということだ
0717デフォルトの名無しさん
垢版 |
2019/06/23(日) 23:42:25.49ID:T9PQd+F5
なんか寧ろ
「シェルスクリプトが得意とする作業なのに
シェルスクリプトを知らないせいでC#やRubyやPythonやらに固執する」
っていう例を数多く見掛けるな。特にWeb上のブログとか。
0718デフォルトの名無しさん
垢版 |
2019/06/24(月) 00:09:49.32ID:JSF3ka2M
>>716
中でawk使って複雑な事をしたりしてw
perl使うぐらいになったらもう全部perlにするかという気分にはなるな。
0720デフォルトの名無しさん
垢版 |
2019/06/24(月) 09:13:55.59ID:XM+cNyeI
awk使うならsedいらんやろ
perl使うならawkいらんやろ
0722デフォルトの名無しさん
垢版 |
2019/06/24(月) 09:26:43.54ID:Ih+U6NjR
最近は ruby も使ってるな
だからって ruby 以外全部いらんとか言わないけどなw
0723デフォルトの名無しさん
垢版 |
2019/06/24(月) 09:54:11.13ID:GG24ezzu
シェルスクリプトと言いながら、ほとんどをawk使って実装しているのを見ると
お前大したことないなって思ってしまう。
0724デフォルトの名無しさん
垢版 |
2019/06/24(月) 13:17:34.61ID:a0F4XMAJ
awk は、CSV が使えないだろ

それと、空白で、列を区切っている際、文字列内に空白があると、どうなるのか?
誤動作するのか?

やっぱり、Ruby が楽
0725デフォルトの名無しさん
垢版 |
2019/06/24(月) 13:33:16.85ID:c6qVqrI9
まあ適材適所ですよねー
自分用なら好きにすればいいけど、
仕事で超絶技巧を駆使したスクリプトを残されても困りますし。
0726デフォルトの名無しさん
垢版 |
2019/06/24(月) 13:39:12.42ID:O6cXrA2h
GNU awk なら組込み変数 FPAT(Field PATtern) を使う方法が
あるけど、

echo 'aaa "bbb ccc" ddd' | gawk -v FPAT='([^ ]+)|(\"[^\"]+\")' '{print $2}'

まぁ使わないわな
0727デフォルトの名無しさん
垢版 |
2019/06/24(月) 14:17:45.54ID:ZKJigLEQ
素のwindowsで正規表現パターンの置換コマンドを使おうとする場合、
一番手軽なのはBusyBoxのsedかねぇ。
他のPCで実行する必要があるときいつも悩むわ。
0729デフォルトの名無しさん
垢版 |
2019/06/24(月) 17:10:03.02ID:qnOmIbRW
いずれにしてもPython・Ruby・Perlを中途半端に知ってるせいで
シェルスクリプトでやればクソ程 単純な作業を
ファイル操作関数なんかをこねくりまわしてるのを見ると
いやPython・Ruby・Perlなんかよりシェルスクリプトのほうがよほど
学習が簡単で仕様も短いんだからそれを使えよw
とは思うな
0730デフォルトの名無しさん
垢版 |
2019/06/24(月) 19:20:37.72ID:lyh6bIzY
>>727
PowerShellだろ。コマンド入力と出力の例:

 PS C:\> "The quick brown fox jumped over the lazy dog." -replace "([^ .]{4,})", "[`$1]"
 The [quick] [brown] fox [jumped] [over] the [lazy] dog.
0731デフォルトの名無しさん
垢版 |
2019/06/24(月) 19:42:19.51ID:hXFbATXB
シェルスクリプトでは、コマンドが別途必要ということからくる互換性を考えると、
各種スプリクト言語(公式バイナリ添付の標準モジュール)という選択にも理由があるわな。

単純なテキストのハンドリング程度なら、必要なコマンドがないなんてことはないから問題ないだろうけど。
0733デフォルトの名無しさん
垢版 |
2019/06/24(月) 19:52:23.47ID:DDT4XoH6
バッド・スプリクト
0734デフォルトの名無しさん
垢版 |
2019/06/24(月) 20:10:18.30ID:SYnG+fYe
>>731
コマンド VS 標準モジュールのコードを見比べてみるとわかるが、
ほとんどの場合、コマンドを使ったほうがシンプルである。
0735デフォルトの名無しさん
垢版 |
2019/06/24(月) 20:16:04.28ID:yIlGaHve
ぼくなんてほかのひとに仕事取られないように超絶技巧スクリプト作ってるぜ?
0737デフォルトの名無しさん
垢版 |
2019/06/24(月) 20:53:55.73ID:Ih+U6NjR
こうしてメンテ不能なものが増えていく
そういうのは個人の趣味でやってくれ
0738デフォルトの名無しさん
垢版 |
2019/06/24(月) 21:07:51.65ID:4+LiJo6+
sed 's/ /_/g' の空白を強調するために
sed 's{ }{_}g' と書いたら通らなかったので
perl -pe 's{ }{_}g' にした
0739デフォルトの名無しさん
垢版 |
2019/06/24(月) 22:00:43.72ID:qnOmIbRW
「コマンドを別途用意する必要がある」からシェルスクリプトは不利っておかしくね?
じゃあ他のほとんどの言語でもファイルを扱うには「OSに依存したライブラリを呼ぶ必要がある」からファイルを扱うのに互換性は損われるかもしれないよね。
その点,POSIXという古くて強大な規格があるシェルスクリプトは,少なくともファイルの標準的な扱いにおいてはかなり有利だと思うわ。
ちなみにそのPOSIXが,最低限用意しなくてはいけないコマンドを規定してるから↓
http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
ここにあるコマンドは(あまりに古すぎるuu*関連とSCCS関連を除けば)ほぼどのシステムでも利用可能で,インターフェースも統一されてる。
だからPOSIXに準拠していれば,互換性の問題はかなりの部分が解消される筈。
もちろん細かい部分で非互換な挙動はあるだろうけど,それはシェルスクリプトに限った話じゃないと思う。
0740デフォルトの名無しさん
垢版 |
2019/06/24(月) 23:38:29.17ID:d7e7JOi5
C言語ソースの方がはるかにポータビリティが高いし対応できる人材も豊富だよな。
書くのとリビルドするのが面倒だからスクリプトを使うだけで。
0741731
垢版 |
2019/06/25(火) 00:46:35.21ID:U26iaC7q
>>739
OSクロス環境への配慮を言い出したら、シェルスクリプトだって同じでしょう。
Windows上のWSLやCygwinなんかで、*nixと同じシェルスクリプトがそのまま実行できるというわけではないし。
あなたの言うように、上の方にもあるような、シェル同士での非互換性も見られるからねぇ。

それに、そもそも自分は、シェルスクリプトが不利だ、と言ってるわけではなく、
条件によっては各種言語のほうが選択肢になりうると言ってるだけだよ。
それこそ標準モジュールだけでできることって、結構あるからね。

まぁ、一つに絞れるなら、どれだけありがたいことか。
C言語がいまでも生き残っているのは、まさに最大公約数的な立場にあるからなんだろうな。
0742デフォルトの名無しさん
垢版 |
2019/06/25(火) 00:57:21.48ID:5X/+rI3v
でも既存のコマンドの組み合わせでできるのに
わざわざrubyとか使って書くやつがいるよね
むしろそっちのほうが多いよね
0744デフォルトの名無しさん
垢版 |
2019/06/25(火) 01:04:49.56ID:5X/+rI3v
C言語には機種依存する部分を、C言語から排除してるから
言い換えるとC言語だけでは機種依存するするようなことは何も出来ない。

これをシェルスクリプトに置き換えると、機種依存する部分を外部コマンドに
置き換えてるから、シェルスクリプトは機種依存しないってこと
0745デフォルトの名無しさん
垢版 |
2019/06/25(火) 01:58:59.20ID:yYWVi1kF
まだgrepとsedとawkの基本が使えるようになった程度だけど確かに万能感あるわ
perlも覚えるべきなんだろうがこいつは正規表現でしか出番ないわ
正規表現まで方言あると勘弁してください
0747デフォルトの名無しさん
垢版 |
2019/06/25(火) 02:42:31.60ID:5X/+rI3v
Perlはプログラム言語だよ

Perlの気に入らないところは標準モジュールが
誰かが作ったライブラリを標準添付してるだけって所

だからPerlのバージョンを変えなくても標準モジュールの
バージョンが変わってしまったり、Perlのバージョンを変えると
標準添付されているモジュールが変わったりと標準が安定していない
0750デフォルトの名無しさん
垢版 |
2019/06/25(火) 08:12:25.16ID:7F89fU7n
awkがプログラミング言語でないとでも?
0751デフォルトの名無しさん
垢版 |
2019/06/25(火) 19:07:36.51ID:SVEcKi8R
シェルスクリプトでファイル走査して、
ディレクトリなら再起しつつ、
普通のファイルならperlでファイル開いてなんか処理する。
見たいな使い方するな。
シェルスクリプトはファイル走査が簡単、
perl等はファイルの中の処理が簡単ってイメージ。
0752デフォルトの名無しさん
垢版 |
2019/06/25(火) 20:06:41.52ID:fN+iFfQl
シェルスクリプトでごりごり書いたら出力結果でるまで数十秒でるようになったんで
python で書き直したら1秒かからなかった、とかもあるしなぁ。
ヘビーなスクリプトファイル向けの、sed/awk/grep がビルトインになってるスクリプト向け bash が欲しいわ。
0756デフォルトの名無しさん
垢版 |
2019/06/25(火) 20:24:51.66ID:cs2C/fkq
>>753
それの遅い原因はわかっていて、ループの中でコマンドを呼び出しているから
yashは浮動小数点数が使えるから、簡単にコマンド呼び出しをなくせるし
シェルスクリプト用の浮動小数点数ライブラリがあればもっと高速化できる

もちろん他の言語よりかは遅くなるが、逆に言えば少数を使わない処理は
シェルスクリプトでも十分速い
0758デフォルトの名無しさん
垢版 |
2019/06/25(火) 21:57:45.49ID:DXMPLOPq
別に拘ってないよ。
前にも言ったけど、寧ろシェルスクリプトを「使わない」ことに必死な人物の方が多く見受けられる

そういう人々はPythonやRubyやらは便利で何でもできると思ってるようだが 実のところその殆どの機能はシェルスクリプトで十分まかなえる
しかもUnix系OS(これは世界で最も広く使われているOSの一つ)には既定でPythonやRubyはないがPOSIX環境ならある、というようなものもかなりある。
0759デフォルトの名無しさん
垢版 |
2019/06/25(火) 22:12:19.75ID:NEREV216
それが拘っているというのだよ、別にいいじゃん他人の好き好みなら
たんなるグルー言語としてしか使わないのがいても当たり前、グルー言語の発祥元がシェル=シェルスクリプトなんだし
無理して、技巧的にならざるを得ないシェルスクリプトでやりたくないと思うのがいても普通だろうと思うけど

その最後のもそんな窮屈な環境を持ち出さなければ、持論が弱いもしくはやはりこだわりたいだけだなと思うだけだな。世間一般的にそんな環境ってどれだけあるんだか
0760デフォルトの名無しさん
垢版 |
2019/06/25(火) 22:14:13.67ID:cs2C/fkq
こだわるってのはシェルスクリプトでやるのが難しいのをシェルスクリプトでやることであって
シェルスクリプトでやるのが簡単なことを、わざわざ他の言語で長いコード書いてやるのは
単にシェルスクリプトが使えないだけ
0761デフォルトの名無しさん
垢版 |
2019/06/25(火) 22:18:25.41ID:NEREV216
それで?誰のこと言っているの?スレにではないどこぞのブログとかの?
そんなことことで言って、なんなの?まさか、シェルスクリプト使える俺ってわけじゃないんでしょ?
0762デフォルトの名無しさん
垢版 |
2019/06/25(火) 22:35:37.53ID:T59Fmr+u
>>758
使うとか使わないとか、どちらかに「必死」とか考えちゃうほうがおかしくないか?
本人が使いやすいと思う使い方を、とやかくいうことでもないでしょ。

Windowsで普段PythonやRubyを使ってる人(それなりの利用者がいる)が、
たまたま別の*nixの環境を使うことになった場合、
慣れないシェルスクリプトを使うことより使い慣れた各種言語を使うことだって選択肢としてあり得る。
たとえ、自己満足でそれを選択したとしても、それはそれで否定されるようなことじゃないよね。
0763デフォルトの名無しさん
垢版 |
2019/06/25(火) 22:37:43.25ID:cs2C/fkq
× 自己満足でそれを選択したとしても、
○ シェルスクリプトが使えない能力不足で選択しても

だろ?
0765デフォルトの名無しさん
垢版 |
2019/06/25(火) 23:09:53.71ID:NEREV216
わざわざそんな変な訂正するくらいシェルスクリプトを使えるのがよほど自慢らしい
話にはならないな、このスレ見てるのはシェルスクリプトが使える人だろうというのに
0766デフォルトの名無しさん
垢版 |
2019/06/25(火) 23:40:27.61ID:DXMPLOPq
>>762
もちろんそう。
でもシェルスクリプトを使うのに「拘る」
という言い方がちょっと気になってね。
0771デフォルトの名無しさん
垢版 |
2019/06/26(水) 08:58:30.18ID:qk5ECIA8
女子中学生Love
0772デフォルトの名無しさん
垢版 |
2019/06/26(水) 11:09:09.74ID:+23jdxl3
例えば、環境変数PATH を、パス区切り文字で区切って、1行ずつ表示したい

PowerShell なら、
$env:Path.split( ";" )

Ruby なら、
echo $PATH | ruby -ne 'puts $_.split( ":" )'

シェルスクリプトなら、
echo $PATH | tr : "\n"

tr で変換するのが、しっくりこない!
ただ、区切り文字で区切って、1行ずつ表示したいだけ!

シェルスクリプトで、簡単・可読性が高い、書き方があるかね?
0778デフォルトの名無しさん
垢版 |
2019/06/26(水) 15:17:24.20ID:4AX1EN8S
>>776
おお!すごい。
これはPOSIX準拠してるからどのOSでも(しかもPowerShellやRubyみたいな標準化されてない言語が入ってないUnix系OSですら)使える。
しかもIFSは「Internal Filed Separator」という意味で,それの値を変えるということは
「区切り文字を変える」ことを明示できる。
しかも余計な外部コマンドを使ってないから早い。
0779デフォルトの名無しさん
垢版 |
2019/06/26(水) 15:23:24.08ID:4AX1EN8S
もちろん時と場合によってPythonやC#を使ったりするけど,それでもシェルスクリプトを一番に考える理由って,規格と実装とが綺麗に分かれてることなんだよね。
PythonやC#にも一応規格というか標準はあるけど,その実装は公式のものとあと二つ三つくらいしかない。
シェルスクリプトにはPOSIX標準という「私は実装しません。この文書を読んで好きに実装して下さい」という素晴しい哲学の規格-実装の仕組みがある。
そのお陰で数十もの個々のPOSIXシェル実装があるから,様々な機械で動かせる。PDP-11用のC#コンパイラなんてないでしょ?
まあ複雑なこと(XMLパースとか排他処理とか)やろうとすると途端に面倒なことになるので,そういう時はPythonやC#に逃げるけどw
0780デフォルトの名無しさん
垢版 |
2019/06/26(水) 15:23:55.57ID:4AX1EN8S
あ,「今時PDP-11なんて使わねーよ」なんていう例えという概念が分かっていないツッコミはなしで。
0781デフォルトの名無しさん
垢版 |
2019/06/26(水) 15:38:30.86ID:A3AE1MVC
>>778
> しかも余計な外部コマンドを使ってないから早い。

正確に言えば、mkshとposhではprintfは外部コマンド
それを避けたい場合は>>774になるだろうね
0783デフォルトの名無しさん
垢版 |
2019/06/26(水) 17:23:49.84ID:A3AE1MVC
>>782
それらはシェルに組み込まないと実現不可能なものだからね
カレントシェルの状態を変更・取得するものだから外部プロセスではできない。

それ以外は外部コマンドでいいわけだよ。
古いzshもprintfはビルトインではない
0784デフォルトの名無しさん
垢版 |
2019/06/26(水) 19:36:40.66ID:Y3pTO8/n
速度問題にするならプロファイラ欲しいよね
ボトルネック探すために

どんなツールを使っている?
0785デフォルトの名無しさん
垢版 |
2019/06/26(水) 19:56:32.05ID:A3AE1MVC
基本はtimeだな。あとはstrace使ってfork数の確認とか
シェルスクリプトが遅くなる原因はforkが大半なので
これを抑えるようにすると速くなる。
あとzshだとzprofというのが使える
0786デフォルトの名無しさん
垢版 |
2019/06/26(水) 20:56:42.18ID:4AX1EN8S
ていうかシェルスクリプトで速度を気にするのが間違いでは?w
早い処理速度を求めるんであればCで書けばいい。
0787デフォルトの名無しさん
垢版 |
2019/06/26(水) 21:01:41.99ID:A3AE1MVC
別に間違いではないよ。
シェルスクリプトで実装るのが適切な問題を
遅いからという理由だけで、他の言語を使わなくて良くなる。

クソコード書いておいて、シェルスクリプトは遅い。
だからCで書くとか言われたらバカみたいって思うでしょ
0788デフォルトの名無しさん
垢版 |
2019/06/26(水) 21:24:26.72ID:4AX1EN8S
>>787
> クソコード書いておいて、シェルスクリプトは遅い。
> だからCで書くとか言われたら
いや,それは単純にそんなコードを書くバカの問題であって,
プロファイラが必要になるくらい速度に厳しいプログラムを
シェルスクリプトで書いてしまえば,恐らく誰であろうとCより遅くなる。

だから「シェルスクリプトは遅い」というのは
「本質的に遅く,Cで書かないと速くならないプログラムを無理矢理シェルスクリプトで実装してる」
or
「シェルスクリプトの書き方を知らないがネット記事のコピペを切り貼りして作った凡コード」
の二通りに分かれる。
結局「バカでない人間がシェルスクリプトの速度をプロファイラを使ってまで気にする」という事態は発生しえない。
0789デフォルトの名無しさん
垢版 |
2019/06/27(木) 04:28:29.87ID:SGv/MKem
プロファイラが必要になったからって、速度に厳しいわけじゃないぞ。
プロファイラってのは速度を追求するものではなく、ボトルネックを探すものだ。

シェルスクリプトでもちゃんと使っていれば、実用に耐えられないほど
遅くなるなんてことはないんだが
よくわかってないやつが使うと遅くなる。

大抵はループの中で大量のコマンド呼び出しをしてるからなんだけどな。
0790デフォルトの名無しさん
垢版 |
2019/06/27(木) 17:54:22.07ID:vYBmK8+j
perlのない環境で、grepやsed使って、
ついつい\d、\wとかを使って、困惑することしばし…
わかっちゃいるんだけど、よく忘れる orz

grep(-P)のように、sedも対応してくれんかのぉ
まぁ、気づかなきゃ同じことだけどw
0793デフォルトの名無しさん
垢版 |
2019/06/27(木) 18:58:25.19ID:YlgL60Eu
いまだに¥を平気で書いているのにとも
\使える書けるんだから\にしろ、そこからだw
って、(一部)Linuxで採用しているTakaoフォントのグリフが円記号なんだよな。元々の(古い)IPAがだが
0794デフォルトの名無しさん
垢版 |
2019/06/27(木) 19:11:05.80ID:pgi+u0Sx
どんな環境でも動くシェルスクリプトって都市伝説だよね?
POSIX準拠にこだわったりってムダなことだったんだな。
どうせ可搬性が幻なら、あるがままを受け入れよう。
0797デフォルトの名無しさん
垢版 |
2019/06/28(金) 13:06:45.81ID:hRIfy8PX
>>792
この返しをする奴の頭の構造が理解できん
コマンドの話なのにシェルスクリプトスレが要らないってどういうこと?
0798デフォルトの名無しさん
垢版 |
2019/06/28(金) 13:27:15.18ID:LKtIca5E
>>739 のリンク先にあるPOSIXで必須とされるコマンド(grepやsedもこれに含まれる)の問題が、
シェルスクリプトと関係ないということでスレチというのなら、
このスレの存在意義が相当薄れることは確か。
0805デフォルトの名無しさん
垢版 |
2019/06/28(金) 16:33:23.58ID:4HrFS9y+
いいやんfish
何で笑い物になってんの??
0810デフォルトの名無しさん
垢版 |
2019/06/28(金) 18:56:40.55ID:4HrFS9y+
シェルスクリプトが本当にイケてたらfishスクリプトだのVスクリプトだの出てこない。
0811デフォルトの名無しさん
垢版 |
2019/06/28(金) 19:09:05.16ID:Ul5nd1dv
C言語が本当にイケてたらPerlなんて出てこない

↑好きな言語に変更してください
0812デフォルトの名無しさん
垢版 |
2019/06/28(金) 19:11:15.58ID:Ul5nd1dv
fishはシェルとして使うのは良いけど、
/bin/shでも/bin/bashでも動かないから
スクリプトとしては使えないんだよな
0813デフォルトの名無しさん
垢版 |
2019/06/28(金) 19:12:15.60ID:Ul5nd1dv
良い言語が必ずしも普及するわけじゃなくて
結局は互換性、標準準拠のものが最後には残るんだよね。
JavaScriptとaltJSの関係でもよくわかった
0814デフォルトの名無しさん
垢版 |
2019/06/28(金) 19:54:48.75ID:5SvDrToF
つまりTypeScriptもいずれ滅びると。
0815デフォルトの名無しさん
垢版 |
2019/06/28(金) 20:01:22.66ID:Ul5nd1dv
>>814
その可能性はあるけど、他の互換性がない言語よりかはマシだろうね。
TypeScriptはJavaScript+αだから互換性がある。
0817デフォルトの名無しさん
垢版 |
2019/06/28(金) 21:33:38.23ID:T2T4CcZF
ていうかそんなに互換性やら保守性やら気にするんだったら黙ってPOSIXに準拠しとけよとは思うけどね。
0818デフォルトの名無しさん
垢版 |
2019/06/28(金) 21:40:41.84ID:fHg6yLGA
POSIXモードもしくはPOSIX準拠をうたっているのが本当か?というとこかな
なにか完璧POSIX準拠それ以上も以下もないってどれだ?dash?
あと、POSIX以前もしくは不備のとかちょっと前の話題でもあったねえ
0819デフォルトの名無しさん
垢版 |
2019/06/28(金) 23:19:35.88ID:2yxMx+rx
シェルスクリプトの言語仕様なんてたかが知れてるんだから
覚えられないはずがないんだが、それができないのは覚えられないんじゃなくて
シェルプログラミングのプログラミングスタイルを理解できてないってことなんじゃないかな
手続き型というより関数型に近いスタイルだからね

>>818
dash(ash)一択でしょ
debian/ubuntuのデフォルトシェルだし
その他のシェルはPOSIX準拠ではない配列が使えてしまう
0820デフォルトの名無しさん
垢版 |
2019/06/28(金) 23:25:17.84ID:CM5w69Yd
なんでshじゃダメなの?いや煽りでなしに。
0822デフォルトの名無しさん
垢版 |
2019/06/28(金) 23:37:24.02ID:CM5w69Yd
知らんけどもともとは何だったの?
0823デフォルトの名無しさん
垢版 |
2019/06/28(金) 23:37:32.86ID:GaQSOKcq
>>819
dashがたぶん近いんだろうが、POSIX準拠それ以上も以下もないのか本当に?というとこかな
POSIX準拠それ以上も以下もないんだったら、dashで動けば終了、他で動かないのはPOSIX準拠してないからそいつが悪いで済むんだろうなw
0824デフォルトの名無しさん
垢版 |
2019/06/28(金) 23:42:51.93ID:GaQSOKcq
>>822
/bin/sh の実態がbashだったりkshだったりdashだったりというのが現在
元々のオリジナルのshはアレすぎて現存しないんじゃないかな

オリジナルのshがアレなのでbashとかkshとか出る、kshをベースにPOSIX規格を作る、POSIXの仕様に合わせようと各shellは頑張るが、方言あるやん(確かkshでさえ)なのでash(dash)が出る
という流れじゃなかったかなあ。/bin/sh なんて存在しない、現在
0825デフォルトの名無しさん
垢版 |
2019/06/28(金) 23:51:49.75ID:CM5w69Yd
>>824
知らんけど聞く限り/bin/shの指し先が千差万別なのが諸悪の根元なんじゃないの?
どんなにショボくてもオリジナルのsh復興してそれ以外で書いちゃダメってことにすれば?
それで不便があったとしても、それが本来のshでしょ。
わがまま言っちゃいかん。
0826デフォルトの名無しさん
垢版 |
2019/06/28(金) 23:54:24.85ID:2yxMx+rx
オリジナルのsh = POSIX準拠ではない
改変版のsh = OSとそのバージョンの数だけ存在する(数十種類レベル)
0827デフォルトの名無しさん
垢版 |
2019/06/29(土) 00:00:54.47ID:4wm1mmLB
オリジナルのshのソースコード(C言語)
http://x68000.q-e-d.net/~68user/unix/pickup?sh


#define IF if(
#define THEN ){
#define ELSE } else {
#define ELIF } else if (
#define FI ;}


 IF input>0
 THEN Ldup(input,INIO);
  input=INIO;
 FI



(C言語)
0828デフォルトの名無しさん
垢版 |
2019/06/29(土) 00:02:31.18ID:Jbfm6ENB
>>824 >>826
やっぱりどこでも動くシェルスクリプトなんて都市伝説だったんじゃん!
0829デフォルトの名無しさん
垢版 |
2019/06/29(土) 00:09:28.44ID:Mqz9B8yO
>>825
いやいや。POSIX規格の元がshではなくてkshということで、その時点でshは終わってる過去の遺物だろう
言うようなのは sh という別の規格があった方がいいと言っているようなもんだな。POSIXはなぜ作られたのかよーく考えよう

わがままwwてか「何も知らないくせにw」うるせーよっ
0830デフォルトの名無しさん
垢版 |
2019/06/29(土) 00:10:03.56ID:4wm1mmLB
>>828
オリジナルのshで作れば、動かないものになるから
オリジナルのshは消え去った。

POSIX準拠で作ればどこでも動くって話をしてるんだが?
0831デフォルトの名無しさん
垢版 |
2019/06/29(土) 00:15:00.86ID:Mqz9B8yO
>>827
Bourne さんは Algol68 プログラマであったそうで〜Bourne shell のソース自体も Algol68 風になっており
らしいからまあしょうがないんだろうと思うけど、defineの使い方の説明のサンプルでそういうのを見たことがあるが、まさか実際にというのは、それも有名どころがというはちょっと驚き
0832デフォルトの名無しさん
垢版 |
2019/06/29(土) 00:25:29.35ID:0fRKmc/o
POSIX準拠をうたうOSのデフォルトシェルはPOSIX準拠を保証する。
Linuxの場合は/bin/shがこれにあたる。
ディストリによって実体は bash,dashと様々だが、
自身がshの場合はPOSIX互換モードで動作するようになっている。
とはいえ重箱の隅をつつけば、実装が追い付いていない部分はあるがね。
0833デフォルトの名無しさん
垢版 |
2019/06/29(土) 00:28:01.49ID:XWmNXWFB
互換と準拠を取り違えてるのか
初期のUNIXだとglobが外部コマンドらしいな
なんで検索機能をこう呼ぶのかよく分かったわ
0834デフォルトの名無しさん
垢版 |
2019/06/29(土) 00:53:37.63ID:Mqz9B8yO
>>824
>オリジナルのshがアレなのでbashとかkshとか出る、kshをベースにPOSIX規格を作る、POSIXの仕様に合わせようと各shellは頑張るが、方言あるやん(確かkshでさえ)なのでash(dash)が出る

オリジナルのshが機能不足だったり独特だったりで、(cshや)kshやbashやashやzshなどなどが出て乱立する
これはイカんということでPOSIXで規格をkshをベースに作る
ash(dash)は元々オリジナルshの(+ちょっとだけ機能追加した)再実装なので、それにPOSIX準拠という以外の余計なことは(ほとんどあまり)してない
ってとこかな
0835デフォルトの名無しさん
垢版 |
2019/06/29(土) 02:07:31.33ID:rJpz/Ysh
煮え切らない言い方だな…
そんなことしてるから可搬性なくなるんだよ。
機能不足だろうが独特だろうがそれがsh。
一切追加するな!余計なことするな!
0836デフォルトの名無しさん
垢版 |
2019/06/29(土) 02:49:26.27ID:2GBw6kuy
ググってなりもってこいよ、文句言うくらいだったら
文句言う自分では探さないで奇抜な怒りwだけって奇特な人だな
奇抜=あれやこれややる人が多数、そういうのが好まれ使われてるんだから、それを頭から否定する
0843デフォルトの名無しさん
垢版 |
2019/06/29(土) 09:05:01.55ID:e/5j8c1q
>>840
独自機能を使ったら可搬性がないのだからbash, zsh, ksh, (d)ash, yash, poshと別れてるのは百害あって一利なし。
bash, zsh, ksh, (d)ash, yash, poshのintersectionを取って新時代のshとし、他は滅ぶべし。
それ以外を使うものは地獄の業火で焼かれるべき。
0845デフォルトの名無しさん
垢版 |
2019/06/29(土) 11:12:01.76ID:XWmNXWFB
UNIXでBourne shell誕生
SVR4で軽量版bshのash誕生
Debianで改良版ashのdash誕生
BSDでcsh誕生
cshの便利機能(alias、ジョブ制御)をbashが吸収
改良版cshのtcsh誕生
bshとcshと合わせたksh(ksh88、ksh93)誕生
kshは商用なのでフリー版(pdksh、mksh)誕生
既存シェルをつまみ食いしたbash誕生
改良版bashのzsh誕生
独立系のfish誕生

適当にググったけど種類多くてワロタわ
わざわざashを作った理由やkshが分かれてる理由が分からんが
0846デフォルトの名無しさん
垢版 |
2019/06/29(土) 12:16:50.57ID:L6EEl7gg
可搬性ってそんなに重要か?
そこ重視すると可読性・メンテナンス性が、ひいては品質が落ちると思うんだがどうよ?
やりすぎると可搬性無くて死ぬだろうけど、各々の身辺環境は異なるのだから
各々が経験に応じて決めればよくね?
echo の引数で -n が使えるか使えないかなんて考えるのやめて10年以上経つわ。
0847デフォルトの名無しさん
垢版 |
2019/06/29(土) 14:11:03.73ID:L6EEl7gg
>>845
大昔はメモリが貴重だったからシェルのサイズは小さくしたかったんでしょう。
その先で vfork だの Copy On Write だのテクノロジが生まれたわけで。
0848デフォルトの名無しさん
垢版 |
2019/06/29(土) 14:37:45.71ID:m0/FgwM7
どんどん便利な機能が追加されて良いではないか、みんな好きなの選べば?という人種と
何も変えてはいかん、全てを標準に合わせろ!という人種
大抵の人はその中間なんだろうけど。

bash-5.0 で取り入れられた新機能、一応フォローしておくか (そしてすぐ忘れる) と思うけど
それ積極的に使っていこうぜとは思わないもの。
0849デフォルトの名無しさん
垢版 |
2019/06/29(土) 14:49:39.62ID:khQF1iKv
新機能のうちのいくつかもそのうち当たり前に使うようになってるでしょ。便利であれば
このスレでbash特有とかあるように
0850デフォルトの名無しさん
垢版 |
2019/06/29(土) 15:04:32.87ID:khQF1iKv
>>845
>bshとcshと合わせたksh(ksh88、ksh93)誕生
>kshは商用なのでフリー版(pdksh、mksh)誕生
>既存シェルをつまみ食いしたbash誕生
>改良版bashのzsh誕生
kshとcshを合わせたzshが誕生
じゃないかな。で、
bshにcshの便利なヒストリ(など)を取り込んだkshが誕生
ではないかな

時系列的には
https://d1jnx9ba8s6j9r.cloudfront.net/blog/wp-content/uploads/2019/05/Evolution-of-Linux-Shells-Types-of-Shells-in-Linux-Edureka-528x280.png
らしい。zshはcshの派生になってるけど正しくはkshからも引くべきだろうね、開発時のメッセージでそう明言してる
0852デフォルトの名無しさん
垢版 |
2019/06/29(土) 16:24:24.49ID:0fRKmc/o
>>846
可搬性は求めない。環境限定で動けば良い。運用寿命は数年もてばいい。
が要件ならば、拡張機能使っても問題ないだろうね。
0853デフォルトの名無しさん
垢版 |
2019/06/29(土) 16:43:46.48ID:tuUcuaq1
>>852
> 環境限定で動けば良い。運用寿命は数年もてばいい。
これを満足するのがPOSIX標準なんですよね。
0855デフォルトの名無しさん
垢版 |
2019/06/29(土) 16:59:43.19ID:/BkVpaGH
>>843
> 独自機能を使ったら可搬性がないのだから

独自機能を使わなければ可搬性がある
という証言いただきました!
0856デフォルトの名無しさん
垢版 |
2019/06/29(土) 17:05:11.99ID:/BkVpaGH
>>846
> そこ重視すると可読性・メンテナンス性が、ひいては品質が落ちると思うんだがどうよ?

落ちないよ。
0857デフォルトの名無しさん
垢版 |
2019/06/29(土) 17:06:04.22ID:/BkVpaGH
>>846
> 可搬性ってそんなに重要か?

(d)ashがよく使われてるからね。
可搬性と言うよりも、(d)ashで動うことが重要
0858デフォルトの名無しさん
垢版 |
2019/06/29(土) 17:13:24.88ID:/BkVpaGH
>>845
> わざわざashを作った理由やkshが分かれてる理由が分からんが
オープンソースではないのでソースコードが公開されない
資産が生かせない

UNIXでBourne shell誕生
○(UNIX)がBourne shell改良、shの亜種○を作る
△(UNIX)が更に改良、shの亜種△を作る
□(UNIX)が更にl改良、shの亜種□を作る
◇(UNIX)が更にl改良、shの亜種◇を作る

UNIX界隈で、shという名前でバージョン番号すら
無いshの亜種が大量に生まれる
そしてshの最終形態でやっとPOSIXに
準拠したかもしれない程度のレベルで互換性がない
0859デフォルトの名無しさん
垢版 |
2019/06/29(土) 18:33:44.12ID:pTnnUNQ0
>>858
>オープンソースではないのでソースコードが公開されない

shはソールまるごと公開してたろ
0862デフォルトの名無しさん
垢版 |
2019/06/29(土) 20:03:34.74ID:khQF1iKv
あと
誰も Bourne shell の文法がどうなっているかを本当には知らない。ソースコードを調べてみてもほとんど役に立たない。
とかいうのもなんか納得できるな。違うかもだが。そういう時代だったのねと
rcという変わり種の作者がだから酷く言っているだけかと思った。それもあるかもだがw
0863デフォルトの名無しさん
垢版 |
2019/06/29(土) 20:11:26.48ID:LSJMfKyW
>>861
正確に言えば、POSIX以前に作られた、 POSIX準拠してない Bourne shell を廃棄して
POSIX準拠で作り直したということ

(POSIX)シェルを再実装したのは正しいが、Bourne shellそのものを再実装したのではない
0865デフォルトの名無しさん
垢版 |
2019/06/29(土) 20:24:08.27ID:khQF1iKv
Ash is a reimplementation of the System V shell. Currently it has most
features of that shell, plus some additions. It runs on 4.2 and 4.3BSD,
SystemV releases 1, 2, 3, SystemIII, and perhaps Version 7. Documentation
includes a list of differences, a manpage, and internals documentation.
It has several built-ins and shell functions.
のようだね。最初は。POSIX準拠はその後でという怪しい図のソコは間違っていないような
0867デフォルトの名無しさん
垢版 |
2019/06/29(土) 20:31:23.20ID:LSJMfKyW
System V shellはBourne shellを名乗っているのかもしれないが、
オリジナルのBourne shellではない
オリジナルという言い方が気に食わないなら
最初に作られたshと読みかえれ
0872デフォルトの名無しさん
垢版 |
2019/06/30(日) 03:55:44.69ID:rfDMTcnr
>>856,857
それ dash 使うことで dash が動く実装すべてで動作してるってだけで、可搬性ある書き方の話と別じゃね?
if 文とかで実装ごとに異なる書き方しまくる話をしようよ。
0873デフォルトの名無しさん
垢版 |
2019/06/30(日) 03:59:41.59ID:CMkdrv99
iocall attach user_output file xx
list
iocall attach user_output syn user_i/o
Multicsだとls >xxがこの記述量らしいな
パイプさまさまだわ
0877デフォルトの名無しさん
垢版 |
2019/06/30(日) 10:28:41.23ID:2juPiYlp
>>846
だよな。どこでも動くシェルスクリプトなんて都市伝説だし。
0878デフォルトの名無しさん
垢版 |
2019/06/30(日) 10:43:07.31ID:Fo3wYRY8
>>846
> echo の引数で -n が使えるか使えないかなんて考えるのやめて10年以上経つわ。
すべてのPOSIX準拠シェルで-nは使える

>>877
POSIX準拠シェルであれば可能。不可能な理由がない。
0879デフォルトの名無しさん
垢版 |
2019/06/30(日) 16:52:33.33ID:rfDMTcnr
>>875,878
なんでスクリプトの構文のみの話になってるの? 可搬性の話がずれてる。
autoconf が作る configure のような、メンテナンス性・可読性皆無だが比較的どこでも動くスクリプトみたいな奴
だと思ってるんだが皆はどういう認識なのよ?
0880デフォルトの名無しさん
垢版 |
2019/06/30(日) 17:13:52.68ID:DWafJWcS
シェルの仕様だけの問題じゃなくて、コマンドがOS、バージョンによってまちまち
IPアドレス取得するだけでも大量にバリエーションがあってどうにもならないから、Linuxではifconfigが非推奨になった
0881デフォルトの名無しさん
垢版 |
2019/06/30(日) 18:00:24.49ID:Fo3wYRY8
コマンドもPOSIX準拠のものだけ使うに決まってるじゃん
はい、可搬性ありまーす


rubyでsedを呼び出していて、非POSIXのオプション使ってるから
rubyは可搬性がないとか言われても困るw

この場合可搬性がないのはsed(の非POSIXのオプション)であって
呼び出してる言語(ruby or shell)が可搬性がないわけではない
0882デフォルトの名無しさん
垢版 |
2019/06/30(日) 18:38:54.22ID:29vlF+26
>>879
「autoconfが作るconfigure」は「どこでも動くスクリプト」じゃないだろ
そのシステム専用のスクリプトだよ
0883デフォルトの名無しさん
垢版 |
2019/06/30(日) 18:47:02.27ID:Fo3wYRY8
はぁ、なんでこんなに頭が悪いんだろう。

「C言語が吐き出すアセンブリ言語」は「どこでも動くアセンブリ言語」じゃないから
C言語は可搬性がないという主張ですかね。

ほんと、頭わりぃ
0884デフォルトの名無しさん
垢版 |
2019/06/30(日) 19:12:33.55ID:wmvzG4iV
「POSIXクソだりー可搬性なんていらん」とかいうやつはshellcheckとかリンター使えよ
0886デフォルトの名無しさん
垢版 |
2019/06/30(日) 20:26:11.65ID:1ALBmyOB
>>881
それな。
「シェルスクリプトは可搬性がない!」なんて言ってる奴が単に可搬性のある書き方を知らないだけだと思う。
もちろんPOSIXに準拠するかしないかは個人の自由だけど
そんなことも知らずにPOSIX規格に記載のない書き方をしておいて「可搬性がない」は失笑モノだわ。
0887デフォルトの名無しさん
垢版 |
2019/06/30(日) 21:48:35.95ID:2juPiYlp
他で動かないように書けてしまうのが問題。
POSIX範囲外の余計な機能を付けるからだ。
すべて削除してPOSIX以外書けないひとつのshにするべし。
0888デフォルトの名無しさん
垢版 |
2019/06/30(日) 22:03:54.02ID:pDzbN/vc

   ̄ヽ、   _ノ
      ○
       O      と思うハゲであった

                   ___
              o,.,   ̄      `丶、
            .〃;.; ;  O          `、
            /;i;i;.; ;  °            ヽ
           j!;i;i;i;.;                `、
          .j!;i;i; ;                  V
.        , -v{功テえ三≧k j  i            i}
          .i;i;i;i∧;{i ___  ヽ〉-- 〃ヌニ≠ェァ;,、_ /〉
         {i;i;i;i;i;i;ム ‘、 ̄≧ j.r−v{!   __   `v身≧"
        i;i;j!;i;i;i;.;丶 _  .ノノ  `ム、´⌒`ー /;アー7´〉
.          v;i;i;i; ;´       ,ァ    丶`_ ノ/ / y゜
.         j;i;i;i;.;     ィ(  {!    ヽ,       i}U
.        {;i;i;.;    /‘≠ー弋__. ヘ        iノ
         :;i;i;.; ; }/ ____   ̄    \     |
          .人;i;i;i;.; ト 卞、カv ̄T++=a、 〉    j}
   .__/  ∧;i;i;i;,ミ 、    ̄ ̄ ̄ ̄ ̄ j〕     /^
      \   ∧;弋ミ              /
        \  へ`,,ヾ;.;,           ィ爪
            ヽ  へ、           . ´/  ト、__
             }     >; ,,__ーァ ´  .イ    i \ ̄\
                       〃/⌒ヽ.j   \  \
0891デフォルトの名無しさん
垢版 |
2019/06/30(日) 22:40:13.43ID:rfDMTcnr
>>886
結局複数環境で動かすには何が必要かは置かれた環境でまちまちなわけで。
grep や awk が POSIX 対応していない環境だってあるわけで、そういう人からすると
POSIX 準拠してればいいって言ってる人は論外なわけなんだわ。
0892デフォルトの名無しさん
垢版 |
2019/06/30(日) 22:44:16.79ID:rfDMTcnr
>>882
流石に「そのシステム専用」は失礼過ぎないか?
FreeBSD でも Linux でも AIX でも Solaris でも大概な UNIX ライクなシステムで動くし、それらの環境を持ってない
開発者が作ったプログラムを安全にサポートしてくれてるでしょ?
それとも autoconf とか automake とか使ったことない人かな? なら黙っててよ。
0894デフォルトの名無しさん
垢版 |
2019/06/30(日) 22:56:53.99ID:rfDMTcnr
>>893
準拠してるっていっても非準拠の時代に対して互換性を確保する必要があるから PATH を通す順番
変えるとかでシステムごとに if 文地獄。
ここまでちゃんとやって可搬性があるって胸張れるってもんでしょ。
0895デフォルトの名無しさん
垢版 |
2019/06/30(日) 22:59:21.24ID:Fo3wYRY8
>>894
お前さ、もしかして、autoconfが生成したconfigureを
他の環境にコピーして動くかどうかって話をしてるの?
Yes か No で答えて
0896デフォルトの名無しさん
垢版 |
2019/06/30(日) 23:03:50.43ID:29vlF+26
>>892
そのシステムに合わせたスクリプトを出力するのがautoconfなのに
何を言ってるんだ君は??
0898デフォルトの名無しさん
垢版 |
2019/06/30(日) 23:12:25.38ID:rfDMTcnr
>>895,896
当然 Yes ですよ?
そのシステムだけで動くものなら最初から Makefile だけつくってりゃいいって話になる。
ちゃんと書けてない、エラーメッセージろくによんでないからそうなるだけだろ?
0900デフォルトの名無しさん
垢版 |
2019/06/30(日) 23:15:47.94ID:Fo3wYRY8
>>898
ばかやなー。configureは環境毎に生成するものなんだから
可搬性が有るかどうかを考える必要がない問題

コピーしないものをコピーしても動くようにするには
どうするかなんて、考える意味がないことだろ

今話してるのは「シェルスクリプトで可搬性のあるコードを書く」という
書かないものについて、話をしても意味はない。
0902デフォルトの名無しさん
垢版 |
2019/06/30(日) 23:23:29.76ID:rfDMTcnr
>>900
configure が環境ごとの Makefile や config.h を生成するのであって、configure は環境ごとに生成するものではないぞ?
環境ごとに生成するならなぜ Unix Like 向けのオープンソースは configure を配るわけ?
その理屈なら configure.ac だけで良いんじゃないの?
INSTALL に autoconf 先に実行してくださいって書いてないのはなんで?
0903デフォルトの名無しさん
垢版 |
2019/06/30(日) 23:24:55.93ID:rfDMTcnr
>>901
/usr/bin に入っているのは POSIX 非互換で、他のパスに POSIX 互換コマンドつっこんで POSIX 互換ですって
言ってる環境がゴロゴロあって難儀してるって話だが?
0909デフォルトの名無しさん
垢版 |
2019/06/30(日) 23:44:01.95ID:Fo3wYRY8
>>902
> 環境ごとに生成するならなぜ Unix Like 向けのオープンソースは configure を配るわけ?

configure を配ってるタイプなら、
そのconfigure には可搬性が有るということだろw
0914デフォルトの名無しさん
垢版 |
2019/07/01(月) 01:28:15.55ID:2smzn43h
結局POSIX規格に準じてないコマンドの具体例一つも出せてなくて草生えますよ
「現行で使われているPOSIX準拠を謳っている筈のXXX-OSでは
/bin/xxxにあるコマンドXXXがPOSIX規格とこれこれこういう点で不一致」
↑これを言えばいいだけだぜ? それを言うのに何レスを無駄な喧嘩で消費してるんだ。
0917デフォルトの名無しさん
垢版 |
2019/07/01(月) 04:01:56.69ID:TT0ZFmIC
オプションの-と--の扱いが雑なコマンドはどうなの
findは-の後が単語だし(-name)
wgetも-の後に2文字指定したりするし( -nc)
tarは-が不要な上に-の有無で挙動が変わるpsまであるし
基本コマンドの時点で既にガバガバじゃねーか
ddはそもそも出身が違うしな
0918デフォルトの名無しさん
垢版 |
2019/07/01(月) 04:33:11.57ID:TlV+Kbgz
なにか困りますか?そういうオプションで
ターミナル上で普通にコマンド打ってますよ。
あなた黒い画面(CLI)で仕事できない人ですか?
0919デフォルトの名無しさん
垢版 |
2019/07/01(月) 07:34:33.04ID:KK3BgYtY
>>918
なにか困りますって、別のシステムにスクリプト持って行った時に正常動作しないから困ります、でしょ。
0920デフォルトの名無しさん
垢版 |
2019/07/01(月) 07:54:28.17ID:2smzn43h
>>917
POSIXでは--から始まるオプションや複数文字のオプションは認められてない。
そこコマンドが勝手独自に拡張しているものを持って来て「互換性がない!」っていうのはおかしい。
0921デフォルトの名無しさん
垢版 |
2019/07/01(月) 09:00:56.52ID:TlV+Kbgz
>>919
お前言ってることめちゃくちゃだな
コマンドによってオプションの形式が違ってるって話を
お前はしていただろ

別のシステムに持っていったって、あるコマンドの
オプションの形式は同じなんだから正常に動くだろ
0922デフォルトの名無しさん
垢版 |
2019/07/01(月) 11:01:27.11ID:AbRjjU8q
date コマンドの オプション、
GNU版 と他の (BSD系 Mac とか) で全然違ってて戸惑った事がある
0923デフォルトの名無しさん
垢版 |
2019/07/01(月) 11:29:32.06ID:4+biahsm
POSIXは実装ありきの後出し規格なんだよ
カバーしきれない部分がたくさんある
917の挙げてる中で wget tar はPOSIXコマンドじゃない
特にネットワーク系コマンドはほとんど規格化されていない
POSIXから外れた部分の可搬性を高めるにはどうする?

例えばネットから何か落とそうと思ったら wgetかcurl使うじゃん
でも全てのシステムに必ず入ってるわけじゃない
無いならインストールしてくださいってなるわな
バージョン上がると独自拡張されたり仕様変わったりで対応いるだろ
POSIXみたいに下位互換性も保証されない
可搬性ってやつはどうなるんだ?
0924デフォルトの名無しさん
垢版 |
2019/07/01(月) 12:13:07.49ID:ywGyCn2/
>>922
そのためのPOSIX

>>923
DirectXはWindows環境でしか使えないから
C++は可搬性がないってか?

シェルスクリプトの可搬性の話をしてる。
外部コマンドはシェルスクリプトの範疇外だろ
0926デフォルトの名無しさん
垢版 |
2019/07/01(月) 12:34:28.70ID:ywGyCn2/
>>925
比喩になってるよ。

理由は書かなくていいよね
理由書かずに比喩になってないと主張する人みたいだから
0927デフォルトの名無しさん
垢版 |
2019/07/01(月) 12:47:29.70ID:RLVJ6D4b
>>926
説明できない奴に限ってこういうこと言い出すんだよな
適当に書きましたごめんなさいってなんで言えないんだろう
宮迫だって金もらってましたごめんなさいって最初に言ってれば
秋には復帰できてたろうになあ(まあ復帰しなくても構いませんが)
0929デフォルトの名無しさん
垢版 |
2019/07/01(月) 16:02:21.59ID:0UaOtlQU
優等生ってなにをもってなのかわからんが、BSDのコマンドよりもGNUの方があれやこれやオプションが充実してたりする。POSIXの方がもっと不便だぞw
開発者の数が全然違うんだろうからしょうがないんだろう
0930デフォルトの名無しさん
垢版 |
2019/07/01(月) 16:09:57.86ID:0UaOtlQU
>>926
言語の可搬性ではなくて、やりたいことを書いたプログラム(シェルスクリプト)の可搬性を言っているんだろ
比喩にはなってないだろう。C++で書いたDirectXを使ったソースの可搬性なんてないと自分でも言っているんだから
0931デフォルトの名無しさん
垢版 |
2019/07/01(月) 16:50:15.40ID:2smzn43h
そりゃsedの「GNU拡張」をBSDで使えば可搬性はなくなるだろうけど
「拡張」って言葉の意味わかってる?
双方ともPOSIX sedには最低限準拠してるから、
POSIX sedの仕様だけを守ってればどっちの環境でも動く。
0932デフォルトの名無しさん
垢版 |
2019/07/01(月) 16:56:06.15ID:0UaOtlQU
たぶん、ID:TT0ZFmIC はそういうレベルの話ではない
そもそも>>928は可搬性の話ではないだろう。POSIXにするとなお不便になるからな。可搬性の話なら最後の言葉は出ないだろう
0933デフォルトの名無しさん
垢版 |
2019/07/01(月) 18:51:49.95ID:4+biahsm
可搬性高いシェルスクリプト書くならPOSIXで書く
これは間違っていない
でもPOSIXで何でも書けるわけじゃない
環境依存しないと書けない部分がある
POSIXは不完全な規格だってことだ

俺はPOSIX推進派だけどなw
0934デフォルトの名無しさん
垢版 |
2019/07/01(月) 19:18:29.65ID:MoEwNeEz
まとめるとどこでも動くシェルスクリプトなんて都市伝説ってことだよね
0935デフォルトの名無しさん
垢版 |
2019/07/01(月) 19:21:40.57ID:0UaOtlQU
そもそも可搬性可搬性って、そんなあれやこれやの環境を管理していんのかいっていう

シェルスクリプトで書けるものなんて全然たいしたことは書けないので、環境がしょうがなく変わったらそれに対して書き換えればいいだろうとしか思わんな
シェルクスリプトは単に補助的にしか使わない、本業は別の言語(IDE、最低限でもmakeが必要な)な俺は、可搬性可搬性って???だなw
0937デフォルトの名無しさん
垢版 |
2019/07/01(月) 19:41:01.62ID:ywGyCn2/
まとめるとどこでも動くC言語なんて都市伝説ってことだよね
C言語でゲームできないもん
0939デフォルトの名無しさん
垢版 |
2019/07/01(月) 20:52:04.97ID:2smzn43h
まあ要するに、POSIXに準拠しとけばかなり可搬性の高いシェルスクリプトが書ける。
でもどんな言語でもそうであるように「完璧で」「完全な」可搬性は実現できない。

しかしまあ俺個人としてはシェルスクリプトは可搬性を高めやすい言語だと思うけどね。
ちゃんと実装から独立した文書としての規格があるし。
0940デフォルトの名無しさん
垢版 |
2019/07/01(月) 20:55:17.40ID:2smzn43h
>>919
え?動作するんじゃないの?
>>917はあくまでコマンド同士のオプション形式が違うって言ってただけで
そのコマンド自体ではシステム間で互換性があるんでは?
0941デフォルトの名無しさん
垢版 |
2019/07/01(月) 21:09:18.21ID:0UaOtlQU
>>939
あと、不完全なPOSIX規格でも、それがあればこそなにかあってもポーティングがどちからという楽すぎってのも
0942デフォルトの名無しさん
垢版 |
2019/07/01(月) 21:29:02.92ID:2smzn43h
次スレ立てるときワッチョイを有効にしたいんだけど
どうすればいいんだっけ。
0944デフォルトの名無しさん
垢版 |
2019/07/01(月) 21:39:48.33ID:ywGyCn2/
>>938
だからシェルスクリプトで、外部コマンドが違っていて動かないというのなら、
C言語で、APIが違っていて動かないよね

でも言語(シェルスクリプト or C言語)は可搬性が有るよね
言語以外の部分が異なっていたとしても。

ってことだけど?
0945デフォルトの名無しさん
垢版 |
2019/07/01(月) 21:51:05.99ID:0UaOtlQU
>>944
なにを言いたいのかさっぱり。C言語ってわかってるの?
C言語でも>>934の通りだよ。C言語でゲームできないもんもイミフだったが、そのレスではソコの説明が書いてあるのかさえ不明w
0947デフォルトの名無しさん
垢版 |
2019/07/01(月) 22:28:22.64ID:KK3BgYtY
>>944
可搬性があるんじゃなくてコンパイルが通るだけ or プリプロセッサまでが通るだけ。
同じシステムコールでも SysV と BSD で動作が違うとかあって、コンパイル通るだけで碌に動かないものも出る。
C で可搬性を求めるなら automake 使ってどこが不都合かを確認しまくるしかない。
それも不完全なので最後は地道なデバッグ。
0949デフォルトの名無しさん
垢版 |
2019/07/01(月) 22:52:54.73ID:0UaOtlQU
>>948
いきなりな問いだなwそんなこと言った覚えはないぞ?どうした?
いや、Cだって>>934の通り、可搬性のあるモノは作れる。どういう「モノ」によるかだがな
0951デフォルトの名無しさん
垢版 |
2019/07/01(月) 22:54:29.90ID:ywGyCn2/
> いや、Cだって>>934の通り、可搬性のあるモノは作れる。どういう「モノ」によるかだがな

結局

シェルスクリプトだって、可搬性のあるモノは作れる。どういう「モノ」によるかだがな

という答えかよw
0952デフォルトの名無しさん
垢版 |
2019/07/01(月) 22:55:29.41ID:0UaOtlQU
って、言ってるじゃんww
その直後にイミフのレスしてたんじゃん。なんなの?ww
0953デフォルトの名無しさん
垢版 |
2019/07/01(月) 22:59:32.21ID:2smzn43h
なんで0か1かにそんなに拘るのか。
「シェルスクリプトでは可搬性のあるものは書けない」
という(間違った)認識に対して
「シェルスクリプトには可搬性を持たせられる」
と是正しただけなのにね。

そして可搬性の問題はシェルスクリプトに限らない。
どんな言語にも完全な可搬性はないし、かといって全く可搬性がない訳でもない。
それだけの話をどうしてこうも荒立てられるかね……。
0954デフォルトの名無しさん
垢版 |
2019/07/01(月) 23:02:42.75ID:ywGyCn2/
まとめるとどこでも動くシェルスクリプトは都市伝説じゃなくて作れるってことだよね
0959デフォルトの名無しさん
垢版 |
2019/07/01(月) 23:41:59.98ID:KK3BgYtY
POSIX (というか BSD の /bin/sh である dash?) に合わせたほうが幸せなのか
#!/bin/bash って書いて bash 限定にしたほうが幸せなのか。
個人的には後者でサクッと短時間でかつ可読性高く仕上げるのが好み。
0960デフォルトの名無しさん
垢版 |
2019/07/01(月) 23:44:17.54ID:GotlxjDf
> というか BSD の /bin/sh である dash?
dashのdはdebian linuxのdな

> 個人的には後者でサクッと短時間でかつ可読性高く仕上げるのが好み。
それはPOSIX(dash)でもbashでも変わらん
0961デフォルトの名無しさん
垢版 |
2019/07/02(火) 00:01:10.80ID:p7jTc1Zw
可搬性云々は要件次第なんだよ
動作保証は Ubuntuのみで良いなら環境依存で書けばいい
0962デフォルトの名無しさん
垢版 |
2019/07/02(火) 00:02:35.22ID:Tm8GOmHy
>>960
> dashのdはdebian linuxのdな
これは勉強不足で失礼いたしました。

>それはPOSIX(dash)でもbashでも変わらん
POSIX(dash) で [[ =~ ]] って簡潔に書ける?
for ((i=0;16>i;i++)) ; do (loop内で $i 更新あり) とかは?
0963デフォルトの名無しさん
垢版 |
2019/07/02(火) 00:06:02.50ID:+q6wCm94
GNU拡張はGNUの方言だけどBSDにも方言くらいあるでしょ
BSDだけで盛られたコマンドってないの
0964デフォルトの名無しさん
垢版 |
2019/07/02(火) 00:15:08.55ID:Atdu9zIi
>>962
> POSIX(dash) で [[ =~ ]] って簡潔に書ける?
多くはcaseで十分。足りなければexprを使えばいい。

> for ((i=0;16>i;i++)) ; do (loop内で $i 更新あり) とかは?
seqかwhileを使えばいい
0967デフォルトの名無しさん
垢版 |
2019/07/02(火) 00:37:15.66ID:Tm8GOmHy
>>964
loop 内更新ありだと seq はNG。
while は見た目簡潔じゃないし、インクリメント忘れる可能性もある。
0968デフォルトの名無しさん
垢版 |
2019/07/02(火) 01:41:05.60ID:Atdu9zIi
>>966
> while は見た目簡潔じゃないし、インクリメント忘れる可能性もある。
忘れなければいいし、別に一行だろうが二行だろうが大差ない。
0970デフォルトの名無しさん
垢版 |
2019/07/02(火) 01:44:27.35ID:uO4UDEG+
好みって言っているのに。それはあなたの好み
好みに合うようななにかを提示するかスルーすればいいだろうに
0971デフォルトの名無しさん
垢版 |
2019/07/02(火) 03:09:33.83ID:rBxHnYzF
>>962

[[ "$VAR" =~ '<regexp>' ]]

expr "$VAR" : '<regexp>'

for ((i=0;16>i;i++)) ; do
echo $i
done

i=0; while [ $i -lt 16 ]; do
echo $i
i=$((i+1)); done

こんなもんでいかがでしょ。
簡潔かつ高い可搬性を持ったシェルスクリプトになったと思う。
よければこれから書く可搬性の高いシェルスクリプトの参考にしてみて!
0972デフォルトの名無しさん
垢版 |
2019/07/02(火) 03:45:23.93ID:uO4UDEG+
まさか、その変えた方が簡潔かつ高い可搬性を持ったという??
なんのためのbash(などの)の拡張なんだかだよ。俺には理解できない。まあ、ID:Tm8GOmHyが理解できたら特にだけど
0973デフォルトの名無しさん
垢版 |
2019/07/02(火) 03:49:34.72ID:uO4UDEG+
ところで、while内での変数の変更とかどうしてんの?そんなにPOSIXに拘る人は
0974デフォルトの名無しさん
垢版 |
2019/07/02(火) 03:52:13.98ID:uO4UDEG+
ああ、パイプでサブシェルになってしまう場合のwhileね。よく使うパターンの
0977デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:01:44.98ID:Atdu9zIi
>>974
今後の人生、サブシェルの中に移住すればいいだけだろ

cat dummy.txt | {
 i=0
 while IFS= read -r line; do
  i=$((i+1))
 done
 echo "$i"
}
0978デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:05:15.58ID:uO4UDEG+
そのcatレベルで必要なんじゃね、普通は
そんな狭いパターンが主なのか?お前の人生は。俺の人生でそのパターンは少なさそう
そういうんじゃないよ普遍的wなのでだよ
0980デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:12:40.39ID:Atdu9zIi
パターンを思いつかないのかレスが返ってこないので補足しておくと、
サブシェルになる場合というパターンだったから>>977のように書いたが
ファイルから読み取る場合は、そもそもサブシェルにしなくていい

i=0
while IFS= read -r line; do
 i=$((i+1))
done < dummy.txt
echo "$i"

さて、>>978はどんなパターンを想定してるんだろうかw
0981デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:21:16.83ID:uO4UDEG+
なにか前処理
hoge=0
cat | while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done

if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi

とか。ループ中に例外的なのを検出した後にトップレベルで整理するとか。あとは、whileの後にもパイプで続けてその後でとか。局所的なので使うことはないな

気が短いなw
0982デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:29:33.75ID:Atdu9zIi
こうすればいいだけw

なにか前処理
cat | {
 hoge=0

 while IFS= read -r line; do
  [ なにか ] && hoge=1
  ほかにいろいろ
 done

 if [ hoge = 0 ]; then
  前処理の調整
 else
  前処理の調整
 fi
}
0983デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:33:37.38ID:uO4UDEG+
ほんとうにそれでいいと思うのか?w
なんか無理してんなと思うけど、POSIXに拘る人はそう書くのねと理解はした、お応えありがとう
0984デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:35:32.93ID:Atdu9zIi
>>983
正しく動くし何も問題ない。

お前こそ、何も言い返せないのに
無理してレスしなくていいぞw
0985デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:37:28.40ID:uO4UDEG+
いやあ、ああいうのが普通な人には何も言い返せないよ。てか「言い返す」って。喧嘩かなんかなのか?w
0986デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:41:11.93ID:Atdu9zIi
喧嘩じゃなくて、お前の意見を言えって。

正しく動くだろ?
なにか問題が有るのか?
0987デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:45:47.25ID:Atdu9zIi
シェルスクリプト初心者です。 { } の使い方がわかりません
とかいうなら、関数にでもすればいい

foo() {
 なにか前処理

 hoge=0

 while IFS= read -r line; do
  [ なにか ] && hoge=1
  ほかにいろいろ
 done

 if [ hoge = 0 ]; then
  前処理の調整
 else
  前処理の調整
 fi
}

cat | foo

お前の苦手な { } が無くてすんだぞw
サブシェルうんぬんの前に、関数の中で使う変数は、関数の中にとどめておけよ。
わかりやすいコーディングというのはこういうものだ
0988デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:47:32.87ID:uO4UDEG+
そのサブシェルの中で後は全部やるんでしょ?必要な部分を。それで問題無いと思うなら、それでいいんじゃないの
「なんか無理してんな」ってのがわからないんだったらそれはそれでいいよ。元ネタと同じく、好みの問題。好みがわからないでしょ
0989デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:50:12.51ID:Atdu9zIi
だから問題ないし、お前を含めて誰も問題があると言ってない。

お前さ、なんで自分で問題点を指摘できないのに
さも問題があるかのように装ってるわけ?
ばれないとでも思った?
0990デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:50:38.17ID:uO4UDEG+
なにか頑張ってるな。そんな話じゃないよ
知識自慢臭しかもうしませんよ?そんなの自慢げというか馬鹿にしたいだけなのか知らんけど
0992デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:53:48.95ID:uO4UDEG+
問題がある問題がないの話じゃないよ。好みだよ好み
そう次々あれこれ考えなくてもw bash(など)の拡張使えばスッキリだろうにという
0994デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:57:00.91ID:uO4UDEG+
hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done < <(cat)

if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi

そもそもやりたいことがレベルが変わらずにそのままでスッキリだなwあとあとでなにか追加もとかもね
0995デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:58:47.96ID:Atdu9zIi
>>994
それ、俺が書いたfoo関数の中身を書いただけじゃねーかw

hoge=0
while IFS= read -r line; do
 [ なにか ] && hoge=1
 ほかにいろいろ
done

if [ hoge = 0 ]; then
 前処理の調整
else
 前処理の調整
fi

これで動くよ。
foo() {
 上のコード
}
cat | foo

ってやればいいだけ
0996デフォルトの名無しさん
垢版 |
2019/07/02(火) 05:01:09.48ID:Atdu9zIi
Q.これをPOSIX準拠で書きたいのですが?

hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done < <(cat)

if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi

A. まず1. 関数にしましょう

foo() {
hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done < <(cat)

if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi
}

foo
0997デフォルトの名無しさん
垢版 |
2019/07/02(火) 05:01:36.77ID:uO4UDEG+
いや、だから、お題に対してだけじゃなくな。普遍的にって言ってるでしょ
それが普遍的なのか?

なんで否定されたのをそんなに拘るねん。否定してんのは俺の好みじゃないってだけだぞ?w
0998デフォルトの名無しさん
垢版 |
2019/07/02(火) 05:01:53.99ID:Atdu9zIi
2. bash依存の命令をなくしましょう。

foo() {
hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done

if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi
}

cat | foo

はい。完成です(笑)
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 283日 5時間 28分 4秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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