1 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/08/02(木) 05:22:16.82 .net] シェルスクリプトの総合スレです。 □お約束 ・特記なき場合は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 にまとめられています 最新の仕様はこちらへ pubs.opengroup.org/onlinepubs/9699919799/ (左上の「Shell & Utilities」 から参照することができます。) ・v7 shに一番近くて、現役(?)のshは、OpenSolaris由来のheirloom sh。 src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆうな □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも awkまたはperlの方が適した
364 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/21(金) 22:16:12.19 .net] 英辞郎くらいなら適当に整形してgrepで引いてるな、5秒くらいかかるが… 毎回読み込まず、&で起動して配列抱えたままsleep、named pipeをポーリングてもらうか
365 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/21(金) 22:31:20.56 .net] 前から舐めるから時間かかってるだけだな、見出し語辞書引きなら既にソートされてるので人力二分探索が楽か イニシャルでファイルを8つくらいに分け、引数見て探すファイルを割り振るだけで十分一秒切れる
366 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/21(金) 23:18:21.57 .net] >>354 >>356 問題はメモリ(連想配列)に載せた後 1件のデータを引いたら、そのまま終了してメモリを破棄するしかない つまり1件検索する毎に全データを連想配列に読み込むw
367 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/21(金) 23:19:33.97 .net] >>358 普通にSQLiteでも使ったほうが良いのでは?w
368 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/21(金) 23:33:05.93 .net] >>354 > シェルスクリプトは連想配列が使えるから原理的には高速 モダンな言語で連想配列使えない言語ってそんなにないと思うが
369 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 00:00:45.90 .net] POSIX準拠だと連想配列ないけどねw eval使えばそれっぽいことはできるけど
370 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 00:17:17.67 .net] >>357 一つのプログラムを常駐させ、もう一つのプログラムから問い合わせるってこと? それってシェルスクリプトだけで実現できるの?
371 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 02:03:30.66 .net] >>360 普段はdico(d)とかdict(d)使ってるよ、この用途には特化してる分sqlite3なんかより遥かに高速で優れてる ただ、自前の辞書に索引付けてdictのdbに変換…ってのは面倒なんだよ 英和の出来合いdbってdict.orgとかでも提供されてないしな テキスト形式の単一辞書(~100MB)をgrep、数秒のラグなら十分許容できるだろう 取り敢えず事足りればいいんだよって思想です
372 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 02:08:46.46 .net] >>363 デーモンなんかの実装は大体そうでしょ mkfifoでファイルのように読み書きできるパイプ作れるでしょ? 無限whileループの中で1秒程度sleep、パイプに書き込まれてるかreadでチェック(所謂原始的なポーリング)
373 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 02:29:18.62 .net] 追伸>>365 プロセスの関係について答えてなかった クライエントがコマンドライン引数を単にnamed pipeへ書き込むだけのシェルスクリプトでいいです というか必須でないです ぶっちゃけやることはecho query >fifo それを$eiji queryと書けると分かりやすいというだけですね
374 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 02:36:55.49 .net] 老婆心かもしれないけど、常駐シェルスクリプトなんて何ら特別なものでないよ 常駐しないシェルスクリプト=exitの記述が存在している、あるいはeofに達するもの 常駐できるシェルスクリプト=signalやらで殺さなければexit/eofに達しないモノです
375 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 02:44:59.50 .net] shを常用するやつは居るが 流石にed常用するやつは居らんな
376 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 02:59:57.65 .net] edは生の改行文字食わせる必要あるし、sedのように;で区切れないから、コマンドラインから使いにくい… printf %s\\n cmd1 cmd2 ...をeasyedとか名付けておけば、easyed cmd1 cmd2 ...で使いやすくなるね ただ、sedやawkでカウンタ設定して何行後の処理を指定するような処理を書いている事に気づいたら、そういう処理はedの領分 前後の相対アドレスを+nのように簡潔に指定
377 名前:ナきる あと、diffがedのコードを吐けるというのもあって、それをテンプレにして弄るとバッチ的な処理はより早く書けると思う [] [ここ壊れてます]
378 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 05:16:06.47 .net] >>366 問題はデーモン側じゃないよ。 起動するのも、named pipeに書き込むのもそれはできる 問題は、その後どうやって情報を受け取るのか?って話
379 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 05:16:37.76 .net] × 起動するのも ○ 常駐するのも
380 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 05:19:29.71 .net] もっと具体的に言えば、POSIX準拠だと シェルスクリプトは双方向パイプを使えない
381 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 06:08:57.28 .net] そこは似非精進の生臭坊主で行こう
382 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 06:15:51.15 .net] >>358 > イニシャルでファイルを8つくらいに分け、引数見て探すファイルを割り振るだけで十分一秒切れる 前方一致検索ならそれでもいいと思うけど、中間一致や全文検索だと結局すべてのファイルをgrepしないといけない SQLiteなら全文検索もあるようだ ytyaru.hatena (ドット)com/entry/2017/07/19/000000 >>364 > ただ、自前の辞書に索引付けてdictのdbに変換…ってのは面倒なんだよ インデックスつけるのが面倒なんでしょ? SQLiteならテーブル作ってデータを入れていくだけだよ
383 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 06:20:59.68 .net] >>374 原理主義者周辺にはNoSQLってこだわりがある。
384 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 07:32:30.98 .net] 原理主義者はNoSQLに何を使ってんの?
385 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 07:33:00.54 .net] MongoDBとか?
386 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 07:58:28.04 .net] 使えるならnamed pipeが行儀良いと思うけど、ポーリングさせるならただのファイルでも環境変数でも何でもいいんでね あんまりSSDへ頻繁に書き込みたくないなら環境変数か 個人コマンドラインツールで一秒で返ってくれば問題ないという要件なら、ファイル分割で必要十分だろ メモリも今時100MBくらい一時占めるのは有りだとしても、常駐させるとなるとチリツモ
387 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 08:03:33.44 .net] >>378 いや、ファイルや環境変数を使うというのはどうでも良くて それらをどう使って実現するのか?って話だよ。 あなた、自動運転を実現するにはどうしたら良いか?って言う話に AIを使えばできるんです。みたいなことしか言ってないよw
388 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 08:04:29.68 .net] 定期的に読みに行けばいいだけじゃないの?
389 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 08:05:46.31 .net] > 個人コマンドラインツールで一秒で返ってくれば問題ないという要件なら 個人用途であれば、その程度でも構わないってことには反論はしないけどね C10K問題(クライアント1万台問題)が発生するような場合には、それじゃ使い物にならないけど
390 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 08:08:59.98 .net] >>380 もしかして 1. コマンド実行 2. 特定のディレクトリにファイルを作る 3. デーモンが1秒おきにそのディレクトリを監視している 4. デーモンはファイルを見つけたら処理をして新しく結果ファイルを作る 5. 1のコマンドは結果ファイルができるまで待ってて見つけたらその内容を表示する って話?
391 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 08:10:30.45 .net] この方法だと環境変数は無理っぽいな
392 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 08:12:00.68 .net] ・パイプで繋ぐと早い。 ・標準入力を<でリダイレクトするより、パイプを通じてcatで流し込んだ方が早い。 経典に書いてあるw
393 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 08:17:10.40 .net] 一つのnamed pipeに複数プロセスから同時に書き込んでも データは混ざらないんだっけ?
394 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 08:18:16.07 .net] 手動で排他制御せなあかんやろ
395 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 08:20:44.48 .net] ああ、ロックファイル使うのかw
396 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 08:37:55.55 .net] デーモンがメモリにデータを蓄えておくって 原理主義者的にはどうなんだろう?w
397 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 08:47:09.09 .net] >>382 おれはそう解釈するけど 結果もクエリも数行だろうから、環境変数の方がいい 標準sleepは1s単位なので微妙に要件満たせないけど、適当な代替コマンド用意できないなら2秒になってしまうが… msec sleep便利よ サーバスクリプトは$queryを1s sleepしながらループしてチェック、空で無ければクリアして検索に入り、$responseに書き出す 検索時間をa-zの26ファイルに分けて検索時間を1/26~0.1s程度にまで削減、コードも頭文字とファイル名に整合が取れて短くなるだろう フォアグラウンドのクライアント側は$query設定して1s sleep、(既に設定されているはずの)$responseを標準出力へ書き出す 完了フラグ立てるとか面倒な事やるのはシェルスクリプトの領分超えてると思うわ $responseが空ならエラー吐いて落とす 何回か走らせてみて、時間は適宜調整で決め打ちが楽だろう
398 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 08:51:16.35 .net] 古典技術ポーリング
399 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 09:05:22.83 .net] >>389 > 結果もクエリも数行だろうから、環境変数の方がいい いやいや環境変数は子プロセスには伝搬するけど デーモンとコマンドのように親子関係にないでは やり取りできないんだよ
400 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 09:07:41.80 .net] ダサいけどtmpファイルか
401 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 09:07:47.64 .net] > サーバスクリプトは$queryを1s sleepしながらループしてチェック、空で無ければクリアして検索に入り、$responseに書き出す なんつーかシェル変数(環境変数)をグローバル変数とでも勘違いしてるような書き方だな サーバースクリプトが$responseに書き出しても それは他のプロセスからは見えないんだよ
402 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 09:15:02.13 .net] > 検索時間をa-zの26ファイルに分けて検索時間を1/26~0.1s程度にまで削減、コードも頭文字とファイル名に整合が取れて短くなるだろう それだと中間一致には対応できない
403 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 09:27:09.09 .net] >>393 たしかに クライエントから起動するわけじゃないから、コマンド置換やsourceも使えないし、PID把握して/proc以下のfdに書き込む必要あるのか readするって言ってる>>365 の方が多分俺より賢いな 面倒だからやっぱ一時ファイルで…
404 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 09:33:01.34 .net] 直接の親にならdeclareの拡張や文字列evalシェル関数で書き換えられるけど、兄弟の環境は変える手段無いのか
405 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 09:40:41.97 .net] 兄弟でもメインループの中でexport hoge=hageをファイルに書き出して互いにsourceすれば共有できるぞ 結局一時ファイル作ることになるから、それを許容するなら全部一時ファイルでやり取りするか、 それを嫌うならpsでPID特定して直接リダイレクト
406 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 09:43:36.67 .net] シェルスクリプトでTCPとかUDPとかどうです旦那
407 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 10:40:20.45 .net] シェルスクリプトから離れてごめんだけど、dicodはちゃんとした辞書形式(索引-シーク位置)にコンパイルしなくても受け付けてくれたはずだよ、dictは使ってないので分からん emacsの何とか形式ってやつがマニュアルに記載あったはず、単なる見出し+テキストのプレーンテキスト マニュアルが激しく読みにくいけどsedあたりで頑張ってみたら まあ索引付けないならgrepより速くなる保証もないわけだけど 曖昧検索や部分一致、逆引き、履歴等々色々高度な事もできるので、例え遅くてもやる価値はあるかと
408 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 10:54:30.10 .net] これね https://puszcza.gnu.org.ua/software/dico/manual/dico.html#outline PDICクライアントは 見出し セパーレータ テキスト(改行等エスケープ) セパレータ 関連語等のメタデータ でエクスポートできたはずなので、sed等でセパレータ後にタグ前置、次いでセパレータを改行に置換すれば大体おんなじ構造 下の方見るとpythonの辞書(ハッシュ実装)も受け付けるようなので、もしパフォーマンスに不満があれば次に試すと良さそう
409 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 11:03:27.84 .net] あー descriptionとinfoタグは辞書についてのもので、項目はヘッダと本文のみ、メタデータは対応してないか まあ本文に含めてしまって、逆引きで代替できると思う…
410 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 11:18:26.85 .net] >>395 > PID把握して/proc以下のfdに書き込む必要あるのか え?そんなことできるんか? /proc以下のファイルは調べることが出来るわけで そんなこと出来たら不正なデータをインジェクションできてしまう気がするんだが
411 名前:398 mailto:sage [2021/05/22(土) 11:22:16.30 .net] マジか・・・。できたわw
412 名前:398 mailto:sage [2021/05/22(土) 11:23:12.33 .net] あー、でもprocが必要だからmacOSじゃ無理?
413 名前:398 mailto:sage [2021/05/22(土) 11:31:23.11 .net] あ、勘違いっぽい。こんな感じで1〜10の頭に>をつけて出力させてる間に seq 10 | { echo $BASHPID; while read a; do echo "> $a"; sleep 5; done; } 他の端末から echo aaa > /proc/<PID>/fd/1 ってやったら 確かに 1〜10 の間に出力が割り込まれたけど頭に>はついていなかった
414 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 11:33:56.66 .net] >>402 プラットフォームによって違うと思うけど、ubuntuなら/proc/PID/fd/0|1|2、何だったかのunixではstdin|out|errが各プロセスのfile descriptorへのシムリンクになってるはず(/dev以下、/tmpとか) 自分の起動したプロセスなら当然rw権限はある、無ければそもそも入出力できないよ システムに関わるデーモンなんかはroot権限で走ってるはずなので、セキュリティ的に問題は起きない
415 名前:398 mailto:sage [2021/05/22(土) 11:40:45.06 .net] 連投ごめん。標準入力のファイルディスクリプタは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 個の数字が出力されると思いきや それ以上の適当な文字を出力させられる。 これセキュリティ的に大丈夫なん?
416 名前:398 mailto:sage [2021/05/22(土) 11:44:28.31 .net] うーん、自分しか読み書きできないから大丈夫・・・なのか? それにしてもコマンドの出力結果の間に出力を割り込ませられるとはwww
417 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 11:52:44.59 .net] echo helloでコンソールに文字が出るのも、キーボードから入力できるのも、ファイルをディスクに書き出すのも、シェルが暗黙のうちにそのデバイスファイル群を繋ぎ合わせてる結果 なんら特別な事じゃないよ
418 名前:398 mailto:sage [2021/05/22(土) 11:57:08.22 .net] proc使えば別プロセスの環境変数も読み込める・・・と思ったら起動時の環境変数か。 ってことは別プロセスから新たに子プロセスを起動すれば まあいろいろできそうだけど、どっちみちprocが必要なんだよな >>409 それはそうだけどproc=カーネルがあるプロセスの情報を 他のプロセスに公開してるからできることだよね? macOSとかはprocがないから、内部的にはデバイスファイル郡を つなぎ合わせていたとしてもそれが他のプロセスからは見れないはず いずれにしろPOSIX標準ではなさそう
419 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 12:12:52.06 .net] そもそもカーネルやシステム中核プロセスが不可視であるべき、ってのは常識なのか? ディレクトリの閲覧権限はxとwで制限できるから、そりゃ隠れてるのも居るかもしれないけどさ Macは使わないので分からんが、windowsだってタスクマネージャ開けばユーザー権限で干渉不可なシステムプロセスがゾロゾロ動いてるの見えるけど
420 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 12:37:32.55 .net] OpenBSDでは5.7からprocfsは削除された https://www.openbsd.org/plus57.html > Deleted procfs (always suffered from race conditions and is now unused). procfsを削除しました(常に競合状態に悩まされ、現在は使用されていません)
421 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 12:40:36.82 .net] UNIXの全てがファイルという考えは面白かったが 本当に全てがファイルであるというは正しい考えなのだろうか?
422 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 12:58:05.17 .net] 読み書き出来るならファイルと見做せるんじゃね 環境変数なんかは読み書きできるけどファイルじゃないね cpuは一応procにcpuinfoあるけど、別にフルアクセスできるわけじゃなし形だけね lsofやpsで情報が得られるが、lsでアクセスできないならファイルとして抽象化されていない、でいいのかな(procfsが無いならlsできない、でいいの?) それならOSのレベルで抽象化しなくても、シェルのレベルでファイルシステムのように見せる事もできる windowsがそうだ) cmdの振る舞いを見るとOSレベルでの一貫性は皆無だけど、pwshからはプロセス、レジストリ、環境変数まで全部ファイルシステムとして読み書きできるわけで
423 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 13:02:29.53 .net] > (procfsが無いならlsできない、でいいの?) 無理やりlsで表示させるんじゃなくて 別の形のコマンドを作るべきじゃなかったのか?ということ
424 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 15:40:34.99 .net] >>412 race conditionって具体的に何だろ、デバイスファイルに読み書き競合、あるいは排他制御でブロッキング頻発か event pollみたいな仕組みはlinux固有だっけ? どう上手くやろうがfdのやりくりをする方式はスケーラブルじゃないと思ってる 多重I/Oでパフォーマンス向上とか言ってOSに過剰なfd要求コール送り続けてるんだから
425 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 17:08:31.51 .net] >>416 たぶん情報を取得したが取得中にリアルタイムで情報が変わってしまい 矛盾した情報になってしまったとかじゃね? もしくは複数のファイルから取得した情報が矛盾してしまうとか 情報を取得してからそれを利用するまでの間に時間があるから 取得した情報が信用できないというのは当然として少なくとも取得した時点では それらの情報は矛盾しないようにスナップショットである必要がある
426 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 22:12:21.51 .net] 例えば歯抜け連番名ファイルを詰めて連番にする場合 for f in renban* ; do mv $f 新ファイル名 done とやると、該当ファイルが0個でもループ内の mv を実行しようとしてエラーになります。 ループ前に該当ファイルの有無のチェックが不要な方法はないでしょうか?
427 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 22:12:33.00 .net] >>416 懐しいw pollがSVRで、BSDがselectってやつかな?w Linuxは両方使えたが、少くとも昔のLinuxカーネルでは実装はほぼ同じだったけどな…
428 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/22(土) 22:35:09.95 .net] >>418 たぶんrenban*がfに入るってるよね モダンなシェルならsetで好きな挙動選べるよ (bashならnullglobとかglobfailとか) ただ、わざわざその一文の為にオプションいじくるよりは普通にチェックした方がいいと思うよ たまにおまじない書き忘れて頭ひねったりするから
429 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/23(日) 06:00:13.67 .net] こんな感じかなあ? set -- renban* [ $# -eq 1 ] && [ ! -e "$1" ] && set -- for f in "$@"; do mv $f 新ファイル名 done でもまあ、ファイル名一覧を取得してからmvしてる間に ファイルが別プロセスによって消されてリすることがあるから どちらにしろmvがエラーになる可能性はあるんだよね
430 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/23(日) 10:42:49.61 .net] ls renban* | while read f;do mv $f 新ファイル名; done だとループには入らないけど、ファイルがないときにlsがエラー吐くねw find -maxdepth 1 -name "*.csv" | while read f;mv $f 新ファイル名;done これでどう?w > ファイルが別プロセスによって消されてリすることがあるから ↑もちろんこの問題は避けられないけどね。
431 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/23(日) 10:45:47.34 .net] どうせワンタイムだろうしあんまり細かいこと気にしてるとハゲるぞー といいつつ もしrenbanが何万にものぼるとして、globしてからmvに取り掛かるまでの時間差が気になるんだったら findに-name 'renban*'を処理させ、アクションの逐次実行を指定する;を渡せば隙は(ほぼ)ないはず -exec {} target$suffix \; +を渡すと速いけどバッチ処理だからglobとおんなじ
432 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/23(日) 10:55:53.30 .net] >>423 find -maxdepth 1 -name "renban*" -exec mv {} 新ファイル名 \; かw そうだね、それが正解だw (なんでもパイプで渡してしまう悪いくせを晒してしまった…w)
433 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/23(日) 10:57:03.17 .net] >>422 スルーしてほしいってのが要望のようだけど、対象指定をミスったなら失敗する方が健全だと思います
434 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/23(日) 11:15:08.17 .net] >>425 まあ、依頼主の要望を可能な限り叶えたまでさ。 あとは好みと状況でどちらでもお好きな方をw ただ、この場合lsでやっつけてるけど、本当はlsの出力はそんなにあてにして いいものではないので、気をつけて。 いろんな意味でfind -execの方が正統だよ。
435 名前:419 mailto:sage [2021/05/23(日) 12:19:18.50 .net] shのglobはソート済みが保証されてたと思うけど、findはどうだったか自信がない… 誰か試せる人補足よろしく
436 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/23(日) 13:00:38.86 .net] ソートしてから逐次実行してるんなら期待してたアトミック性は無いねー
437 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/23(日) 13:14:58.68 .net] >>427 findはディスクに忠実にファイルシステム上の順番だね。 そして、globは確かにソートされてるようだ。 ちなみにlsもソートされるし、それはオプションで変えられる、と。 一応、環境書いとくと、Fedora33のbashにて
438 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/23(日) 13:36:53.66 .net] >>429 ありがとう 探索ツールである性質上もしやと思ったらやっぱりそうか じゃあglob+ソートかlsだね 危なかった
439 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/23(日) 13:40:34.27 .net] globかlsのたypoです
440 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/24(月) 02:05:05.30 .net] 414です 回答ありがとうございます。 ループ前チェックは何だか美しくないように思えたので(個人の感想です) 0個なら即doneに移る方法はないものかとお尋ねした次第です。 0個でも一度はループに入るという仕様が続いているのはきっと何か意味があるのでしょうね。
441 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/24(月) 08:05:21.35 .net] ループじゃなくて*の展開の仕様だよ 合理的に考えれば、展開を指示してマッチ無しならば0件にヒットしたとして何も返さないか空文字 展開が失敗したと考えてエラーのどちらかだろう 多分深い意味はないから気にすんな
442 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/24(月) 08:08:28.58 .net] いや気にしなきゃだめか ココがヘンだよbshくらいの気持ちで構えてれば、案外可愛く思えてくるぞ
443 名前:名無しさん@お腹いっぱい。 [2021/05/24(月) 09:50:48.81 .net] >>423 > どうせワンタイムだろうしあんまり細かいこと気にしてるとハゲるぞー うっせーハゲ!
444 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/24(月) 10:20:26.93 .net] lsとglobがソートされるってどこに書いてあったっけ? 前に見た気がするけど英語の中から探すのめんどいw
445 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/24(月) 10:48:30.44 .net] 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なんたらを処理しようとしてるのに、関係ないファイルを処理してしまう。
446 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/05/24(月) 20:33:55.32 .net] 一つでもあればループ内を実行して、(それ以上)無ければ抜ける。 だから、(最初から)無ければそのまま抜けて欲しいな、と。 該当するものが無いのだからループ内を実行するのは無意味だし。
447 名前:名無しさん@お腹いっぱい。 [2021/06/06(日) 22:14:34.25 .net] 標準出力の速度を制限したり、通信速度を表示するコマンドを探しています。どなたか知りませんか?
448 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/06/07(月) 00:11:53.58 .net] >>439 pvコマンド(Pipe Viewer)でどうよ
449 名前:名無しさん@お腹いっぱい。 [2021/06/07(月) 11:25:09.09 .net] >>440 ありがとうございました!
450 名前:名無しさん@お腹いっぱい。 [2021/06/15(火) 00:01:20.06 .net] sed の 's/foo/bar/' スラッシュ直前の【s】って何の意味でしょうか? g:global i:ignore のような意味ありますか? またman以外でこのような略語を調べるサイトなどありますでしょうか?
451 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/06/15(火) 00:58:11.44 .net] >>442 substituteのs info sedより > 3.3 The s Command > The s command (as in substitute) is (略)
452 名前:名無しさん@お腹いっぱい。 [2021/06/15(火) 01:15:20.43 .net] >>443 ありがとうございます
453 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/06/15(火) 11:14:03.04 .net] edコマンドで気になってるのはv versed subst? でもversedって多分古語だしなあ… exec grep -v "$@"にvrepと名付けることにした
454 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/06/15(火) 15:03:29.77 .net] >>445 grep の -v は --invert-match だから inVert substitute じゃねーの?
455 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/07/28(水) 19:08:57.09 .net] _数字列_数字列_数字列_を含む文字列から先頭の数字列だけを取り出したいので 前段階としてそれより前の部分を切り出すために echo ${文字列%_*[0-9]_*[0-9]_*[0-9]_*} としてみたのですが、 aaa_bbb_ccc_ddd_eee_123_4_567_xxxxx_123yyy_4f6_789c_zzz の場合には aaa_bbb_ccc_ddd_eee ではなく aaa_bbb_ccc_ddd_eee_123 になってしまいます。 どうすればいいでしょうか?
456 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/07/28(水) 19:47:08.66 .net] どう言った用途に使うんでしょうかね
457 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/07/28(水) 21:32:13.47 .net] >>447 シェルの変数置換じゃなくて、sedで置換したほうがええやろ。 まっとうな正規表現が使えるしな。
458 名前:名無しさん@お腹いっぱい。 [2021/07/30(金) 07:50:18.18 .net] >>447 そうなるように書いていますけど?
459 名前:名無しさん@お腹いっぱい。 [2021/07/30(金) 07:51:44.84 .net] 彼はsubstringの概念がないんでしょうかね。
460 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/07/30(金) 08:39:43.50 .net] 任意個数の数字だけの塊をglobは表現できないので、お題の変換は無理
461 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/08/08(日) 22:00:16.40 .net] 書き込めるかテスト
462 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/08/08(日) 22:07:53.75 .net] >>447 こんな感じでいけるんでね?前段階の話すっ飛ばして答えだけど テストしてないので動かなくても知らん isnum() { case "$1" in *[!0-9]*) return 1 ;; *) return 0 ;; esac } str="aaa_bbb_ccc_ddd_eee_123_4_567_xxxxx_123yyy_4f6_789c_zzz" IFS="_" set -- $str while [ "$#" -gt 0 ]; do if isnum "$1" && isnum "$2" && isnum "$3"; then echo "$1" fi shift done
463 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/08/08(日) 22:24:57.80 .net] >>449 のいうように、sedで一行それも大したことない正規表現で済むな シェルスクリプトだけという課題の制限でもなければ
464 名前:名無しさん@お腹いっぱい。 mailto:sage [2021/08/09(月) 01:15:27.49 .net] シェルスクリプトで無理といった途端 シェルスクリプトの実装が出てきたんで 慌てて取り繕ったか?w