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
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
0380デフォルトの名無しさん (ワッチョイ 9764-Ed1r)
垢版 |
2018/10/28(日) 23:38:46.03ID:5IpH1DwA0
シグナルを送信するコマンドの名前がsigとかじゃなくkillなのはなぜでしょうか。
例によって歴史的経緯? 元々はSIGKILLシグナルしか送信しなかったのでkillとか。
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でもいいけど。

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

二回のループにするなら、メモリもディスクも消費しないけど
今度は入力データをためておく必要がある
0399デフォルトの名無しさん (アウアウウー Sac7-AdN2)
垢版 |
2018/11/01(木) 19:46:11.92ID:OxvwXsOaa
元データがファイルに入っていて2回読んで良くて尚且つ変数使って良いなら楽だよ、っていうかそれなら誰でも作れるかw
0400デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 19:51:11.07ID:Kkuf6Nxk0
遅くなるのでディスクに書き込みたくないし、メモリも
あまり使用したくなかったんだけど仕方ないか

実際には偶数行、奇数行じゃなくて、データを種類ごとに前後に分けたくて
後ろに分けるデータは基本的に少ないってことがせめてもの救いか
0401デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 19:58:02.45ID:zOBF+lvD0
なんでバカって実行速度ばかり気にするんや?
0403デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 20:00:23.29ID:zOBF+lvD0
バカなのにストレスたまるの?バカやめたら?
0404デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 20:03:44.33ID:Kkuf6Nxk0
その理屈だと、
・バカなのにストレス溜まるの?(不思議)
・バカじゃないならストレス溜まる(普通)
ってことになるから、

バカやめたら、それこそストレス溜まるのでは?
0405デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 20:18:26.34ID:zOBF+lvD0
バカの理屈わろたw
バカなんやから考えん方がええで
0407デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 20:37:24.98ID:zOBF+lvD0
バカに言いかえすとか無理やわ理屈がないからバカなんやでおまえ
0410デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 20:50:42.34ID:zOBF+lvD0
バカとバカを嘲笑う者や
0411デフォルトの名無しさん (ワッチョイ 4e81-8AGB)
垢版 |
2018/11/01(木) 20:51:14.40ID:5U41yww90
奇数行だけ抽出するスクリプトと
偶数行だけの二つ作って、
奇数行スクリプトの出力に偶数行のを追記させる

なんとなくそんなイメージ
0412デフォルトの名無しさん (オッペケ Srbb-elto)
垢版 |
2018/11/01(木) 21:54:51.76ID:zo7FxUKXr
速度言うならCなりJavaで書いてデーモン化して動かさんとな
シェルスクリプト特有のコマンド羅列のプロセス起動しまくりってのは
すごいコストがかかってる
0414デフォルトの名無しさん (オッペケ Srbb-elto)
垢版 |
2018/11/01(木) 21:58:38.71ID:zo7FxUKXr
>>404
いや普通なら落としどころ決めるだろ
シェルスクリプトだからあきらめるとか
ちゃんとした言語で作るとか
バカだから漠然と心配ばかりしてストレスが溜まる
今も月が落ちてくる心配でもしてるんじゃないの
0416デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 21:59:49.59ID:zOBF+lvD0
>>413
シェルが固まったんやがウイルスちゃうやろな?直しかた教えろバカ
0421デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 22:09:12.59ID:zOBF+lvD0
バカはいいかげん黙っとけ
0422デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 22:12:35.86ID:Kkuf6Nxk0
>>413
結局はそれ、二回読み込んでるんだよね

>>418
それも考えたんだけど、結局はソートの
ためにメモリに読み込むから本質的には変わらないかなーと

あと>>393の例が良くなかったけど、入力ファイルは昇順とは限らなくて
偶数グループと奇数グループにわけるだけで、順番は変えたくないんだ
0423デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 22:13:57.69ID:Kkuf6Nxk0
>>421
バカじゃないので黙らないw
ってか、俺を黙らせるのは不可能なのでNGにして
俺にくだらないレスしないようにしてください
俺にもくだらない反論(?)が来ないのでWIN♪WIN♪
0424デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 22:16:53.31ID:zOBF+lvD0
>>423
要するにバカやんけおまえ
0426デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 22:21:41.75ID:zOBF+lvD0
>>425
バカを嘲笑うのがおもろいのにNGにするわけないやろ
ホンマにバカやなおまえ
0427デフォルトの名無しさん (ワッチョイ 9ab3-gRbH)
垢版 |
2018/11/01(木) 22:22:49.71ID:45pCF+y00
ああもぅめんどくせぇなw 順番変えたくないなら stable sort でええやんけ
メモリがどーたらこーたらは知らんw

