X



シェルスクリプト総合 その29
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 3efb-m2E0)垢版2018/09/22(土) 11:53:21.38ID:BBiLRgnj0
!extend:on:vvvvv:1000:512
!extend:on:vvvvv:1000:512
シェルスクリプトに関する総合スレッドです。

スレ立て時は以下の文を先頭行に加えて下さい。
後のつけ忘れ防止の為に複数行重ねて追加推奨
!extend:on:vvvvv:1000:512

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ
シェルスクリプト総合 その28
http://mevius.5ch.net/test/read.cgi/tech/1532397676/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0298デフォルトの名無しさん (アウアウウー Sa5d-hDoO)垢版2018/10/25(木) 14:43:08.46ID:hw/Q19JUa
>>297
それもはやシェルかどうか関係なくてWindows固有の問題だと思うが、エクスプローラでそのファイル右クリックしてプロパティ出したらそんな感じの設定できるようになってない?
最小化した状態で実行するとか、そんなやつ。
0299デフォルトの名無しさん (アウアウウー Sa5d-hDoO)垢版2018/10/25(木) 14:51:54.06ID:hw/Q19JUa
こうだ。

まずショートカット作り、そのショートカットのプロパティ出すと実行時の大きさを指定できる所があって、そこを最小化にすると実行時にタスクバーにアイコン出ているだけになる。
0301デフォルトの名無しさん (ワッチョイ 9764-Ed1r)垢版2018/10/26(金) 22:15:40.17ID:ScQN6FWl0
ファイルや標準出力の行数がある数値より大きいことをできるだけ高速に確かめるにはどうすればいいだろう
最も単純で最もUNIXっぽいのは
$ test $(<file.txt wc -l) -gt $num
としてその真偽を見ることだけど
$ test $( (yes | head -n 3000000000000000000) | wc -l) -lt 300
こういうのを実行して貰えれば分かると思うがかなり時間が掛かる
俺の使ってる計算機はそこそこ良い性能(Intel Xeon x2/32GiB RAMなのだが)
それでも実行に1分強掛かった。
しかしこれは無駄だ。なぜなら結局比較する対象は300なのだから、「300行以上ある」ことが分かればいい。
なにか案ありませんかね。

思ったのはsed -n -e '300p'とかでその失敗判定を見るとかだが,これはsedコマンドの失敗の要因が他にもあるので
ちょっと不安定かなと。
0302デフォルトの名無しさん (ワッチョイ 1d80-SUE8)垢版2018/10/26(金) 23:12:31.32ID:7cGNdWT70
cで指定行読むコマンドを作ればいい
面倒なこといちいち考える必要がそもそもない
0309デフォルトの名無しさん (ワッチョイ 5b98-o90R)垢版2018/10/27(土) 01:23:00.95ID:4RrrP6U60
シェルスクリプトでループで回しながら数えるのと
headで300行とってきて、wcで300行数えるのってどっちが速いんだろうかね
やればすぐわかるけど、やる気起きないなぁw
0310デフォルトの名無しさん (ワッチョイ 5b9f-3knh)垢版2018/10/27(土) 04:24:55.28ID:QwPOuwmq0
>>309
シェルスクリプトだとインタープリタの言語みたいな動きになるので遅そうなイメージはあるな。但しうまいこと内部で最適化されれば速くなるかもね。
0311デフォルトの名無しさん (ワッチョイ 5b98-o90R)垢版2018/10/27(土) 08:30:31.93ID:4RrrP6U60
>>310
いうてもループとカウントと条件分岐だけだからなぁ
内部的にはインタプリタ解釈後の状態になってるだろうし
そこでCPUは食わない気がする

でもheadでとってきてwcでカウントの部分は並列で実行できるわけで
マルチコアなら当然のことながら、シングルコアでもファイルから読み取りの方が
遅いからwcで待たされることはなさそう

