シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。
bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています
最新の仕様はこちらへ http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」 から参照することができます。)
・v7 shに一番近くて、現役(?)のshは、OpenSolaris由来のheirloom sh。
http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう
シェルスクリプト総合 その27
https://mevius.5ch.net/test/read.cgi/unix/1525337663/
探検
シェルスクリプト総合 その28
■ このスレッドは過去ログ倉庫に格納されています
2018/08/02(木) 05:22:16.82
2021/05/20(木) 09:04:51.56
2021/05/20(木) 09:10:53.80
誰かPOSIX原理主義者とユニケージの関係教えてくれ
2021/05/20(木) 10:27:21.13
どちらも秘密主義だからな。俺も少し興味があるが
非公開の独自技術には興味なくて裏で糸を引いているやつらに興味がある
wikipediaを見る限りUSP研究所と金沢大学が手を組んでるっぽい
USP研究所がユニケージという開発手法で怪しげなビジネスをしていて
それにコネかなんかで金沢大学が手を貸して箔をつけてる感じ
もしくは金沢大学関係者が作ったのがUSP研究所なのかもな
POSIX原理主義者はUSP研究所もしくは金沢大学の関係者だと思われる
構成員の中の幹部クラスで多分3人ぐらいしかいない
ただ引っかかるのはユニケージとPOSIX原理主義が矛盾しているという点
POSIX原理主義はPOSIXのコマンドだけを使うと言ってるがユニケージは独自コマンドを押し付けている
ユニケージ=シェルスクリプト主義でそこから分岐したのが原理主義なのかもしれないな
非公開の独自技術には興味なくて裏で糸を引いているやつらに興味がある
wikipediaを見る限りUSP研究所と金沢大学が手を組んでるっぽい
USP研究所がユニケージという開発手法で怪しげなビジネスをしていて
それにコネかなんかで金沢大学が手を貸して箔をつけてる感じ
もしくは金沢大学関係者が作ったのがUSP研究所なのかもな
POSIX原理主義者はUSP研究所もしくは金沢大学の関係者だと思われる
構成員の中の幹部クラスで多分3人ぐらいしかいない
ただ引っかかるのはユニケージとPOSIX原理主義が矛盾しているという点
POSIX原理主義はPOSIXのコマンドだけを使うと言ってるがユニケージは独自コマンドを押し付けている
ユニケージ=シェルスクリプト主義でそこから分岐したのが原理主義なのかもしれないな
2021/05/20(木) 10:30:31.60
>>343
ネタとしてのオモロイだなw
東京ハンズで大規模対応でクラウドに移行して
それに対応できなくなって今では闇とか負債と言われてるんだっけな
https://www.hands-lab.com/tech/t5600/
ここにはBashのフレームワークってかいてあるな
BashってことはやっぱりPOSIX原理主義とも違うな
ネタとしてのオモロイだなw
東京ハンズで大規模対応でクラウドに移行して
それに対応できなくなって今では闇とか負債と言われてるんだっけな
https://www.hands-lab.com/tech/t5600/
ここにはBashのフレームワークってかいてあるな
BashってことはやっぱりPOSIX原理主義とも違うな
2021/05/20(木) 11:00:28.58
2021/05/20(木) 11:19:43.21
POSIX原理主義者「シェルスクリプトは遅くない!なぜなら郵便番号から住所を検索なんで一瞬で探せる!」
※CSVファイルは解凍した状態でたったの12MBです。
どんだけ小規模低負荷前提で吠えてるのかとw
※CSVファイルは解凍した状態でたったの12MBです。
どんだけ小規模低負荷前提で吠えてるのかとw
2021/05/20(木) 16:03:03.24
sql文を組み立てるシェルスクリプトを書きます
2021/05/21(金) 21:36:49.34
シェルスクリプトは連想配列が使えるから
原理的には高速
オーバーヘッドがない分
他の言語より早い場合が多いと思う
保守しにくいけど
原理的には高速
オーバーヘッドがない分
他の言語より早い場合が多いと思う
保守しにくいけど
2021/05/21(金) 21:43:40.33
オーバーヘッドって何のことだ?
2021/05/21(金) 22:08:05.49
ファイルサイズに依存するオーバーヘッドはメモリ上に載せる部分じゃろ?
全部載せてしまえば定数時間のはずだけど、上限とかなかったっけ
載せないで逐次処理なら固定長レコード上に添字でジャンプのデータベースには勝てない
載せても多分勝てないけど
全部載せてしまえば定数時間のはずだけど、上限とかなかったっけ
載せないで逐次処理なら固定長レコード上に添字でジャンプのデータベースには勝てない
載せても多分勝てないけど
2021/05/21(金) 22:16:12.19
英辞郎くらいなら適当に整形してgrepで引いてるな、5秒くらいかかるが…
毎回読み込まず、&で起動して配列抱えたままsleep、named pipeをポーリングてもらうか
毎回読み込まず、&で起動して配列抱えたままsleep、named pipeをポーリングてもらうか
2021/05/21(金) 22:31:20.56
前から舐めるから時間かかってるだけだな、見出し語辞書引きなら既にソートされてるので人力二分探索が楽か
イニシャルでファイルを8つくらいに分け、引数見て探すファイルを割り振るだけで十分一秒切れる
イニシャルでファイルを8つくらいに分け、引数見て探すファイルを割り振るだけで十分一秒切れる
2021/05/21(金) 23:18:21.57
2021/05/21(金) 23:19:33.97
>>354
普通にSQLiteでも使ったほうが良いのでは?w
普通にSQLiteでも使ったほうが良いのでは?w
2021/05/21(金) 23:33:05.93
2021/05/22(土) 00:00:45.90
POSIX準拠だと連想配列ないけどねw
eval使えばそれっぽいことはできるけど
eval使えばそれっぽいことはできるけど
2021/05/22(土) 00:17:17.67
2021/05/22(土) 02:03:30.66
>>356
普段はdico(d)とかdict(d)使ってるよ、この用途には特化してる分sqlite3なんかより遥かに高速で優れてる
ただ、自前の辞書に索引付けてdictのdbに変換…ってのは面倒なんだよ
英和の出来合いdbってdict.orgとかでも提供されてないしな
テキスト形式の単一辞書(~100MB)をgrep、数秒のラグなら十分許容できるだろう
取り敢えず事足りればいいんだよって思想です
普段はdico(d)とかdict(d)使ってるよ、この用途には特化してる分sqlite3なんかより遥かに高速で優れてる
ただ、自前の辞書に索引付けてdictのdbに変換…ってのは面倒なんだよ
英和の出来合いdbってdict.orgとかでも提供されてないしな
テキスト形式の単一辞書(~100MB)をgrep、数秒のラグなら十分許容できるだろう
取り敢えず事足りればいいんだよって思想です
2021/05/22(土) 02:08:46.46
>>359
デーモンなんかの実装は大体そうでしょ
mkfifoでファイルのように読み書きできるパイプ作れるでしょ?
無限whileループの中で1秒程度sleep、パイプに書き込まれてるかreadでチェック(所謂原始的なポーリング)
デーモンなんかの実装は大体そうでしょ
mkfifoでファイルのように読み書きできるパイプ作れるでしょ?
無限whileループの中で1秒程度sleep、パイプに書き込まれてるかreadでチェック(所謂原始的なポーリング)
2021/05/22(土) 02:29:18.62
追伸>>361
プロセスの関係について答えてなかった
クライエントがコマンドライン引数を単にnamed pipeへ書き込むだけのシェルスクリプトでいいです
というか必須でないです
ぶっちゃけやることはecho query >fifo
それを$eiji queryと書けると分かりやすいというだけですね
プロセスの関係について答えてなかった
クライエントがコマンドライン引数を単にnamed pipeへ書き込むだけのシェルスクリプトでいいです
というか必須でないです
ぶっちゃけやることはecho query >fifo
それを$eiji queryと書けると分かりやすいというだけですね
2021/05/22(土) 02:36:55.49
老婆心かもしれないけど、常駐シェルスクリプトなんて何ら特別なものでないよ
常駐しないシェルスクリプト=exitの記述が存在している、あるいはeofに達するもの
常駐できるシェルスクリプト=signalやらで殺さなければexit/eofに達しないモノです
常駐しないシェルスクリプト=exitの記述が存在している、あるいはeofに達するもの
常駐できるシェルスクリプト=signalやらで殺さなければexit/eofに達しないモノです
2021/05/22(土) 02:44:59.50
shを常用するやつは居るが
流石にed常用するやつは居らんな
流石にed常用するやつは居らんな
2021/05/22(土) 02:59:57.65
edは生の改行文字食わせる必要あるし、sedのように;で区切れないから、コマンドラインから使いにくい…
printf %s\\n cmd1 cmd2 ...をeasyedとか名付けておけば、easyed cmd1 cmd2 ...で使いやすくなるね
ただ、sedやawkでカウンタ設定して何行後の処理を指定するような処理を書いている事に気づいたら、そういう処理はedの領分
前後の相対アドレスを+nのように簡潔に指定できる
あと、diffがedのコードを吐けるというのもあって、それをテンプレにして弄るとバッチ的な処理はより早く書けると思う
printf %s\\n cmd1 cmd2 ...をeasyedとか名付けておけば、easyed cmd1 cmd2 ...で使いやすくなるね
ただ、sedやawkでカウンタ設定して何行後の処理を指定するような処理を書いている事に気づいたら、そういう処理はedの領分
前後の相対アドレスを+nのように簡潔に指定できる
あと、diffがedのコードを吐けるというのもあって、それをテンプレにして弄るとバッチ的な処理はより早く書けると思う
2021/05/22(土) 05:16:06.47
2021/05/22(土) 05:16:37.76
× 起動するのも
○ 常駐するのも
○ 常駐するのも
2021/05/22(土) 05:19:29.71
もっと具体的に言えば、POSIX準拠だと
シェルスクリプトは双方向パイプを使えない
シェルスクリプトは双方向パイプを使えない
2021/05/22(土) 06:08:57.28
そこは似非精進の生臭坊主で行こう
2021/05/22(土) 06:15:51.15
>>354
> イニシャルでファイルを8つくらいに分け、引数見て探すファイルを割り振るだけで十分一秒切れる
前方一致検索ならそれでもいいと思うけど、中間一致や全文検索だと結局すべてのファイルをgrepしないといけない
SQLiteなら全文検索もあるようだ
http://ytyaru.hatena(ドット)com/entry/2017/07/19/000000
>>360
> ただ、自前の辞書に索引付けてdictのdbに変換…ってのは面倒なんだよ
インデックスつけるのが面倒なんでしょ?
SQLiteならテーブル作ってデータを入れていくだけだよ
> イニシャルでファイルを8つくらいに分け、引数見て探すファイルを割り振るだけで十分一秒切れる
前方一致検索ならそれでもいいと思うけど、中間一致や全文検索だと結局すべてのファイルをgrepしないといけない
SQLiteなら全文検索もあるようだ
http://ytyaru.hatena(ドット)com/entry/2017/07/19/000000
>>360
> ただ、自前の辞書に索引付けてdictのdbに変換…ってのは面倒なんだよ
インデックスつけるのが面倒なんでしょ?
SQLiteならテーブル作ってデータを入れていくだけだよ
2021/05/22(土) 06:20:59.68
>>370
原理主義者周辺にはNoSQLってこだわりがある。
原理主義者周辺にはNoSQLってこだわりがある。
2021/05/22(土) 07:32:30.98
原理主義者はNoSQLに何を使ってんの?
2021/05/22(土) 07:33:00.54
MongoDBとか?
2021/05/22(土) 07:58:28.04
使えるならnamed pipeが行儀良いと思うけど、ポーリングさせるならただのファイルでも環境変数でも何でもいいんでね
あんまりSSDへ頻繁に書き込みたくないなら環境変数か
個人コマンドラインツールで一秒で返ってくれば問題ないという要件なら、ファイル分割で必要十分だろ
メモリも今時100MBくらい一時占めるのは有りだとしても、常駐させるとなるとチリツモ
あんまりSSDへ頻繁に書き込みたくないなら環境変数か
個人コマンドラインツールで一秒で返ってくれば問題ないという要件なら、ファイル分割で必要十分だろ
メモリも今時100MBくらい一時占めるのは有りだとしても、常駐させるとなるとチリツモ
2021/05/22(土) 08:03:33.44
>>374
いや、ファイルや環境変数を使うというのはどうでも良くて
それらをどう使って実現するのか?って話だよ。
あなた、自動運転を実現するにはどうしたら良いか?って言う話に
AIを使えばできるんです。みたいなことしか言ってないよw
いや、ファイルや環境変数を使うというのはどうでも良くて
それらをどう使って実現するのか?って話だよ。
あなた、自動運転を実現するにはどうしたら良いか?って言う話に
AIを使えばできるんです。みたいなことしか言ってないよw
2021/05/22(土) 08:04:29.68
定期的に読みに行けばいいだけじゃないの?
2021/05/22(土) 08:05:46.31
> 個人コマンドラインツールで一秒で返ってくれば問題ないという要件なら
個人用途であれば、その程度でも構わないってことには反論はしないけどね
C10K問題(クライアント1万台問題)が発生するような場合には、それじゃ使い物にならないけど
個人用途であれば、その程度でも構わないってことには反論はしないけどね
C10K問題(クライアント1万台問題)が発生するような場合には、それじゃ使い物にならないけど
2021/05/22(土) 08:08:59.98
>>376
もしかして
1. コマンド実行
2. 特定のディレクトリにファイルを作る
3. デーモンが1秒おきにそのディレクトリを監視している
4. デーモンはファイルを見つけたら処理をして新しく結果ファイルを作る
5. 1のコマンドは結果ファイルができるまで待ってて見つけたらその内容を表示する
って話?
もしかして
1. コマンド実行
2. 特定のディレクトリにファイルを作る
3. デーモンが1秒おきにそのディレクトリを監視している
4. デーモンはファイルを見つけたら処理をして新しく結果ファイルを作る
5. 1のコマンドは結果ファイルができるまで待ってて見つけたらその内容を表示する
って話?
2021/05/22(土) 08:10:30.45
この方法だと環境変数は無理っぽいな
2021/05/22(土) 08:12:00.68
・パイプで繋ぐと早い。
・標準入力を<でリダイレクトするより、パイプを通じてcatで流し込んだ方が早い。
経典に書いてあるw
・標準入力を<でリダイレクトするより、パイプを通じてcatで流し込んだ方が早い。
経典に書いてあるw
2021/05/22(土) 08:17:10.40
一つのnamed pipeに複数プロセスから同時に書き込んでも
データは混ざらないんだっけ?
データは混ざらないんだっけ?
2021/05/22(土) 08:18:16.07
手動で排他制御せなあかんやろ
2021/05/22(土) 08:20:44.48
ああ、ロックファイル使うのかw
2021/05/22(土) 08:37:55.55
デーモンがメモリにデータを蓄えておくって
原理主義者的にはどうなんだろう?w
原理主義者的にはどうなんだろう?w
2021/05/22(土) 08:47:09.09
>>378
おれはそう解釈するけど
結果もクエリも数行だろうから、環境変数の方がいい
標準sleepは1s単位なので微妙に要件満たせないけど、適当な代替コマンド用意できないなら2秒になってしまうが…
msec sleep便利よ
サーバスクリプトは$queryを1s sleepしながらループしてチェック、空で無ければクリアして検索に入り、$responseに書き出す
検索時間をa-zの26ファイルに分けて検索時間を1/26~0.1s程度にまで削減、コードも頭文字とファイル名に整合が取れて短くなるだろう
フォアグラウンドのクライアント側は$query設定して1s sleep、(既に設定されているはずの)$responseを標準出力へ書き出す
完了フラグ立てるとか面倒な事やるのはシェルスクリプトの領分超えてると思うわ
$responseが空ならエラー吐いて落とす
何回か走らせてみて、時間は適宜調整で決め打ちが楽だろう
おれはそう解釈するけど
結果もクエリも数行だろうから、環境変数の方がいい
標準sleepは1s単位なので微妙に要件満たせないけど、適当な代替コマンド用意できないなら2秒になってしまうが…
msec sleep便利よ
サーバスクリプトは$queryを1s sleepしながらループしてチェック、空で無ければクリアして検索に入り、$responseに書き出す
検索時間をa-zの26ファイルに分けて検索時間を1/26~0.1s程度にまで削減、コードも頭文字とファイル名に整合が取れて短くなるだろう
フォアグラウンドのクライアント側は$query設定して1s sleep、(既に設定されているはずの)$responseを標準出力へ書き出す
完了フラグ立てるとか面倒な事やるのはシェルスクリプトの領分超えてると思うわ
$responseが空ならエラー吐いて落とす
何回か走らせてみて、時間は適宜調整で決め打ちが楽だろう
2021/05/22(土) 08:51:16.35
古典技術ポーリング
2021/05/22(土) 09:05:22.83
2021/05/22(土) 09:07:41.80
ダサいけどtmpファイルか
2021/05/22(土) 09:07:47.64
> サーバスクリプトは$queryを1s sleepしながらループしてチェック、空で無ければクリアして検索に入り、$responseに書き出す
なんつーかシェル変数(環境変数)をグローバル変数とでも勘違いしてるような書き方だな
サーバースクリプトが$responseに書き出しても
それは他のプロセスからは見えないんだよ
なんつーかシェル変数(環境変数)をグローバル変数とでも勘違いしてるような書き方だな
サーバースクリプトが$responseに書き出しても
それは他のプロセスからは見えないんだよ
2021/05/22(土) 09:15:02.13
> 検索時間をa-zの26ファイルに分けて検索時間を1/26~0.1s程度にまで削減、コードも頭文字とファイル名に整合が取れて短くなるだろう
それだと中間一致には対応できない
それだと中間一致には対応できない
2021/05/22(土) 09:27:09.09
2021/05/22(土) 09:33:01.34
直接の親にならdeclareの拡張や文字列evalシェル関数で書き換えられるけど、兄弟の環境は変える手段無いのか
2021/05/22(土) 09:40:41.97
兄弟でもメインループの中でexport hoge=hageをファイルに書き出して互いにsourceすれば共有できるぞ
結局一時ファイル作ることになるから、それを許容するなら全部一時ファイルでやり取りするか、
それを嫌うならpsでPID特定して直接リダイレクト
結局一時ファイル作ることになるから、それを許容するなら全部一時ファイルでやり取りするか、
それを嫌うならpsでPID特定して直接リダイレクト
2021/05/22(土) 09:43:36.67
シェルスクリプトでTCPとかUDPとかどうです旦那
2021/05/22(土) 10:40:20.45
シェルスクリプトから離れてごめんだけど、dicodはちゃんとした辞書形式(索引-シーク位置)にコンパイルしなくても受け付けてくれたはずだよ、dictは使ってないので分からん
emacsの何とか形式ってやつがマニュアルに記載あったはず、単なる見出し+テキストのプレーンテキスト
マニュアルが激しく読みにくいけどsedあたりで頑張ってみたら
まあ索引付けないならgrepより速くなる保証もないわけだけど
曖昧検索や部分一致、逆引き、履歴等々色々高度な事もできるので、例え遅くてもやる価値はあるかと
emacsの何とか形式ってやつがマニュアルに記載あったはず、単なる見出し+テキストのプレーンテキスト
マニュアルが激しく読みにくいけどsedあたりで頑張ってみたら
まあ索引付けないならgrepより速くなる保証もないわけだけど
曖昧検索や部分一致、逆引き、履歴等々色々高度な事もできるので、例え遅くてもやる価値はあるかと
2021/05/22(土) 10:54:30.10
これね
https://puszcza.gnu.org.ua/software/dico/manual/dico.html#outline
PDICクライアントは
見出し セパーレータ テキスト(改行等エスケープ) セパレータ 関連語等のメタデータ
でエクスポートできたはずなので、sed等でセパレータ後にタグ前置、次いでセパレータを改行に置換すれば大体おんなじ構造
下の方見るとpythonの辞書(ハッシュ実装)も受け付けるようなので、もしパフォーマンスに不満があれば次に試すと良さそう
https://puszcza.gnu.org.ua/software/dico/manual/dico.html#outline
PDICクライアントは
見出し セパーレータ テキスト(改行等エスケープ) セパレータ 関連語等のメタデータ
でエクスポートできたはずなので、sed等でセパレータ後にタグ前置、次いでセパレータを改行に置換すれば大体おんなじ構造
下の方見るとpythonの辞書(ハッシュ実装)も受け付けるようなので、もしパフォーマンスに不満があれば次に試すと良さそう
2021/05/22(土) 11:03:27.84
あー
descriptionとinfoタグは辞書についてのもので、項目はヘッダと本文のみ、メタデータは対応してないか
まあ本文に含めてしまって、逆引きで代替できると思う…
descriptionとinfoタグは辞書についてのもので、項目はヘッダと本文のみ、メタデータは対応してないか
まあ本文に含めてしまって、逆引きで代替できると思う…
2021/05/22(土) 11:18:26.85
>>391
> PID把握して/proc以下のfdに書き込む必要あるのか
え?そんなことできるんか?
/proc以下のファイルは調べることが出来るわけで
そんなこと出来たら不正なデータをインジェクションできてしまう気がするんだが
> PID把握して/proc以下のfdに書き込む必要あるのか
え?そんなことできるんか?
/proc以下のファイルは調べることが出来るわけで
そんなこと出来たら不正なデータをインジェクションできてしまう気がするんだが
399398
2021/05/22(土) 11:22:16.30 マジか・・・。できたわw
400398
2021/05/22(土) 11:23:12.33 あー、でもprocが必要だからmacOSじゃ無理?
401398
2021/05/22(土) 11:31:23.11 あ、勘違いっぽい。こんな感じで1〜10の頭に>をつけて出力させてる間に
seq 10 | { echo $BASHPID; while read a; do echo "> $a"; sleep 5; done; }
他の端末から echo aaa > /proc/<PID>/fd/1 ってやったら
確かに 1〜10 の間に出力が割り込まれたけど頭に>はついていなかった
seq 10 | { echo $BASHPID; while read a; do echo "> $a"; sleep 5; done; }
他の端末から echo aaa > /proc/<PID>/fd/1 ってやったら
確かに 1〜10 の間に出力が割り込まれたけど頭に>はついていなかった
2021/05/22(土) 11:33:56.66
>>398
プラットフォームによって違うと思うけど、ubuntuなら/proc/PID/fd/0|1|2、何だったかのunixではstdin|out|errが各プロセスのfile descriptorへのシムリンクになってるはず(/dev以下、/tmpとか)
自分の起動したプロセスなら当然rw権限はある、無ければそもそも入出力できないよ
システムに関わるデーモンなんかはroot権限で走ってるはずなので、セキュリティ的に問題は起きない
プラットフォームによって違うと思うけど、ubuntuなら/proc/PID/fd/0|1|2、何だったかのunixではstdin|out|errが各プロセスのfile descriptorへのシムリンクになってるはず(/dev以下、/tmpとか)
自分の起動したプロセスなら当然rw権限はある、無ければそもそも入出力できないよ
システムに関わるデーモンなんかはroot権限で走ってるはずなので、セキュリティ的に問題は起きない
403398
2021/05/22(土) 11:40:45.06 連投ごめん。標準入力のファイルディスクリプタは0だった
んで、すこし変えてこんなふうにして実行してみたんだけど
for i in $(seq 10); do sleep 5; echo "$i"; done | { echo $BASHPID; while read a; do echo "> $a"; sleep 5; done; }
本当に他端末から出力の間に割り込ませられたよ・・・
seq 10 してるから 10 個の数字が出力されると思いきや
それ以上の適当な文字を出力させられる。
これセキュリティ的に大丈夫なん?
んで、すこし変えてこんなふうにして実行してみたんだけど
for i in $(seq 10); do sleep 5; echo "$i"; done | { echo $BASHPID; while read a; do echo "> $a"; sleep 5; done; }
本当に他端末から出力の間に割り込ませられたよ・・・
seq 10 してるから 10 個の数字が出力されると思いきや
それ以上の適当な文字を出力させられる。
これセキュリティ的に大丈夫なん?
404398
2021/05/22(土) 11:44:28.31 うーん、自分しか読み書きできないから大丈夫・・・なのか?
それにしてもコマンドの出力結果の間に出力を割り込ませられるとはwww
それにしてもコマンドの出力結果の間に出力を割り込ませられるとはwww
2021/05/22(土) 11:52:44.59
echo helloでコンソールに文字が出るのも、キーボードから入力できるのも、ファイルをディスクに書き出すのも、シェルが暗黙のうちにそのデバイスファイル群を繋ぎ合わせてる結果
なんら特別な事じゃないよ
なんら特別な事じゃないよ
406398
2021/05/22(土) 11:57:08.22 proc使えば別プロセスの環境変数も読み込める・・・と思ったら起動時の環境変数か。
ってことは別プロセスから新たに子プロセスを起動すれば
まあいろいろできそうだけど、どっちみちprocが必要なんだよな
>>405
それはそうだけどproc=カーネルがあるプロセスの情報を
他のプロセスに公開してるからできることだよね?
macOSとかはprocがないから、内部的にはデバイスファイル郡を
つなぎ合わせていたとしてもそれが他のプロセスからは見れないはず
いずれにしろPOSIX標準ではなさそう
ってことは別プロセスから新たに子プロセスを起動すれば
まあいろいろできそうだけど、どっちみちprocが必要なんだよな
>>405
それはそうだけどproc=カーネルがあるプロセスの情報を
他のプロセスに公開してるからできることだよね?
macOSとかはprocがないから、内部的にはデバイスファイル郡を
つなぎ合わせていたとしてもそれが他のプロセスからは見れないはず
いずれにしろPOSIX標準ではなさそう
2021/05/22(土) 12:12:52.06
そもそもカーネルやシステム中核プロセスが不可視であるべき、ってのは常識なのか?
ディレクトリの閲覧権限はxとwで制限できるから、そりゃ隠れてるのも居るかもしれないけどさ
Macは使わないので分からんが、windowsだってタスクマネージャ開けばユーザー権限で干渉不可なシステムプロセスがゾロゾロ動いてるの見えるけど
ディレクトリの閲覧権限はxとwで制限できるから、そりゃ隠れてるのも居るかもしれないけどさ
Macは使わないので分からんが、windowsだってタスクマネージャ開けばユーザー権限で干渉不可なシステムプロセスがゾロゾロ動いてるの見えるけど
2021/05/22(土) 12:37:32.55
OpenBSDでは5.7からprocfsは削除された
https://www.openbsd.org/plus57.html
> Deleted procfs (always suffered from race conditions and is now unused).
procfsを削除しました(常に競合状態に悩まされ、現在は使用されていません)
https://www.openbsd.org/plus57.html
> Deleted procfs (always suffered from race conditions and is now unused).
procfsを削除しました(常に競合状態に悩まされ、現在は使用されていません)
2021/05/22(土) 12:40:36.82
UNIXの全てがファイルという考えは面白かったが
本当に全てがファイルであるというは正しい考えなのだろうか?
本当に全てがファイルであるというは正しい考えなのだろうか?
2021/05/22(土) 12:58:05.17
読み書き出来るならファイルと見做せるんじゃね
環境変数なんかは読み書きできるけどファイルじゃないね
cpuは一応procにcpuinfoあるけど、別にフルアクセスできるわけじゃなし形だけね
lsofやpsで情報が得られるが、lsでアクセスできないならファイルとして抽象化されていない、でいいのかな(procfsが無いならlsできない、でいいの?)
それならOSのレベルで抽象化しなくても、シェルのレベルでファイルシステムのように見せる事もできる
windowsがそうだ)
cmdの振る舞いを見るとOSレベルでの一貫性は皆無だけど、pwshからはプロセス、レジストリ、環境変数まで全部ファイルシステムとして読み書きできるわけで
環境変数なんかは読み書きできるけどファイルじゃないね
cpuは一応procにcpuinfoあるけど、別にフルアクセスできるわけじゃなし形だけね
lsofやpsで情報が得られるが、lsでアクセスできないならファイルとして抽象化されていない、でいいのかな(procfsが無いならlsできない、でいいの?)
それならOSのレベルで抽象化しなくても、シェルのレベルでファイルシステムのように見せる事もできる
windowsがそうだ)
cmdの振る舞いを見るとOSレベルでの一貫性は皆無だけど、pwshからはプロセス、レジストリ、環境変数まで全部ファイルシステムとして読み書きできるわけで
2021/05/22(土) 13:02:29.53
> (procfsが無いならlsできない、でいいの?)
無理やりlsで表示させるんじゃなくて
別の形のコマンドを作るべきじゃなかったのか?ということ
無理やりlsで表示させるんじゃなくて
別の形のコマンドを作るべきじゃなかったのか?ということ
2021/05/22(土) 15:40:34.99
>>408
race conditionって具体的に何だろ、デバイスファイルに読み書き競合、あるいは排他制御でブロッキング頻発か
event pollみたいな仕組みはlinux固有だっけ?
どう上手くやろうがfdのやりくりをする方式はスケーラブルじゃないと思ってる
多重I/Oでパフォーマンス向上とか言ってOSに過剰なfd要求コール送り続けてるんだから
race conditionって具体的に何だろ、デバイスファイルに読み書き競合、あるいは排他制御でブロッキング頻発か
event pollみたいな仕組みはlinux固有だっけ?
どう上手くやろうがfdのやりくりをする方式はスケーラブルじゃないと思ってる
多重I/Oでパフォーマンス向上とか言ってOSに過剰なfd要求コール送り続けてるんだから
2021/05/22(土) 17:08:31.51
>>412
たぶん情報を取得したが取得中にリアルタイムで情報が変わってしまい
矛盾した情報になってしまったとかじゃね?
もしくは複数のファイルから取得した情報が矛盾してしまうとか
情報を取得してからそれを利用するまでの間に時間があるから
取得した情報が信用できないというのは当然として少なくとも取得した時点では
それらの情報は矛盾しないようにスナップショットである必要がある
たぶん情報を取得したが取得中にリアルタイムで情報が変わってしまい
矛盾した情報になってしまったとかじゃね?
もしくは複数のファイルから取得した情報が矛盾してしまうとか
情報を取得してからそれを利用するまでの間に時間があるから
取得した情報が信用できないというのは当然として少なくとも取得した時点では
それらの情報は矛盾しないようにスナップショットである必要がある
2021/05/22(土) 22:12:21.51
例えば歯抜け連番名ファイルを詰めて連番にする場合
for f in renban* ; do
mv $f 新ファイル名
done
とやると、該当ファイルが0個でもループ内の mv を実行しようとしてエラーになります。
ループ前に該当ファイルの有無のチェックが不要な方法はないでしょうか?
for f in renban* ; do
mv $f 新ファイル名
done
とやると、該当ファイルが0個でもループ内の mv を実行しようとしてエラーになります。
ループ前に該当ファイルの有無のチェックが不要な方法はないでしょうか?
2021/05/22(土) 22:12:33.00
2021/05/22(土) 22:35:09.95
>>414
たぶんrenban*がfに入るってるよね
モダンなシェルならsetで好きな挙動選べるよ
(bashならnullglobとかglobfailとか)
ただ、わざわざその一文の為にオプションいじくるよりは普通にチェックした方がいいと思うよ
たまにおまじない書き忘れて頭ひねったりするから
たぶんrenban*がfに入るってるよね
モダンなシェルならsetで好きな挙動選べるよ
(bashならnullglobとかglobfailとか)
ただ、わざわざその一文の為にオプションいじくるよりは普通にチェックした方がいいと思うよ
たまにおまじない書き忘れて頭ひねったりするから
2021/05/23(日) 06:00:13.67
こんな感じかなあ?
set -- renban*
[ $# -eq 1 ] && [ ! -e "$1" ] && set --
for f in "$@"; do
mv $f 新ファイル名
done
でもまあ、ファイル名一覧を取得してからmvしてる間に
ファイルが別プロセスによって消されてリすることがあるから
どちらにしろmvがエラーになる可能性はあるんだよね
set -- renban*
[ $# -eq 1 ] && [ ! -e "$1" ] && set --
for f in "$@"; do
mv $f 新ファイル名
done
でもまあ、ファイル名一覧を取得してからmvしてる間に
ファイルが別プロセスによって消されてリすることがあるから
どちらにしろmvがエラーになる可能性はあるんだよね
2021/05/23(日) 10:42:49.61
ls renban* | while read f;do mv $f 新ファイル名; done
だとループには入らないけど、ファイルがないときにlsがエラー吐くねw
find -maxdepth 1 -name "*.csv" | while read f;mv $f 新ファイル名;done
これでどう?w
> ファイルが別プロセスによって消されてリすることがあるから
↑もちろんこの問題は避けられないけどね。
だとループには入らないけど、ファイルがないときにlsがエラー吐くねw
find -maxdepth 1 -name "*.csv" | while read f;mv $f 新ファイル名;done
これでどう?w
> ファイルが別プロセスによって消されてリすることがあるから
↑もちろんこの問題は避けられないけどね。
2021/05/23(日) 10:45:47.34
どうせワンタイムだろうしあんまり細かいこと気にしてるとハゲるぞー
といいつつ
もしrenbanが何万にものぼるとして、globしてからmvに取り掛かるまでの時間差が気になるんだったら
findに-name 'renban*'を処理させ、アクションの逐次実行を指定する;を渡せば隙は(ほぼ)ないはず
-exec {} target$suffix \;
+を渡すと速いけどバッチ処理だからglobとおんなじ
といいつつ
もしrenbanが何万にものぼるとして、globしてからmvに取り掛かるまでの時間差が気になるんだったら
findに-name 'renban*'を処理させ、アクションの逐次実行を指定する;を渡せば隙は(ほぼ)ないはず
-exec {} target$suffix \;
+を渡すと速いけどバッチ処理だからglobとおんなじ
2021/05/23(日) 10:55:53.30
>>419
find -maxdepth 1 -name "renban*" -exec mv {} 新ファイル名 \;
かw
そうだね、それが正解だw
(なんでもパイプで渡してしまう悪いくせを晒してしまった…w)
find -maxdepth 1 -name "renban*" -exec mv {} 新ファイル名 \;
かw
そうだね、それが正解だw
(なんでもパイプで渡してしまう悪いくせを晒してしまった…w)
2021/05/23(日) 10:57:03.17
>>418
スルーしてほしいってのが要望のようだけど、対象指定をミスったなら失敗する方が健全だと思います
スルーしてほしいってのが要望のようだけど、対象指定をミスったなら失敗する方が健全だと思います
2021/05/23(日) 11:15:08.17
>>421
まあ、依頼主の要望を可能な限り叶えたまでさ。
あとは好みと状況でどちらでもお好きな方をw
ただ、この場合lsでやっつけてるけど、本当はlsの出力はそんなにあてにして
いいものではないので、気をつけて。
いろんな意味でfind -execの方が正統だよ。
まあ、依頼主の要望を可能な限り叶えたまでさ。
あとは好みと状況でどちらでもお好きな方をw
ただ、この場合lsでやっつけてるけど、本当はlsの出力はそんなにあてにして
いいものではないので、気をつけて。
いろんな意味でfind -execの方が正統だよ。
423419
2021/05/23(日) 12:19:18.50 shのglobはソート済みが保証されてたと思うけど、findはどうだったか自信がない…
誰か試せる人補足よろしく
誰か試せる人補足よろしく
2021/05/23(日) 13:00:38.86
ソートしてから逐次実行してるんなら期待してたアトミック性は無いねー
2021/05/23(日) 13:14:58.68
>>423
findはディスクに忠実にファイルシステム上の順番だね。
そして、globは確かにソートされてるようだ。
ちなみにlsもソートされるし、それはオプションで変えられる、と。
一応、環境書いとくと、Fedora33のbashにて
findはディスクに忠実にファイルシステム上の順番だね。
そして、globは確かにソートされてるようだ。
ちなみにlsもソートされるし、それはオプションで変えられる、と。
一応、環境書いとくと、Fedora33のbashにて
2021/05/23(日) 13:36:53.66
2021/05/23(日) 13:40:34.27
globかlsのたypoです
2021/05/24(月) 02:05:05.30
414です
回答ありがとうございます。
ループ前チェックは何だか美しくないように思えたので(個人の感想です)
0個なら即doneに移る方法はないものかとお尋ねした次第です。
0個でも一度はループに入るという仕様が続いているのはきっと何か意味があるのでしょうね。
回答ありがとうございます。
ループ前チェックは何だか美しくないように思えたので(個人の感想です)
0個なら即doneに移る方法はないものかとお尋ねした次第です。
0個でも一度はループに入るという仕様が続いているのはきっと何か意味があるのでしょうね。
2021/05/24(月) 08:05:21.35
ループじゃなくて*の展開の仕様だよ
合理的に考えれば、展開を指示してマッチ無しならば0件にヒットしたとして何も返さないか空文字
展開が失敗したと考えてエラーのどちらかだろう
多分深い意味はないから気にすんな
合理的に考えれば、展開を指示してマッチ無しならば0件にヒットしたとして何も返さないか空文字
展開が失敗したと考えてエラーのどちらかだろう
多分深い意味はないから気にすんな
2021/05/24(月) 08:08:28.58
いや気にしなきゃだめか
ココがヘンだよbshくらいの気持ちで構えてれば、案外可愛く思えてくるぞ
ココがヘンだよbshくらいの気持ちで構えてれば、案外可愛く思えてくるぞ
431名無しさん@お腹いっぱい。
2021/05/24(月) 09:50:48.812021/05/24(月) 10:20:26.93
lsとglobがソートされるってどこに書いてあったっけ?
前に見た気がするけど英語の中から探すのめんどいw
前に見た気がするけど英語の中から探すのめんどいw
2021/05/24(月) 10:48:30.44
globで見つからなかった時、検索した文字列を返すのは
おそらく安全側に倒したからだと思ってるんだがいい例が思いつかないな
例えばcmd renban* hoge.tar.gzだったら普通は引数が2個以上になると思うが
見つからない時cmd hoge.tar.gzとなって危険とか
もしくはエラーメッセージをわかりやすく出すのが目的だったりするのかな?
空ディレクトリでls renban*を実行した時
「renban*」という文字列を返せば、エラーメッセージは分かりやすい
> ls: 'renban*' にアクセスできません: そのようなファイルやディレクトリはありません
空文字を返せば、エラーメッセージは分かりにくい
> ls: '' にアクセスできません: そのようなファイルやディレクトリはありません
何も返さなければ、何も表示せず正常終了
・・・あ、これかw
空ディレクトリでない(file1 file2 file3というファイルが有る)場合renban*が
何も返さないとlsが実行されるからfile1 file2 file3と表示されるんだ
renbanなんたらを処理しようとしてるのに、関係ないファイルを処理してしまう。
おそらく安全側に倒したからだと思ってるんだがいい例が思いつかないな
例えばcmd renban* hoge.tar.gzだったら普通は引数が2個以上になると思うが
見つからない時cmd hoge.tar.gzとなって危険とか
もしくはエラーメッセージをわかりやすく出すのが目的だったりするのかな?
空ディレクトリでls renban*を実行した時
「renban*」という文字列を返せば、エラーメッセージは分かりやすい
> ls: 'renban*' にアクセスできません: そのようなファイルやディレクトリはありません
空文字を返せば、エラーメッセージは分かりにくい
> ls: '' にアクセスできません: そのようなファイルやディレクトリはありません
何も返さなければ、何も表示せず正常終了
・・・あ、これかw
空ディレクトリでない(file1 file2 file3というファイルが有る)場合renban*が
何も返さないとlsが実行されるからfile1 file2 file3と表示されるんだ
renbanなんたらを処理しようとしてるのに、関係ないファイルを処理してしまう。
2021/05/24(月) 20:33:55.32
一つでもあればループ内を実行して、(それ以上)無ければ抜ける。
だから、(最初から)無ければそのまま抜けて欲しいな、と。
該当するものが無いのだからループ内を実行するのは無意味だし。
だから、(最初から)無ければそのまま抜けて欲しいな、と。
該当するものが無いのだからループ内を実行するのは無意味だし。
435名無しさん@お腹いっぱい。
2021/06/06(日) 22:14:34.25 標準出力の速度を制限したり、通信速度を表示するコマンドを探しています。どなたか知りませんか?
2021/06/07(月) 00:11:53.58
>>435
pvコマンド(Pipe Viewer)でどうよ
pvコマンド(Pipe Viewer)でどうよ
437名無しさん@お腹いっぱい。
2021/06/07(月) 11:25:09.09438名無しさん@お腹いっぱい。
2021/06/15(火) 00:01:20.06 sed の 's/foo/bar/'
スラッシュ直前の【s】って何の意味でしょうか?
g:global
i:ignore
のような意味ありますか?
またman以外でこのような略語を調べるサイトなどありますでしょうか?
スラッシュ直前の【s】って何の意味でしょうか?
g:global
i:ignore
のような意味ありますか?
またman以外でこのような略語を調べるサイトなどありますでしょうか?
2021/06/15(火) 00:58:11.44
440名無しさん@お腹いっぱい。
2021/06/15(火) 01:15:20.43 >>439
ありがとうございます
ありがとうございます
2021/06/15(火) 11:14:03.04
edコマンドで気になってるのはv
versed subst?
でもversedって多分古語だしなあ…
exec grep -v "$@"にvrepと名付けることにした
versed subst?
でもversedって多分古語だしなあ…
exec grep -v "$@"にvrepと名付けることにした
2021/06/15(火) 15:03:29.77
>>441
grep の -v は --invert-match だから inVert substitute じゃねーの?
grep の -v は --invert-match だから inVert substitute じゃねーの?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【速報】 山上徹也被告が謝罪 「何の恨みもありません。非常に申し訳ないことをした」 [お断り★]
- 中国外務省「絶対に受け入れない」改めて撤回求める 台湾有事めぐる高市総理の「政府の立場に変更なし」との答弁に対し [ぐれ★]
- 芸人・永野が断言 令和が「1」なら昭和は「100楽しかった」「夢いっぱいだった」★2 [muffin★]
- NVIDIA幹部「日本、もうロボット大国ではない」 AIで一変 ★2 [少考さん★]
- 外国人の日本国籍取得を厳格化へ 居住期間「10年以上」で検討 [どどん★]
- 「Fラン大卒より高卒」企業人事部が断言する🧐"定着率"と"成長力"の明確な差 [パンナ・コッタ★]
- 【実況】博衣こよりのえちえちMIMESIS🏴‍☠🐏🎪🧪★4
- 【悲報】タイミーさんの個人情報、セックスよりレイプがしたい願望があるエンジニアが覗き放題だった…高市タイミーに行政指導しろ [517791167]
- メモリー(DDR5)16GB×2枚が9万4780円😱 [175344491]
- 【悲報】数百万人の弱者男性を集団発狂させた伝説の婚活女子(36)、顔面開示wwwwwwwwwwwwwwwww [483447288]
- 【悲報】中国製ネコ型ロボット、高性能すぎて日本製だと勘違いする高市キッズたちwwwwwww [834922174]
- 天音かなたそ😇🪽の思い出を語ろう🏡