$ cat hogehoge | awk '{print ($1%2?"b":"a") "\t" $1}' | sort -s -k1,1 | cut -f2
0430デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 22:25:19.85ID:zOBF+lvD0
>>428
バカはしゃべるな
0432デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 22:35:03.93ID:Kkuf6Nxk0
だから仕方ないかって書いてんのにw
ほんと人の話読まないやつだな

400 自分:デフォルトの名無しさん (ワッチョイ ab98-QXT6)[sage] 投稿日:2018/11/01(木) 19:51:11.07 ID:Kkuf6Nxk0 [4/15]
遅くなるのでディスクに書き込みたくないし、メモリも
あまり使用したくなかったんだけど仕方ないか
0435デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 22:43:09.27ID:Kkuf6Nxk0
>>434
片方ファイルだもんね。

メインプロセス起動(出力を2つに分岐)
├出力1 偶数行表示プロセス実行
└出力2 奇数行表示プロセス実行(偶数行表示プロセス終了後に処理開始)

みたいな事ができるかな?と思ったんだけど

まあ、これでも内部的には出力がバッファに
溜め込まれてるんだろうけどね
0436デフォルトの名無しさん (オッペケ Srbb-elto)
垢版 |
2018/11/01(木) 22:48:35.54ID:zo7FxUKXr
>>432
お前ホントバカだな
お前のようなバカのためにプログラム書いてやったぞ

eo-sort.exe

第一引数に入力ファイルを渡せば標準出力に
まず偶数業出してその後に奇数業出してくれる
必要ならそれをファイルにリダイレクトしなよ
0440デフォルトの名無しさん (ワッチョイ 5b64-ofXo)
垢版 |
2018/11/01(木) 23:01:11.09ID:upF+pHX50
>>435
というかよく読んだら「ファイルディスクリプタをうまく使う」ってそういうことだよね
teeっていうのはファイルと標準出力に書き込む「ファイルディスクリプタをうまく使う」コマンドの一つなんだからさ。
まあ俺には変数使わずに出力を分けるのは無理かな。

ところで変数使わない理由はPOSIXシェルスクリプトは変数のスコープができず
利用者が定義している定数を潰す可能性があるからって理解でいいのかな?
0444デフォルトの名無しさん (ワッチョイ 769f-MyS3)
垢版 |
2018/11/01(木) 23:58:02.32ID:s+SrulDE0
>>441
コペルニクス的転回だな。
0449デフォルトの名無しさん (ワッチョイ b69f-8AGB)
垢版 |
2018/11/02(金) 06:38:46.12ID:BwjETkqh0
あのう、プロセス動かすだけでメモリ消費してしまうんですが
変数や作業用ファイル作らなくても内部的な一時ファイルは作られるわけで
リソース消費しないで切り分けようとエディタ立ち上げて手作業でやっても、やっぱりリソース消費があるので
誰かが言ったように、ノートかなにかに手書き転記するしかないと思う

つうか、そんな人はコンピュータ使っちゃダメだと思う
まるで、経団連会長みたいなんだもの
最近会長室にコンピュータが導入されたらしい

あれこれ、たかが変数や作業用ファイル如きでリソース消費しないように考える時間など無駄中の無駄
なにも、惑星探査衛星の限られたリソースでなんとかするって話じゃないんだから
時間の使い方を間違っている
そんな下らない話題で、ここのスレのリソースも無駄遣い
0451デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/02(金) 07:42:30.53ID:bE/8yEKV0
>>448
> peeコマンドに可搬性を持たせられたらいいんだけど、それが問題だよね

こんなんでどう? peeコマンドのシェルスクリプト実装版
シェルスクリプトで実装したから外部コマンドだけじゃなくてシェル関数も呼べるよ

#!/bin/sh

pee() {
( ( (
while IFS= read -r line; do
printf '%s\n' "$line"
printf '%s\n' "$line" >&3
done | "$1" >&4) 3>&1 ) | "$2" ) 4>&1
}

foo() { printf 'foo %s\n' "$(cat -)"; }
bar() { printf 'bar %s\n' "$(cat -)"; }