どちらが速いかは微妙な所だなw
0313デフォルトの名無しさん (ワッチョイ 1d80-SUE8)垢版2018/10/27(土) 09:08:24.86ID:S4VvuAVS0
ファイルの先頭からLFの数を数えるだけのことを
ああでもこうでもないと
いちいち考えないといけないオツムのデキを疑うわ。。。
0314デフォルトの名無しさん (オッペケ Sref-9p2Q)垢版2018/10/27(土) 09:14:33.78ID:EI3TCK5cr
ループってreadのループ?
catからパイプしてwhileのreadループってどうなんだっけ
昔作ったシェルでcatしてたファイルを処理中に書き換えたけど
実行されてる処理では書き換える前の内容で処理されてたみたいだから
どこかメモリに展開されてるんじゃ
catからのパイプでプロセスが終わってるからか?
でもリダイレクトやヒアドキュメントでも同じじゃないの?
0315デフォルトの名無しさん (ワッチョイ 1d80-SUE8)垢版2018/10/27(土) 09:24:18.83ID:S4VvuAVS0
低学歴知恵遅れの思考形態、世界では
すでに用意されているコマンドを組み合わせてシェルスクリプトを書くことが
シェルスクリプトを書くことになるという決まりがあるのが
このスレみてると分かる
0317デフォルトの名無しさん (ワッチョイ 5b76-MKt5)垢版2018/10/27(土) 09:36:35.55ID:94jXB05x0
>>314
単にバッファに入っていただけとか。カーネルに設定できるバッファサイズなバッファなんぞもしくはcatプログラムのバッファ(の方が小さいだろう、たぶん)
もしくは上書きが上書きではなくて削除して新規ファイルに保存とかの場合とか(削除してもどこぞでオープンしていたらクローズされるまでは元のはそのまま残る)、か、OSが他でオープンされていたら上書きでも同じように別に保存してるとか
0318デフォルトの名無しさん (ワッチョイ 5b98-o90R)垢版2018/10/27(土) 10:00:05.77ID:4RrrP6U60
>>313
考えてるのはファイルの先頭からLFの数を数える
「効率がいい方法(コマンド)は何か」だよ

LFの数を数えることなんてわかりきったことは考えてない
それを実現する方法を考えてる

まったくキミは思慮が足りないなw
0325デフォルトの名無しさん (ワッチョイ 1d80-SUE8)垢版2018/10/27(土) 11:01:01.29ID:S4VvuAVS0
低学歴知恵遅れのしゃべり場
0331デフォルトの名無しさん (ワッチョイ df03-WuzW)垢版2018/10/28(日) 06:57:04.86ID:xmv6f/Y+0
そもそもシェルでええのにわざわざシェルスクリプトって言いたがる新参者達w
0334デフォルトの名無しさん (ワッチョイ df03-WuzW)垢版2018/10/28(日) 09:10:44.72ID:xmv6f/Y+0
>>333
おまえがググれよおこちゃまw
0335デフォルトの名無しさん (ワッチョイ 5b98-o90R)垢版2018/10/28(日) 09:26:48.32ID:PnJQ4LJT0
こんな感じに script1.sh が script2.sh を呼び出してる状態でさ、

script1.sh
 └ script2.sh

CTRL+Cを押した時、script2.shは止めて、script1.shは
止めないってできるのかなぁ?

シグナルって、伝搬というか、上から下へ もしくは 下から上へ
流れていくものなん?
0342デフォルトの名無しさん (ワッチョイ 5b76-MKt5)垢版2018/10/28(日) 11:47:47.85ID:gJfQRhUl0
script2.shでそのへんの制御とかしたくなく、script1.shだけでならscript1.shで trap SIGINTすればいいだけっぽいな。無効じゃなくなにもしないシグナルハンドラで
script2.shの時だけでならその前後でNOPのシグナルハンドラ設定通常のシグナルハンドラに戻すとかか

>>341 被ったけど、書いたので被り被りで
0343デフォルトの名無しさん (ワッチョイ 5b98-o90R)垢版2018/10/28(日) 17:27:21.50ID:XoYPKH7l0
勘違いしてた。違う所が原因だった

