シェルスクリプト総合 その29
■ このスレッドは過去ログ倉庫に格納されています
!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 シグナルを送信するコマンドの名前がsigとかじゃなくkillなのはなぜでしょうか。
例によって歴史的経緯? 元々はSIGKILLシグナルしか送信しなかったのでkillとか。 >>379
某農家「村を出てアイドルになるなんてとんでもねぇ、両立するべ」 ご想像どおり、version6 unix以前はkillしかできなかった模様 村に戻って親が死んでたら
そいつは手遅れコロスしかない
親はいつまでも待っていない >>304
それを言えるのは、まだ手遅れになってないからなんやで お題:スクリプトのシグナルを扱う外部コマンドを設計せよ こんな感じ?w
#!/bin/sh
trap "$(extcmd)" INT
[extcmd]
#!/bin/sh
cat <<HERE
handler() {
: なにかする
}
handler
HERE >>389
おお、なるほど。長っ探しづらと一瞥では思ったが系統だってのでこっちのがいいか
どうもです いや手遅れ
親がしんでたらゾンビスプロセスになる
殺すしかない UTF-8で符号化された文字列に対応してるfmt(1)コマンドってある?
GNU coreutilsのfmt(1)は無理だった。 一回のループでファイルや変数を使わずに、偶数行と奇数行にまとめられないかなぁ?
例えば、入力ファイルが以下のような場合
1
2
3
4
5
出力は、以下のようにしたい
2 # ここから偶数行
4
1 # ここから奇数行
3
5
ファイルディスクリプタをうまく使えばできるんじゃないか?
と思ってたりするけどうまくいかない >>395
sedでできるならsedでもいいけど。
やっぱり無理だよなぁ
結局、奇数行のデータを後からだすためには
どこかにためておく必要があるわけで
メモリかディスクはどうしても使用してしまう
二回のループにするなら、メモリもディスクも消費しないけど
今度は入力データをためておく必要がある >>393
もし変数を使っていいなら,どうやって書くの? >>397
こんな感じでは?
while 全行ループ; do
if 偶数行 then echo 偶数行
奇数行変数 = 奇数行変数 + 奇数行 + 改行
done
echo 奇数行変数 元データがファイルに入っていて2回読んで良くて尚且つ変数使って良いなら楽だよ、っていうかそれなら誰でも作れるかw 遅くなるのでディスクに書き込みたくないし、メモリも
あまり使用したくなかったんだけど仕方ないか
実際には偶数行、奇数行じゃなくて、データを種類ごとに前後に分けたくて
後ろに分けるデータは基本的に少ないってことがせめてもの救いか 何度も実行するものなので、遅いとストレスたまるから その理屈だと、
・バカなのにストレス溜まるの?(不思議)
・バカじゃないならストレス溜まる(普通)
ってことになるから、
バカやめたら、それこそストレス溜まるのでは? バカの理屈わろたw
バカなんやから考えん方がええで バカに言いかえすとか無理やわ理屈がないからバカなんやでおまえ そりゃね。>>404が正しいから何も言いえせないわなw 奇数行だけ抽出するスクリプトと
偶数行だけの二つ作って、
奇数行スクリプトの出力に偶数行のを追記させる
なんとなくそんなイメージ 速度言うならCなりJavaで書いてデーモン化して動かさんとな
シェルスクリプト特有のコマンド羅列のプロセス起動しまくりってのは
すごいコストがかかってる 偶数行抽出
grep "Kkuf6Nxk0"
奇数行抽出
grep "zOBF+lvD0"
楽勝すぎるわ >>404
いや普通なら落としどころ決めるだろ
シェルスクリプトだからあきらめるとか
ちゃんとした言語で作るとか
バカだから漠然と心配ばかりしてストレスが溜まる
今も月が落ちてくる心配でもしてるんじゃないの >>412
デーモンだって実行プロセスは立ち上げないとダメだろ >>413
シェルが固まったんやがウイルスちゃうやろな?直しかた教えろバカ >>413
後出しで奇数偶数じゃないって言ってるよ seq 5 | awk '{print ($1%2?"b":"a") $1}' | sort -V | cut -c2- >>414
普通(?)の言語で作ったって、結局は変数に入れないとだめでしょ
ファイルを受け取ってその順番を変えて出すんだから
キミは本質をわかってない >>412
シェルスクリプト(と一部のPOSIXコマンド)で作るっていうのは
必須条件なのでそれはできないのです。 >>413
結局はそれ、二回読み込んでるんだよね
>>418
それも考えたんだけど、結局はソートの
ためにメモリに読み込むから本質的には変わらないかなーと
あと>>393の例が良くなかったけど、入力ファイルは昇順とは限らなくて
偶数グループと奇数グループにわけるだけで、順番は変えたくないんだ >>421
バカじゃないので黙らないw
ってか、俺を黙らせるのは不可能なのでNGにして
俺にくだらないレスしないようにしてください
俺にもくだらない反論(?)が来ないのでWIN♪WIN♪ >>425
バカを嘲笑うのがおもろいのにNGにするわけないやろ
ホンマにバカやなおまえ ああもぅめんどくせぇなw 順番変えたくないなら stable sort でええやんけ
メモリがどーたらこーたらは知らんw
$ cat hogehoge | awk '{print ($1%2?"b":"a") "\t" $1}' | sort -s -k1,1 | cut -f2 じゃあなんで黙れって言ったの?
俺が書き込みしなきゃ、お前出てこれないじゃん
矛盾してるよね。 >>419
だから変数使えって言ってるんだよ
たいした理由も無いのに速度だリソースだって言ってるだけなんでしょ
だったら奇数用途偶数用を1回ずつ合計2回実行すればいいだけ だから仕方ないかって書いてんのにw
ほんと人の話読まないやつだな
400 自分:デフォルトの名無しさん (ワッチョイ ab98-QXT6)[sage] 投稿日:2018/11/01(木) 19:51:11.07 ID:Kkuf6Nxk0 [4/15]
遅くなるのでディスクに書き込みたくないし、メモリも
あまり使用したくなかったんだけど仕方ないか tee(1)コマンド使ったらいけるかなとか考えたが無理かな。 >>434
片方ファイルだもんね。
メインプロセス起動(出力を2つに分岐)
├出力1 偶数行表示プロセス実行
└出力2 奇数行表示プロセス実行(偶数行表示プロセス終了後に処理開始)
みたいな事ができるかな?と思ったんだけど
まあ、これでも内部的には出力がバッファに
溜め込まれてるんだろうけどね >>432
お前ホントバカだな
お前のようなバカのためにプログラム書いてやったぞ
eo-sort.exe
第一引数に入力ファイルを渡せば標準出力に
まず偶数業出してその後に奇数業出してくれる
必要ならそれをファイルにリダイレクトしなよ ああ、あと出し情報で偶数奇数じゃなかったんだよな
そりゃいらないわなw >>435
というかよく読んだら「ファイルディスクリプタをうまく使う」ってそういうことだよね
teeっていうのはファイルと標準出力に書き込む「ファイルディスクリプタをうまく使う」コマンドの一つなんだからさ。
まあ俺には変数使わずに出力を分けるのは無理かな。
ところで変数使わない理由はPOSIXシェルスクリプトは変数のスコープができず
利用者が定義している定数を潰す可能性があるからって理解でいいのかな? 印刷して紙でやればメモリもディスクも使わないんじゃね? じゃぁ moreutils の pee コマンドでも使ったら
$ cat hogehoge | pee 'awk "!(\$1%2)"' 'awk "\$1%2"' 同じターミナルに出力するのが仕様間違いだろ。スクロールバックがめんどくさい。 >>443
これすごいね。
peeコマンドに可搬性を持たせられたらいいんだけど、それが問題だよね あのう、プロセス動かすだけでメモリ消費してしまうんですが
変数や作業用ファイル作らなくても内部的な一時ファイルは作られるわけで
リソース消費しないで切り分けようとエディタ立ち上げて手作業でやっても、やっぱりリソース消費があるので
誰かが言ったように、ノートかなにかに手書き転記するしかないと思う
つうか、そんな人はコンピュータ使っちゃダメだと思う
まるで、経団連会長みたいなんだもの
最近会長室にコンピュータが導入されたらしい
あれこれ、たかが変数や作業用ファイル如きでリソース消費しないように考える時間など無駄中の無駄
なにも、惑星探査衛星の限られたリソースでなんとかするって話じゃないんだから
時間の使い方を間違っている
そんな下らない話題で、ここのスレのリソースも無駄遣い >>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 >>443
>>451のシェルスクリプト実装版もそうだけど、
俺の予想が正しければ、その2つのawkは並列に動作するんじゃないかな?
1つ目のコマンド実行が完了まで2つ目のコマンドの実行をブロックするとは
思えないので2つの出力は混じって出てくると思う。
プロセス起動のオーバーヘッドがあるから少量のデータだと
コマンド順に出力されるように見えるかもだけど あれ? これでできてね?
最初こんな感じだったからブロックされずに混じって出てくることになったけど
foo() { cat -; }
bar() { cat -; }
こうしたせいで出力がブロックされてる気がする
foo() { printf 'foo %s\n' "$(cat -)"; }
bar() { printf 'bar %s\n' "$(cat -)"; } >>451
https://www.mankier.com/1/pee
これを読む限り引数は2つだけじゃないから,ちょっと機能不足かもね。
もちろん今回のあなたの目的には合うけど(2通りのパイプがあればそれで十分でしょう?)
ただ,もっと一般的なpee(1)コマンドを作ろうと思うと,
引数の数に応じてまずは雛形を作りそれをevalする,みたいな方法を採る必要があるかも。 >>454
複数対応だと面倒くさそう・・・
eval使えば可能だろうけど、文字列組み立てるのが
そう。今回書いた内容は>>453でできる。
だけど今回書いてないもう一つの制限があってそれで出来ない・・・
(制限っていうのはパイプで関数に渡すんじゃなくて変数で渡したい)
まあいいや、また長くなりそうだから質問閉じるわ
とりあえず変数使わずに出力をまとめることはできたし
あとは別の問題 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 になるし >>449
> なにも、惑星探査衛星の限られたリソースでなんとかするって話じゃないんだから
いや知らんけどそういう極小環境なのかも知れんよ。そうでなければこんな要求出てこないと思うが。 限定的ながら変数で渡すっていうのが出来てしまったので晒す。多分使わない
#!/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 なんで使わないかというと、変数をパイプで渡すために
setでシェル変数をダンプして、evalしてるんだが、
bashでは読み取り専用変数があってエラーになるから
setの出力をあれこれフィルタすればできると思うが、
変数の中に改行が入ってる場合とか対応が面倒
bashなら変数名に特定のプリフィックスがついたものだけ
ダンプできたとは思うが他のシェルではそうは行かない
また、行ごとに変数すべてをsetしてevalとか
パフォーマンス悪そうだし。 >>457
そんな環境でPosix縛りだとしたら、プロジェクト自体が間違ってる。 > そんな環境でPosix縛りだとしたら
実はPOSIXよりも状況が悪いw
使える機能がPOSIX未満なんだよ。
つまり一部の機能しか実装されていない ただの愚痴だけど
POSIXユーティリティにネットワーク通信が含まれてないのってマジで致命的欠陥だと思う。
POSIX原理主義とか,たしかに素晴らしい考えだとは思うけど,ネットワーク通信なくして現在のコンピュータを管理・運用するのは不可能っていうか
もしできてもすごくつまらないでしょう。 なんでバカって大げさに言いたがるんやw
致命的てwww なぜか悔しがって意味不明なバカ>>465
どないなっとんねんおまえらwww アンリカバブルな低学歴知恵遅れだからしょうがない MicroPythonを実装した方が良さそう
組込にも対応してるから コマンドを作っていてすこし疑問に思ったことなんだけど
--helpオプションで出力される文章って太字や着色なんかで装飾してもいいのかな。
「いいのかな」っていうか、そういうことしてるコマンドをほとんどみかけないので
もしかしたら「--helpオプションで出力される文章は装飾しないように」っていう規約がどこかにあるのかな と思ってさ。 >>471
それはいいアイデアだな。
コマンドの出力とは違ってヘルプを入力するプログラムなんて
無いだろうし、カラー専用でもいいくらいなんじゃないか?
そう考えると、manとかinfoもカラーにするべきなんだろうな
今どきカラー使えないとかまず無いし
色ももう16色に拘る必要もないだろう
最低でも256色、24bitカラーも普通に使っていいだろう >>471
どこかにあったとしその素性のわからん規約におまえが従う必要ないやんアホなん? 慣習は先人の知恵が詰まってる場合もある
自分勝手に振る舞う自称合理的よりよっぽど賢い質問だと思う
AIXはmanが黄色とか太字とかで修飾されてた気がするな ↑ふざけとんのか
BASH(1) General Commands Manual BASH(1)
名名前前
bash - GNU Bourne-Again SHell
書書式式
bash [options] [file]
著著作作権権
Bash is Copyright (C) 1989-2011 by the Free Software Foundation, Inc.
説説明明
bash は、標準入力やファイルから読み込んだコマンドを実行する、 sh 互換のコマンド言語インタプリタです。 bash に
は、Korn シェルや C シェル ksh や csh) の便利な機能も採り入れられています。
bash は IEEE POSIX specification (IEEE Standard 1003.1) の Shell and Utilities に準拠する実装を目指していま
す。 bash はデフォルトで POSIX 準拠に設定することもできます。
オオププシショョンン >>472
24bitカラーはまだマズいと思う。
多くのXデスクトップ環境で利用されてる端末エミュレータ
(GNOME TerminalとかLXTerminalとか)は
LibVTEベースなのよ。
そしてLibVTEの安定板は24bitカラーには対応してない。 そういうのを根本的に対応できるようにするなら
roffが対応する部分になるからな
このスレでやってることは
池沼の塗り絵 ■ このスレッドは過去ログ倉庫に格納されています