pee foo bar
0452デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/02(金) 07:59:00.48ID:bE/8yEKV0
>>443

>>451のシェルスクリプト実装版もそうだけど、
俺の予想が正しければ、その2つのawkは並列に動作するんじゃないかな?
1つ目のコマンド実行が完了まで2つ目のコマンドの実行をブロックするとは
思えないので2つの出力は混じって出てくると思う。

プロセス起動のオーバーヘッドがあるから少量のデータだと
コマンド順に出力されるように見えるかもだけど
0453デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/02(金) 08:25:40.36ID:bE/8yEKV0
あれ? これでできてね?

最初こんな感じだったからブロックされずに混じって出てくることになったけど
foo() { cat -; }
bar() { cat -; }

こうしたせいで出力がブロックされてる気がする
foo() { printf 'foo %s\n' "$(cat -)"; }
bar() { printf 'bar %s\n' "$(cat -)"; }
0454デフォルトの名無しさん (ワッチョイ 5b64-ofXo)
垢版 |
2018/11/02(金) 08:26:07.31ID:tmRne/9W0
>>451
https://www.mankier.com/1/pee
これを読む限り引数は2つだけじゃないから,ちょっと機能不足かもね。
もちろん今回のあなたの目的には合うけど(2通りのパイプがあればそれで十分でしょう?)
ただ,もっと一般的なpee(1)コマンドを作ろうと思うと,
引数の数に応じてまずは雛形を作りそれをevalする,みたいな方法を採る必要があるかも。
0455デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/02(金) 08:41:23.56ID:bE/8yEKV0
>>454
複数対応だと面倒くさそう・・・
eval使えば可能だろうけど、文字列組み立てるのが

そう。今回書いた内容は>>453でできる。
だけど今回書いてないもう一つの制限があってそれで出来ない・・・
(制限っていうのはパイプで関数に渡すんじゃなくて変数で渡したい)

まあいいや、また長くなりそうだから質問閉じるわ
とりあえず変数使わずに出力をまとめることはできたし
あとは別の問題
0456デフォルトの名無しさん (ワッチョイ 9ab3-gRbH)
垢版 |
2018/11/02(金) 09:19:53.88ID:Rb6mIS4M0
foo() { printf 'foo %s\n' "$(tail -n 1 -)"; }
bar() { printf 'bar %s\n' "$(head -n 1 -)"; }

ってして seq 1000 | ./pee.sh としたら実行する度に foo の値
が違ってるな…どちからの子プロセスが実行完了したら while
も終了するから仕方ないんだろうけど。trap '' PIPE ってすると
I/O error になるし
0457デフォルトの名無しさん (アウアウウー Sac7-AdN2)
垢版 |
2018/11/02(金) 09:45:49.16ID:0QIYfvOaa
>>449
> なにも、惑星探査衛星の限られたリソースでなんとかするって話じゃないんだから

いや知らんけどそういう極小環境なのかも知れんよ。そうでなければこんな要求出てこないと思うが。
0459デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/02(金) 09:59:54.78ID:bE/8yEKV0
限定的ながら変数で渡すっていうのが出来てしまったので晒す。多分使わない

#!/bin/sh
main() {
 index=0
 ( ( (
  while IFS= read -r line; do
   index=$((index+1))
   dumpvar_and_call "even"
   dumpvar_and_call "odd" >&3
  done | eval "$(cat -)" >&4) 3>&1 ) | eval "$(cat -)" ) 4>&1
}
dumpvar_and_call() { set; echo "$1"; }
even() {
 if [ $((line % 2)) = 0 ]; then
  echo "index:$index even $line"
  sleep 1
 fi
}
odd() {
 if [ $((line % 2)) = 1 ]; then
  echo "index:$index odd $line"
 fi
}
main<<HERE
3
6
7
4
2
8
HERE
0460デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/02(金) 10:03:43.36ID:bE/8yEKV0
なんで使わないかというと、変数をパイプで渡すために
setでシェル変数をダンプして、evalしてるんだが、
bashでは読み取り専用変数があってエラーになるから

setの出力をあれこれフィルタすればできると思うが、
変数の中に改行が入ってる場合とか対応が面倒

bashなら変数名に特定のプリフィックスがついたものだけ
ダンプできたとは思うが他のシェルではそうは行かない

また、行ごとに変数すべてをsetしてevalとか
パフォーマンス悪そうだし。
■ このスレッドは過去ログ倉庫に格納されています

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