単純にscript2.shを起動してるのではなくて
script2.sh | filter みたいにパイプ使っていて、
CTRL+C押したときにscript2.shが出力するメッセージを
script1.shで受け取れないって問題だった
0344デフォルトの名無しさん (ワッチョイ 5b76-MKt5)垢版2018/10/28(日) 17:58:26.84ID:gJfQRhUl0
どのタイミングでの出力が出ない、出したいのかわからんな。CTRL+C押した瞬間ギリのか??としか思えないが。filterがなんなのか知らんけど、script1.shでtrapでもscript2.shでの出力が全くでないことなないだろう、当然
script2.shでtrapしてexitすればギリ近くのまで出るんじゃないの。script2.shで実際に出力しているコマンド(プロセス)にもよるだろうけど
0345デフォルトの名無しさん (ワッチョイ 5b76-MKt5)垢版2018/10/28(日) 18:40:23.99ID:gJfQRhUl0
ああ、trapの対象はパイプチェイン(?)の最後のヤツ&それがシェルでなければなのか?script2.shに飛ぶことはないのね。その最後のでexitすればだなすればかな
script2.sh | cat
script2.sh | sh -c "trap 'exit 0';cat"
のような変態なw それもシェル種類依存かな。あとはバッファをflushすればよりなんとかなりそうかなあ(できるのであれば)
そもそもCTRL+Cなんだからそんなギリを気にすんなってとこか
0347デフォルトの名無しさん (ワッチョイ 5b98-o90R)垢版2018/10/28(日) 19:05:49.36ID:XoYPKH7l0
>>344
最終的にやりたいことは

script1.sh ・・・ サブプロセスの標準出力・標準エラー出力を総てキャプチャしたい
script2.sh ・・・ 標準出力・標準エラー出力を行い、CTRL+Cを押されたら(trapして)
          CTRL+Cが押されたと標準エラー出力に出力したい

ってことなんだよね

> そもそもCTRL+Cなんだからそんなギリを気にすんなってとこか
そういうことだし、諦めて一つのスクリプトにしてやりたいことは
解決できたのでもう深追いする気はなくなってる

あと関係ないけど、SIGINTってPOSIXじゃないみたいだなw
INTを使えってshellcheckに怒られた。みんな SIG SIG 言ってるのに
0348デフォルトの名無しさん (ワッチョイ 5b76-MKt5)垢版2018/10/28(日) 20:03:04.22ID:gJfQRhUl0
なにその勝手にやる気なくすなよw ほんとに身勝手だな、いつも通り
SIGINTはPOSIXだからな(なぞ)。そっち寄りのの人は普通に使ってしまうんじゃね。てか、んなの本題に関係ないだろうに、そんなこと言いたいのはわかるけどさ(なぞ)
0352デフォルトの名無しさん (ワッチョイ 5b98-o90R)垢版2018/10/28(日) 20:30:59.64ID:XoYPKH7l0
>>350
やる気ではなくて、POSIX縛りは必須要件なので
サブプロセスの標準エラー出力の件は、別の方法で解決できることなので

数値でも指定できるのは知ってる。trap SIGINTとかSIGINT抜けてたとか
かいてあるから、trap INT、INT抜けてただよって言ってるだけ
0353デフォルトの名無しさん (ワッチョイ 5b76-MKt5)垢版2018/10/28(日) 20:36:08.52ID:gJfQRhUl0
また、後出しか。そんなレスしている目的は違うだろうw
いきなり「数値でも指定できるのは知ってる」とか??(3)に対して???

http://pubs.opengroup.org/onlinepubs/007904975/utilities/trap.html
(新しいドキュメントはどこだ?)
SIG付きもPOSIX仕様のようだけどなwオプションでも言及しているんだからPOSIXの仕様のひとつだろう
なんて、アホなやりとりしたいの?
0359デフォルトの名無しさん (ワッチョイ 5b76-MKt5)垢版2018/10/28(日) 20:56:45.89ID:gJfQRhUl0
だから最初は「(なぞ)」にしてたやん
>>347の最後あたりの応えとしてしかない。お前が変なツッコミするから悪い
ちなみに、>>353のPOSIXドキュメントでも (3) のことに言及しているのはどう思う?UNIX/Linuxはそんな境目はそれほど無いと思うけど。誰かみたいに(1)しか興味ない知らない人もいるだろうけど

単に知らなかっただけでいいのに、いつも偉そうにしているからドツボにはまってるように見えなくもないw
0360デフォルトの名無しさん (ワッチョイ 5b98-o90R)垢版2018/10/28(日) 21:00:00.71ID:XoYPKH7l0
> ちなみに、>>353のPOSIXドキュメントでも (3) のことに言及しているのはどう思う?

それが、シェルスクリプトだけのドキュメントじゃなくて、POSIXのドキュメントだからでしょう???
なにがいいたいんだか
0365デフォルトの名無しさん (ワッチョイ 5b76-MKt5)垢版2018/10/28(日) 21:37:09.45ID:gJfQRhUl0
>>363
で?その目的がわからんな。単に素直な疑問なだけなら、>>348で応えているけど。話を振ってねちっこく続けているのは誰なの?>>349とか以後とか
それも>>353でお前は納得したんだろ?


なんか上でC++のことを偉そうにのたまっているのを誤爆したのお前じゃなかったっけ?
それがお前じゃなくても、なんでコマンド関連のCなんて簡単なのにそんなに知らないのか不思議だな、なんか異常にシェルスクリプト「だけ」に拘るのもあって

UNIX/Linux界隈では自分でCでコマンド書く(簡単なフィルタも)のも普通にいるだろうから、お前のようにシェルスクリプトだけしか言ってはいけないなんてないと思うけどな(それも俺からは単にお前の間違いをごまかすためだけにしか見えんからw)

>>362は俺に振ってもいいが、なにを聞いているのか傍目にもわからないw すまんが、も少し具体的に>>362
0368デフォルトの名無しさん (ワッチョイ 5b98-o90R)垢版2018/10/28(日) 21:49:30.03ID:XoYPKH7l0
>>365
コマンド?
もしかして、trapがコマンドだと思ってる?
シェルビルトイン関数だよ

シェルのプロセスでシグナルを扱わなきゃいけないから
外部コマンドで実装することは不可能

だからシェルスクリプトスレでtrapの話をするならば
シェルスクリプト前提になるのは当然だろう?
0369デフォルトの名無しさん (ワッチョイ 5b76-MKt5)垢版2018/10/28(日) 21:53:11.18ID:gJfQRhUl0
>>368
そういう細かいことは言いたいのね。大枠でコマンドでいいじゃん (1) の範疇なんだから

その二行目以降はイミフ。なにを言っているの?言いたいの?
お前から見てミスを論ってなんとかお前のなにかを保ちたいだけにしか見えない
0375デフォルトの名無しさん (ワッチョイ 5b76-MKt5)垢版2018/10/28(日) 22:07:32.28ID:gJfQRhUl0
>>373,374
はあ?無茶苦茶やな
その答えはすでに応えているけど。「みんな SIG SIG 言ってるのに」のに対する応えを含めての
それも最初に。それも話の流れで、お前も納得勉強wになっただろうにww

よほど「お前のなにかを保ちたい」が琴線だったようだねえw
0384デフォルトの名無しさん (ワッチョイ 1d80-SUE8)垢版2018/10/29(月) 22:10:10.39ID:JGxixszg0
村に戻って親が死んでたら
そいつは手遅れコロスしかない
親はいつまでも待っていない
0391デフォルトの名無しさん (ワッチョイ 1d80-SUE8)垢版2018/10/30(火) 23:49:50.18ID:H/liFP070
いや手遅れ
親がしんでたらゾンビスプロセスになる
殺すしかない
0393デフォルトの名無しさん (ワッチョイ ab98-QXT6)垢版2018/11/01(木) 17:53:36.33ID:Kkuf6Nxk0
一回のループでファイルや変数を使わずに、偶数行と奇数行にまとめられないかなぁ?

例えば、入力ファイルが以下のような場合
1
2
3
4
5

出力は、以下のようにしたい
2 # ここから偶数行
4
1 # ここから奇数行
3
5

ファイルディスクリプタをうまく使えばできるんじゃないか?
と思ってたりするけどうまくいかない
0394デフォルトの名無しさん (アウアウウー Sac7-AdN2)垢版2018/11/01(木) 18:26:55.97ID:OxvwXsOaa
変数も使っちゃダメなのか。うーん。
0396デフォルトの名無しさん (ワッチョイ ab98-QXT6)垢版2018/11/01(木) 18:50:36.53ID:Kkuf6Nxk0
>>395
sedでできるならsedでもいいけど。

やっぱり無理だよなぁ
結局、奇数行のデータを後からだすためには
どこかにためておく必要があるわけで
メモリかディスクはどうしても使用してしまう

二回のループにするなら、メモリもディスクも消費しないけど
今度は入力データをためておく必要がある
■ このスレッドは過去ログ倉庫に格納されています

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