暇つぶし2chat UNIX
- 暇つぶし2ch298:名無しさん@お腹いっぱい。
21/04/14 16:39:38.83 .net
int main( int argc,char **argv){ printf("%s\n",argv[1]); return 0;}
みたいなプログラムを書いて
a.exe "abc xyz"
みたいに実行しても処理系によって出力が
"abc xyz"
だったり
abc xyz
だったり
"abc
だったり…そんな時代もあったね。

299:名無しさん@お腹いっぱい。
21/04/17 04:15:34.67 1C2XvsMVm
第一生命HD、副業解禁 約1万5000人対象
URLリンク(www.nikkei.com)
第一生命HD、副業解禁 1万5000人対象―大手生保初
URLリンク(www.jiji.com)
IHI、国内8000人の副業解禁 重厚長大企業も転機
URLリンク(www.nikkei.com)
IHI、社外兼業を解禁 社内副業もルール化
URLリンク(www.jiji.com)
50代に時給5000円の求人も。都会の会社員、“地方企業でリモート副業”が人気
URLリンク(nikkan-spa.jp)
「週休3日制」導入は拡大するのか? 働き方が多様化する社会で生き抜く力
URLリンク(news.yahoo.co.jp)
スカイマーク、週休3日制へ 来春にも事務職対象
URLリンク(www.chunichi.co.jp)
週休3日制で何が変わる?休みが増えるメリット・デメリット
URLリンク(career.joi.media)
週休3日制に賛成?反対? 東芝の模索
URLリンク(www.nhk.or.jp)

300:名無しさん@お腹いっぱい。
21/04/20 16:39:52.31 .net
SSDがいっぱいになってきたのでfind�


301:ナ各binを周りfileが吐いたリストをunstripped(だったか?)でgrep&stripするスクリプト書いた 半分くらいになるのなこれ… 今の所不具合は出てないからヨシ おすすめ



302:名無しさん@お腹いっぱい。
21/04/20 16:48:14.77 .net
>>290
ubuntuだけどbashからpwsh -cで便利なツールとして使うのがベスト
多少最適化されてそうなapt提供のプレコンパイル版でも60MiBあるから配布時依存に加えるのは厳しいのが悩み
私的ハックにはすごく重宝

303:名無しさん@お腹いっぱい。
21/04/20 16:53:51.68 .net
>>289
`をエスケープに選んだのは英断だと思う
m4と協調させようと思うと壊れるけど、まあm4のクオートは簡単に変えれるし満足

304:名無しさん@お腹いっぱい。
21/04/20 16:55:18.39 .net
>>295
golang製のバイナリってstripすると壊れるんじゃなかったっけ

305:名無しさん@お腹いっぱい。
21/04/20 17:07:12.66 .net
>>298
マジかー!でも何がgoとか把握してない…
内蔵HDDの方はテラ余裕なのでそっくりコピーしてある、万が一あってもそっちからブート&コマンド全て使えるから問題起きてからでもいいかな…

306:名無しさん@お腹いっぱい。
21/04/20 18:04:12.33 .net
学習コスト高そうだから何でも賢くキャストしてくれるキャスト器として使ってるわ
[xml]'<foo>...'くらいのカジュアルユース
年だからjqとか付いてけないしjsonもキャストして.付けてるタブ補完連打でアクセス
ただの型コレクションとして気兼ねなく使えばいい

307:名無しさん@お腹いっぱい。
21/04/21 20:07:40.11 .net
>>300
歳のせいにするな。お前の能力の問題だ。

308:名無しさん@お腹いっぱい。
21/04/21 22:14:14.03 .net
噂のpwsh試してみたけど、とりあえずコマンドライン作業中の電卓代わりにはpythonよりはいいな
子シェルだからパス通ってて、普通に演算子と数学関数が下拵え無しで使えるってだけだけど
64KBと打つと65536を返してくるのは遊び心かな?
まあスレ違いだねごめん

309:名無しさん@お腹いっぱい。
21/04/21 22:37:37.09 .net
電卓代わりでbc/dc思い出して遊ぼうと思ったら今時のlinuxにはdcはいってないのね
頭の体操にいいのに残念

310:名無しさん@お腹いっぱい。
21/04/22 09:18:28.19 .net
普通パッケージぐらいは用意されていて入れれば入るんじゃない?
deb系なら apt-get install dc で使える

311:名無しさん@お腹いっぱい。
21/04/22 18:02:08.57 .net
LLのREPL使えばええやん

312:名無しさん@お腹いっぱい。
21/04/25 11:29:37.47 .net
for i in "予定1" "予定2" "予定3"
do
[ $i = "予定1" ] && echo "予定1"; sleep 3
[ $i = "予定2" ] && echo "予定2"; sleep 3
[ $i = "予定3" ] && echo "予定3"; sleep 3
done

313:名無しさん@お腹いっぱい。
21/05/01 09:40:38.84 .net
今日のIDすごいwww

314:名無しさん@お腹いっぱい。
21/05/02 22:37:50.92 .net
しらんがなー

315:名無しさん@お腹いっぱい。
21/05/03 22:39:37.02 .net
シェルスクリプトはperl にとって代わるCGIの記述言語って本当すか?

316:名無しさん@お腹いっぱい。
21/05/04 00:29:14.02 .net
>>309
そもそもCGIはすでに廃れてるって知ってる?

317:名無しさん@お腹いっぱい。
21/05/04 00:30:10.82 .net
今どき本格的なサーバー側アプリをCGIで作るなんてないわけで
まあ簡単なツールぐらいならやるかもしれんけどさ

318:名無しさん@お腹いっぱい。
21/05/04 01:58:13.24 .net
>>311
知らんのだがCGI以外でどう処理してるの?ジャバスクリプト?

319:名無しさん@お腹いっぱい。
21/05/04 07:10:50.01 .net
>>312
WebアプリケーションフレームワークがWebサーバ機能を持っていて、フロントエンドのWebサーバからリバースプロキシして使うのが多いかな。
だからWebサーバとアプリケーションの接続インターフェイスと言う感じじゃ無いんよ。

320:名無しさん@お腹いっぱい。
21/05/04 17:00:00.58 .net
えっ、そうなの?
perlじゃ無くCGIがオワコンで、マトモwebサービス作成にはもう使われ無いのね。

321:名無しさん@お腹いっぱい。
21/05/06 02:07:50.66 .net
perl自体がオワコンかどうかの話は別として歴史の話をすると
初期はウェブサーバー+perlスクリプト、つまりCGIでウェブシステムが作られていた
もう2000年とかその頃の話よ。とほほのなんとかとかKentなんとかとかが幅を利かせていた
当時のプロ(ホームページ制作会社)でもそういったCGIを使っていた時代
その後はPHPが登場したが、これはウェブサーバーにPHPをモジュールとして組み込む
mod_phpが利用されていた。アクセスのたびにperlスクリプトを呼び出さないから速い
同じようにmod_perlというのもあった。
この頃のプロといえば自社でサーバーを保守管理するウェブサービス会社だったかな
その後から現在はアプリ自身でウェブサーバーとして起動するようになった
RailsとかPythonとかはそれが主。もちろんphpでもperlでもこの仕組が使える
クラウドの時代のプロのシステムはほぼこれ。もちろん今もホームページ制作会社はあるけど
ウェブサービス作ってる会社ってもうこんな感じじゃないでしょ?
アプリにウェブサーバーが内蔵されてると言っても、それはアプリに最適化されていて
静的コンテンツを配信するのには適していないから
>>313のいうように前段に普通のウェブサーバー(nginxやapache)を配置して
アプリ用のURLだけリバースプロキシでWebフレームワークにわたす仕組み
シェルスクリプトは、ブラウザにモジュールとして組み込んだり
シェルスクリプト自身をウェブサーバーにすることはできないからCGIオンリーで使うしか無い
と思ったらmod_bashなんてあるのなw
まあアクセス数が少ない個人用のシステムとか、特定のサーバーからアクセスしない
死活監視用のエンドポイント程度になら使っても良いんじゃね?

322:名無しさん@お腹いっぱい。
21/05/06 11:37:17.18 .net
ネタかなんかなの?このくだり

323:名無しさん@お腹いっぱい。
21/05/07 04:02:34.96 .net
いや、マジレスだろ。

324:名無しさん@お腹いっぱい。
21/05/07 09:52:15.00 .net
時系列はおかしいけども、仕組みとしては大体合ってるし、いいんじゃない?

325:名無しさん@お腹いっぱい。
21/05/08 11:58:10.94 .net
間違ってると言うやつほど
どこが間違っているかを言わない

326:名無しさん@お腹いっぱい。
21/05/08 19:01:34.99 .net
しかしこれは CGI が使われなくなったと言われれば違和感はある Web サーバーがリバースプロキシに変化してアプリが Web サーバーを持ったに過ぎないのだろう
CGI とは Web サーバーから実行ファイルを走らせる技術だよね違うのかな

327:名無しさん@お腹いっぱい。
21/05/09 02:29:54.79 .net
>>320
アプリケーションにHTTPヘッダを環境変数で渡す方法などを定めたものがCGI、だからInterfaceなの。
この方法で渡していないならそれはCGIではない。

328:名無しさん@お腹いっぱい。
21/05/09 08:40:11.68 .net
もともとリバースプロキシの機能はウェブサーバーにあったのだから
どちらかと言えばウェブサーバーをリバースプロキシだけに使うように
使い方が変化してって言う方が適切だね
ちなみに開発時だとウェブサーバーはあまり使わない
ウェブサーバーとしての機能や性能は必要ないので
アプリ内臓の簡易ウェブサーバー機能で十分だから

329:名無しさん@お腹いっぱい。
21/05/09 08:52:57.10 .net
>>320
> CGI とは Web サーバーから実行ファイルを走らせる技術だよね違うのかな
一番の違いはアプリが常駐しているかどうか
CGIはアプリが常駐して無くてアクセスのたびにコマンドを実行する
このコマンドを実行するっていうのはかなり重い処理なのでパフォーマンスが出ない
特にシェルスクリプトなんか外部のコマンドを組み合わせて処理するものだから
1アクセスでシェルスクリプト本体の実行の他に
sedコマンド+grepコマンド+awkコマンド+jqコマンド・・・みたいになるから
Perlで作るよりも確実にパフォーマンスが悪くなる。Perlよりも悪い選択
それに対してCGIじゃない仕組みはサーバーマシン起動時に1回コマンドを起動するだけ
もし誰かに、これからのCGIはシェルスクリプト!シェルスクリプトでもこれだけの速度が出る!って
郵便番号から住所を検索するデモをみせてシェルスクリプトでシステム開発させようと洗脳する組織団体にそそのかされていたら
それアクセスが多い時にパフォーマンス出ますか?他の言語とベンチマークして比較していいですか?って聞いたら良いよ
郵便番号のデータなんてたかだか十数MBしかないしSSD使ってりゃ0.01秒未満で読み込めるのは当たり前
そんな低負荷なデモを数回見せた程度でパフォーマンスの検証なんてできやしない

330:名無しさん@お腹いっぱい。
21/05/09 11:14:52.20 .net
>>323
fastcgiってcgiと呼んじゃダメなん?

331:名無しさん@お腹いっぱい。
21/05/09 11:52:38.01 .net
>>324
FastCGIはCGIの環境変数や標準入出力の内容をカプセル化してsocketで通信するように定められているから無関係ではないんだけど、
環境変数とか標準入出力を使っているわけじゃないからやはりCGIでは無いと思うよ。

332:名無しさん@お腹いっぱい。
21/05/09 14:19:11.63 .net
そういやFastCGIなんて技術もあったな
あれも「プロセス起動が遅い」という問題を
プロセス終了をさせずにプロセスを使い回すことで
解決する技術なんだよな
シェルスクリプトでそれがやれるかっつーと無理だろうな
いやwikiによればURLリンク(ja.wikipedia.org)
名前付きパイプもサポートしてるようだからから不可能じゃないのか?
でもまあシェルスクリプトから呼び出すコマンドは
どちらにしろプロセス起動になるわけで
シェルスクリプトで全部実装するならまだしも
普通のシェルスクリプトではあまり効果がないだろうな

333:名無しさん@お腹いっぱい。
21/05/09 14:26:02.10 .net
英語だし読む気はないけどなんかそういう技術があるみたいだw
FastCGI shell script
URLリンク(stackoverflow.com)
ここの Look at "Writing agents in sh: conversing through a pipe"
まあ一般的にシェルスクリプトでFastCGIは無理(無意味)やでって書かれてるようだね

334:名無しさん@お腹いっぱい。
21/05/09 14:40:26.25 .net
んでさ>>309に聞きたいんだけど
> シェルスクリプトはperl にとって代わるCGIの記述言語って本当すか?
ってどういう流れで誰に聞いたの?
二十年ぐらい前にコンピューターにちょっと詳しいだけの高校生や大学生の
会話で出てきた話だってのならわかるけどさ
今のウェブ開発ではCGIという単語自体でてこない

335:名無しさん@お腹いっぱい。
21/05/14 08:14:28.21 .net
>>328
年寄りと話すと、API叩くことをCGI呼び出すと表現するよ

336:名無しさん@お腹いっぱい。
21/05/17 12:58:38.74 .net
アクセス数が少なければ今でもcgiで十分。

337:名無しさん@お腹いっぱい。
21/05/17 19:57:40.30 .net
アクセス数少ないのが前提w

338:名無しさん@お腹いっぱい。
21/05/17 21:14:15.17 .net
知り合いだけのサイトもありますし

339:名無しさん@お腹いっぱい。
21/05/18 00:26:19.32 .net
>>332
仕事では使い物にならないって意味だよ

340:名無しさん@お腹いっぱい。
21/05/18 00:27:32.81 .net
レガシーシステムの改修でもないかぎりCGIなんて出てこないし
新規でCGIとかいい出したら、そんな会社は切り捨てた方が良い

341:名無しさん@お腹いっぱい。
21/05/18 09:35:06.09 .net
PHP fpm ってよく使われてるように思うけど技術的には Fast CGI なんでしょ?

342:名無しさん@お腹いっぱい。
21/05/18 12:12:30.96 .net
cgiスレになって無いか?

343:名無しさん@お腹いっぱい。
21/05/18 14:51:57.87 .net
0埋めした2桁数字文字をdeclare -iの変数に入れると時々エラーになるので
ぐぐったら0埋め


344:数字は8進数扱いって、何か面倒だなぁ...



345:名無しさん@お腹いっぱい。
21/05/18 16:12:30.34 .net
頭0は8進数ってC言語とか昔から使われてるけど
最近の言語は頭0を8進数とみなさないように変わってきてる気がするね
2桁とわかってるならdeclare -i i="${var#0}"でいけるよ
そうでない場合はdeclare -i i="10#$var"でいけるかな
bash以外だとダメかもしれんけど

346:名無しさん@お腹いっぱい。
21/05/19 02:39:42.52 .net
ありがとうございます。
expr でどうにか凌ぎました。

347:名無しさん@お腹いっぱい。
21/05/19 09:22:05.13 .net
exprは遅いぞ

348:名無しさん@お腹いっぱい。
21/05/19 09:42:12.88 .net
遅いけど、どんな環境でも

349:名無しさん@お腹いっぱい。
21/05/19 10:08:35.53 .net
だからexprに一切メリットないって

350:名無しさん@お腹いっぱい。
21/05/19 18:39:51.53 .net
計算するときにコンソールで expr 以外に何か良い方法ありますか

351:名無しさん@お腹いっぱい。
21/05/19 18:40:31.58 .net
$((1+2)、bc、dc
なんでもあるやろ

352:名無しさん@お腹いっぱい。
21/05/19 22:49:05.88 .net
awkで計算しろ

353:名無しさん@お腹いっぱい。
21/05/20 08:04:37.20 .net
>>328
シェルスクリプトでCGIとかきくとユニケージを思い出すな
あ、脱ケージだっけwww
あれほど酷い開発手法はないと思うね

354:名無しさん@お腹いっぱい。
21/05/20 09:04:51.56 .net
>>346
いや、あれオモロいで。
ワンライナー繋げてwebアプリ。
小規模社内オフィス用に最適w

355:名無しさん@お腹いっぱい。
21/05/20 09:10:53.80 .net
誰かPOSIX原理主義者とユニケージの関係教えてくれ

356:名無しさん@お腹いっぱい。
21/05/20 10:27:21.13 .net
どちらも秘密主義だからな。俺も少し興味があるが
非公開の独自技術には興味なくて裏で糸を引いているやつらに興味がある
wikipediaを見る限りUSP研究所と金沢大学が手を組んでるっぽい
USP研究所がユニケージという開発手法で怪しげなビジネスをしていて
それにコネかなんかで金沢大学が手を貸して箔をつけてる感じ
もしくは金沢大学関係者が作ったのがUSP研究所なのかもな
POSIX原理主義者はUSP研究所もしくは金沢大学の関係者だと思われる
構成員の中の幹部クラスで多分3人ぐらいしかいない
ただ引っかかるのはユニケージとPOSIX原理主義が矛盾しているという点
POSIX原理主義はPOSIXのコマンドだけを使うと言ってるがユニケージは独自コマンドを押し付けている
ユニケージ=シェルスクリプト主義でそこから分岐したのが原理主義なのかもしれないな

357:名無しさん@お腹いっぱい。
21/05/20 10:30:31.60 .net
>>347
ネタとしてのオモロイだなw
東京ハンズで大規模対応でクラウドに移行して
それに対応できなくなって今では闇とか負債と言われてるんだっけな
URLリンク(www.hands-lab.com)
ここにはBashのフレームワークってかいてあるな
BashってことはやっぱりPOSIX原理主義とも違うな

358:名無しさん@お腹いっぱい。
21/05/20 11:00:28.58 .net
>>350
完全菜食と牛乳、卵は許すのような違いか。
ユニケージにベンダーロックインされて地獄を見るw
大規模化の可能性のある場合は、このネタシステムを使ってはいけないな。

359:名無しさん@お腹いっぱい。
21/05/20 11:19:43.21 .net
POSIX原理主義者「シェルスクリプトは遅くない!なぜなら郵便番号から住所を検索なんで一瞬で探せる!」
※CSVファイルは解凍した状態でたったの12MBです。
どんだけ小規模低負荷前提で吠えてるのかとw

360:名無しさん@お腹いっぱい。
21/05/20 16:03:03.24 .net
sql文を組み立てるシェルスクリプトを書きます

361:名無しさん@お腹いっぱい。
21/05/21 21:36:49.34 .net
シェルスクリプトは連想配列が使えるから
原理的には高速
オーバーヘッドがない分
他の言語より早い場合が多いと思う
保守しにくいけど

362:名無しさん@お腹いっぱい。
21/05/21 21:43:40.33 .net
オーバーヘッドって何のことだ?

363:名無しさん@お腹いっぱい。
21/05/21 22:08:05.49 .net
ファイルサイズに依存するオーバーヘッドはメモリ上に載せる部分じゃろ?
全部載せてしまえば定数時間のはずだけど、上限とかなかったっけ
載せないで逐次処理なら固定長レコード上に添字でジャンプのデータベースには勝てない
載せても多分勝てないけど

364:名無しさん@お腹いっぱい。
21/05/21 22:16:12.19 .net
英辞郎くらいなら適当に整形してgrepで引いてるな、5秒くらいかかるが…
毎回読み込まず、&で起動して配列抱えたままsleep、named pipeをポーリングてもらうか

365:名無しさん@お腹いっぱい。
21/05/21 22:31:20.56 .net
前から舐めるから時間かかってるだけだな、見出し語辞書引きなら既にソートされてるので人力二分探索が楽か
イニシャルでファイルを8つくらいに分け、引数見て探すファイルを割り振るだけで十分一秒切れる

366:名無しさん@お腹いっぱい。
21/05/21 23:18:21.57 .net
>>354 >>356
問題はメモリ(連想配列)に載せた後
1件のデータを引いたら、そのまま終了してメモリを破棄するしかない
つまり1件検索する毎に全データを連想配列に読み込むw

367:名無しさん@お腹いっぱい。
21/05/21 23:19:33.97 .net
>>358
普通にSQLiteでも使ったほうが良いのでは?w

368:名無しさん@お腹いっぱい。
21/05/21 23:33:05.93 .net
>>354
> シェルスクリプトは連想配列が使えるから原理的には高速
モダンな言語で連想配列使えない言語ってそんなにないと思うが

369:名無しさん@お腹いっぱい。
21/05/22 00:00:45.90 .net
POSIX準拠だと連想配列ないけどねw
eval使えばそれっぽいことはできるけど

370:名無しさん@お腹いっぱい。
21/05/22 00:17:17.67 .net
>>357
一つのプログラムを常駐させ、もう一つのプログラムから問い合わせるってこと?
それってシェルスクリプトだけで実現できるの?

371:名無しさん@お腹いっぱい。
21/05/22 02:03:30.66 .net
>>360
普段はdico(d)とかdict(d)使ってるよ、この用途には特化してる分sqlite3なんかより遥かに高速で優れてる
ただ、自前の辞書に索引付けてdictのdbに変換…ってのは面倒なんだよ
英和の出来合いdbってdict.orgとかでも提供されてないしな
テキスト形式の単一辞書(~100MB)をgrep、数秒のラグなら十分許容できるだろう
取り敢えず事足りればいいんだよって思想です

372:名無しさん@お腹いっぱい。
21/05/22 02:08:46.46 .net
>>363
デーモンなんかの実装は大体そうでしょ
mkfifoでファイルのように読み書きできるパイプ作れるでしょ?
無限whileループの中で1秒程度sleep、パイプに書き込まれてるかreadでチェック(所謂原始的なポーリング)

373:名無しさん@お腹いっぱい。
21/05/22 02:29:18.62 .net
追伸>>365
プロセスの関係について答えてなかった
クライエントがコマンドライン引数を単にnamed pipeへ書き込むだけのシェルスクリプトでいいです
というか必須でないです
ぶっちゃけやることはecho query >fifo
それを$eiji queryと書けると分かりやすいというだけですね

374:名無しさん@お腹いっぱい。
21/05/22 02:36:55.49 .net
老婆心かもしれないけど、常駐シェルスクリプトなんて何ら特別なものでないよ
常駐しないシェルスクリプト=exitの記述が存在している、あるいはeofに達するもの
常駐できるシェルスクリプト=signalやらで殺さなければexit/eofに達しないモノです

375:名無しさん@お腹いっぱい。
21/05/22 02:44:59.50 .net
shを常用するやつは居るが
流石にed常用するやつは居らんな

376:名無しさん@お腹いっぱい。
21/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:名無しさん@お腹いっぱい。
21/05/22 05:16:06.47 .net
>>366
問題はデーモン側じゃないよ。
起動するのも、named pipeに書き込むのもそれはできる
問題は、その後どうやって情報を受け取るのか?って話

379:名無しさん@お腹いっぱい。
21/05/22 05:16:37.76 .net
× 起動するのも
○ 常駐するのも

380:名無しさん@お腹いっぱい。
21/05/22 05:19:29.71 .net
もっと具体的に言えば、POSIX準拠だと
シェルスクリプトは双方向パイプを使えない

381:名無しさん@お腹いっぱい。
21/05/22 06:08:57.28 .net
そこは似非精進の生臭坊主で行こう

382:名無しさん@お腹いっぱい。
21/05/22 06:15:51.15 .net
>>358
> イニシャルでファイルを8つくらいに分け、引数見て探すファイルを割り振るだけで十分一秒切れる
前方一致検索ならそれでもいいと思うけど、中間一致や全文検索だと結局すべてのファイルをgrepしないといけない
SQLiteなら全文検索もあるようだ
URLリンク(ytyaru.hatena)(ドット)com/entry/2017/07/19/000000
>>364
> ただ、自前の辞書に索引付けてdictのdbに変換…ってのは面倒なんだよ
インデックスつけるのが面倒なんでしょ?
SQLiteならテーブル作ってデータを入れていくだけだよ

383:名無しさん@お腹いっぱい。
21/05/22 06:20:59.68 .net
>>374
原理主義者周辺にはNoSQLってこだわりがある。

384:名無しさん@お腹いっぱい。
21/05/22 07:32:30.98 .net
原理主義者はNoSQLに何を使ってんの?

385:名無しさん@お腹いっぱい。
21/05/22 07:33:00.54 .net
MongoDBとか?

386:名無しさん@お腹いっぱい。
21/05/22 07:58:28.04 .net
使えるならnamed pipeが行儀良いと思うけど、ポーリングさせるならただのファイルでも環境変数でも何でもいいんでね
あんまりSSDへ頻繁に書き込みたくないなら環境変数か
個人コマンドラインツールで一秒で返ってくれば問題ないという要件なら、ファイル分割で必要十分だろ
メモリも今時100MBくらい一時占めるのは有りだとしても、常駐させるとなるとチリツモ

387:名無しさん@お腹いっぱい。
21/05/22 08:03:33.44 .net
>>378
いや、ファイルや環境変数を使うというのはどうでも良くて
それらをどう使って実現するのか?って話だよ。
あなた、自動運転を実現するにはどうしたら良いか?って言う話に
AIを使えばできるんです。みたいなことしか言ってないよw

388:名無しさん@お腹いっぱい。
21/05/22 08:04:29.68 .net
定期的に読みに行けばいいだけじゃないの?

389:名無しさん@お腹いっぱい。
21/05/22 08:05:46.31 .net
> 個人コマンドラインツールで一秒で返ってくれば問題ないという要件なら
個人用途であれば、その程度でも構わないってことには反論はしないけどね
C10K問題(クライアント1万台問題)が発生するような場合には、それじゃ使い物にならないけど

390:名無しさん@お腹いっぱい。
21/05/22 08:08:59.98 .net
>>380
もしかして
1. コマンド実行
2. 特定のディレクトリにファイルを作る
3. デーモンが1秒おきにそのディレクトリを監視している
4. デーモンはファイルを見つけたら処理をして新しく結果ファイルを作る
5. 1のコマンドは結果ファイルができるまで待ってて見つけたらその内容を表示する
って話?

391:名無しさん@お腹いっぱい。
21/05/22 08:10:30.45 .net
この方法だと環境変数は無理っぽいな

392:名無しさん@お腹いっぱい。
21/05/22 08:12:00.68 .net
・パイプで繋ぐと早い。
・標準入力を<でリダイレクトするより、パイプを通じてcatで流し込んだ方が早い。
経典に書いてあるw

393:名無しさん@お腹いっぱい。
21/05/22 08:17:10.40 .net
一つのnamed pipeに複数プロセスから同時に書き込んでも
データは混ざらないんだっけ?

394:名無しさん@お腹いっぱい。
21/05/22 08:18:16.07 .net
手動で排他制御せなあかんやろ

395:名無しさん@お腹いっぱい。
21/05/22 08:20:44.48 .net
ああ、ロックファイル使うのかw

396:名無しさん@お腹いっぱい。
21/05/22 08:37:55.55 .net
デーモンがメモリにデータを蓄えておくって
原理主義者的にはどうなんだろう?w

397:名無しさん@お腹いっぱい。
21/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:名無しさん@お腹いっぱい。
21/05/22 08:51:16.35 .net
古典技術ポーリング

399:名無しさん@お腹いっぱい。
21/05/22 09:05:22.83 .net
>>389
> 結果もクエリも数行だろうから、環境変数の方がいい
いやいや環境変数は子プロセスには伝搬するけど
デーモンとコマンドのように親子関係にないでは
やり取りできないんだよ

400:名無しさん@お腹いっぱい。
21/05/22 09:07:41.80 .net
ダサいけどtmpファイルか

401:名無しさん@お腹いっぱい。
21/05/22 09:07:47.64 .net
> サーバスクリプトは$queryを1s sleepしながらループしてチェック、空で無ければクリアして検索に入り、$responseに書き出す
なんつーかシェル変数(環境変数)をグローバル変数とでも勘違いしてるような書き方だな
サーバースクリプトが$responseに書き出しても
それは他のプロセスからは見えないんだよ

402:名無しさん@お腹いっぱい。
21/05/22 09:15:02.13 .net
> 検索時間をa-zの26ファイルに分けて検索時間を1/26~0.1s程度にまで削減、コードも頭文字とファイル名に整合が取れて短くなるだろう
それだと中間一致には対応できない

403:名無しさん@お腹いっぱい。
21/05/22 09:27:09.09 .net
>>393
たしかに
クライエントから起動するわけじゃないから、コマンド置換やsourceも使えないし、PID把握して/proc以下のfdに書き込む必要あるのか
readするって言ってる>>365の方が多分俺より賢いな
面倒だからやっぱ一時ファイルで…

404:名無しさん@お腹いっぱい。
21/05/22 09:33:01.34 .net
直接の親にならdeclareの拡張や文字列evalシェル関数で書き換えられるけど、兄弟の環境は変える手段無いのか

405:名無しさん@お腹いっぱい。
21/05/22 09:40:41.97 .net
兄弟でもメインループの中でexport hoge=hageをファイルに書き出して互いにsourceすれば共有できるぞ
結局一時ファイル作ることになるから、それを許容するなら全部一時ファイルでやり取りするか、
それを嫌うならpsでPID特定して直接リダイレクト

406:名無しさん@お腹いっぱい。
21/05/22 09:43:36.67 .net
シェルスクリプトでTCPとかUDPとかどうです旦那

407:名無しさん@お腹いっぱい。
21/05/22 10:40:20.45 .net
シェルスクリプトから離れてごめんだけど、dicodはちゃんとした辞書形式(索引-シーク位置)にコンパイルしなくても受け付けてくれたはずだよ、dictは使ってないので分からん
emacsの何とか形式ってやつがマニュアルに記載あったはず、単なる見出し+テキストのプレーンテキスト
マニュアルが激しく読みにくいけどsedあたりで頑張ってみたら
まあ索引付けないならgrepより速くなる保証もないわけだけど
曖昧検索や部分一致、逆引き、履歴等々色々高度な事もできるので、例え遅くてもやる価値はあるかと

408:名無しさん@お腹いっぱい。
21/05/22 10:54:30.10 .net
これね
URLリンク(puszcza.gnu.org.ua)
PDICクライアントは
見出し セパーレータ テキスト(改行等エスケープ) セパレータ 関連語等のメタデータ
でエクスポートできたはずなので、sed等でセパレータ後にタグ前置、次いでセパレータを改行に置換すれば大体おんなじ構造
下の方見るとpythonの辞書(ハッシュ実装)も受け付けるようなので、もしパフォーマンスに不満があれば次に試すと良さそう

409:名無しさん@お腹いっぱい。
21/05/22 11:03:27.84 .net
あー
descriptionとinfoタグは辞書についてのもので、項目はヘッダと本文のみ、メタデータは対応してないか
まあ本文に含めてしまって、逆引きで代替できると思う…

410:名無しさん@お腹いっぱい。
21/05/22 11:18:26.85 .net
>>395
> PID把握して/proc以下のfdに書き込む必要あるのか
え?そんなことできるんか?
/proc以下のファイルは調べることが出来るわけで
そんなこと出来たら不正なデータをインジェクションできてしまう気がするんだが

411:398
21/05/22 11:22:16.30 .net
マジか・・・。できたわw

412:398
21/05/22 11:23:12.33 .net
あー、でもprocが必要だからmacOSじゃ無理?

413:398
21/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:名無しさん@お腹いっぱい。
21/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
21/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
21/05/22 11:44:28.31 .net
うーん、自分しか読み書きできないから大丈夫・・・なのか?
それにしてもコマンドの出力結果の間に出力を割り込ませられるとはwww

417:名無しさん@お腹いっぱい。
21/05/22 11:52:44.59 .net
echo helloでコンソールに文字が出るのも、キーボードから入力できるのも、ファイルをディスクに書き出すのも、シェルが暗黙のうちにそのデバイスファイル群を繋ぎ合わせてる結果
なんら特別な事じゃないよ

418:398
21/05/22 11:57:08.22 .net
proc使えば別プロセスの環境変数も読み込める・・・と思ったら起動時の環境変数か。
ってことは別プロセスから新たに子プロセスを起動すれば
まあいろいろできそうだけど、どっちみちprocが必要なんだよな
>>409
それはそうだけどproc=カーネルがあるプロセスの情報を
他のプロセスに公開してるからできることだよね?
macOSとかはprocがないから、内部的にはデバイスファイル郡を
つなぎ合わせていたとしてもそれが他のプロセスからは見れないはず
いずれにしろPOSIX標準ではなさそう

419:名無しさん@お腹いっぱい。
21/05/22 12:12:52.06 .net
そもそもカーネルやシステム中核プロセスが不可視であるべき、ってのは常識なのか?
ディレクトリの閲覧権限はxとwで制限できるから、そりゃ隠れてるのも居るかもしれないけどさ
Macは使わないので分からんが、windowsだってタスクマネージャ開けばユーザー権限で干渉不可なシステムプロセスがゾロゾロ動いてるの見えるけど

420:名無しさん@お腹いっぱい。
21/05/22 12:37:32.55 .net
OpenBSDでは5.7からprocfsは削除された
URLリンク(www.openbsd.org)
> Deleted procfs (always suffered from race conditions and is now unused).
procfsを削除しました(常に競合状態に悩まされ、現在は使用されていません)

421:名無しさん@お腹いっぱい。
21/05/22 12:40:36.82 .net
UNIXの全てがファイルという考えは面白かったが
本当に全てがファイルであるというは正しい考えなのだろうか?

422:名無しさん@お腹いっぱい。
21/05/22 12:58:05.17 .net
読み書き出来るならファイルと見做せるんじゃね
環境変数なんかは読み書きできるけどファイルじゃないね
cpuは一応procにcpuinfoあるけど、別にフルアクセスできるわけじゃなし形だけね
lsofやpsで情報が得られるが、lsでアクセスできないならファイルとして抽象化されていない、でいいのかな(procfsが無いならlsできない、でいいの?)
それならOSのレベルで抽象化しなくても、シェルのレベルでファイルシステムのように見せる事もできる
windowsがそうだ)
cmdの振る舞いを見るとOSレベルでの一貫性は皆無だけど、pwshからはプロセス、レジストリ、環境変数まで全部ファイルシステムとして読み書きできるわけで

423:名無しさん@お腹いっぱい。
21/05/22 13:02:29.53 .net
> (procfsが無いならlsできない、でいいの?)
無理やりlsで表示させるんじゃなくて
別の形のコマンドを作るべきじゃなかったのか?ということ

424:名無しさん@お腹いっぱい。
21/05/22 15:40:34.99 .net
>>412
race conditionって具体的に何だろ、デバイスファイルに読み書き競合、あるいは排他制御でブロッキング頻発か
event pollみたいな仕組みはlinux固有だっけ?
どう上手くやろうがfdのやりくりをする方式はスケーラブルじゃないと思ってる
多重I/Oでパフォーマンス向上とか言ってOSに過剰なfd要求コール送り続けてるんだから

425:名無しさん@お腹いっぱい。
21/05/22 17:08:31.51 .net
>>416
たぶん情報を取得したが取得中にリアルタイムで情報が変わってしまい
矛盾した情報になってしまったとかじゃね?
もしくは複数のファイルから取得した情報が矛盾してしまうとか
情報を取得してからそれを利用するまでの間に時間があるから
取得した情報が信用できないというのは当然として少なくとも取得した時点では
それらの情報は矛盾しないようにスナップショットである必要がある

426:名無しさん@お腹いっぱい。
21/05/22 22:12:21.51 .net
例えば歯抜け連番名ファイルを詰めて連番にする場合
for f in renban* ; do
mv $f 新ファイル名
done
とやると、該当ファイルが0個でもループ内の mv を実行しようとしてエラーになります。
ループ前に該当ファイルの有無のチェックが不要な方法はないでしょうか?

427:名無しさん@お腹いっぱい。
21/05/22 22:12:33.00 .net
>>416
懐しいw
pollがSVRで、BSDがselectってやつかな?w
Linuxは両方使えたが、少くとも昔のLinuxカーネルでは実装はほぼ同じだったけどな…

428:名無しさん@お腹いっぱい。
21/05/22 22:35:09.95 .net
>>418
たぶんrenban*がfに入るってるよね
モダンなシェルならsetで好きな挙動選べるよ
(bashならnullglobとかglobfailとか)
ただ、わざわざその一文の為にオプションいじくるよりは普通にチェックした方がいいと思うよ
たまにおまじない書き忘れて頭ひねったりするから

429:名無しさん@お腹いっぱい。
21/05/23 06:00:13.67 .net
こんな感じかなあ?
set -- renban*
[ $# -eq 1 ] && [ ! -e "$1" ] && set --
for f in "$@"; do
mv $f 新ファイル名
done
でもまあ、ファイル名一覧を取得してからmvしてる間に
ファイルが別プロセスによって消されてリすることがあるから
どちらにしろmvがエラーになる可能性はあるんだよね

430:名無しさん@お腹いっぱい。
21/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:名無しさん@お腹いっぱい。
21/05/23 10:45:47.34 .net
どうせワンタイムだろうしあんまり細かいこと気にしてるとハゲるぞー
といいつつ
もしrenbanが何万にものぼるとして、globしてからmvに取り掛かるまでの時間差が気になるんだったら
findに-name 'renban*'を処理させ、アクションの逐次実行を指定する;を渡せば隙は(ほぼ)ないはず
-exec {} target$suffix \;
+を渡すと速いけどバッチ処理だからglobとおんなじ

432:名無しさん@お腹いっぱい。
21/05/23 10:55:53.30 .net
>>423
find -maxdepth 1 -name "renban*" -exec mv {} 新ファイル名 \;
かw
そうだね、それが正解だw
(なんでもパイプで渡してしまう悪いくせを晒してしまった…w)

433:名無しさん@お腹いっぱい。
21/05/23 10:57:03.17 .net
>>422
スルーしてほしいってのが要望のようだけど、対象指定をミスったなら失敗する方が健全だと思います

434:名無しさん@お腹いっぱい。
21/05/23 11:15:08.17 .net
>>425
まあ、依頼主の要望を可能な限り叶えたまでさ。
あとは好みと状況でどちらでもお好きな方をw
ただ、この場合lsでやっつけてるけど、本当はlsの出力はそんなにあてにして
いいものではないので、気をつけて。
いろんな意味でfind -execの方が正統だよ。

435:419
21/05/23 12:19:18.50 .net
shのglobはソート済みが保証されてたと思うけど、findはどうだったか自信がない…
誰か試せる人補足よろしく

436:名無しさん@お腹いっぱい。
21/05/23 13:00:38.86 .net
ソートしてから逐次実行してるんなら期待してたアトミック性は無いねー

437:名無しさん@お腹いっぱい。
21/05/23 13:14:58.68 .net
>>427
findはディスクに忠実にファイルシステム上の順番だね。
そして、globは確かにソートされてるようだ。
ちなみにlsもソートされるし、それはオプションで変えられる、と。
一応、環境書いとくと、Fedora33のbashにて

438:名無しさん@お腹いっぱい。
21/05/23 13:36:53.66 .net
>>429
ありがとう
探索ツールである性質上もしやと思ったらやっぱりそうか
じゃあglob+ソートかlsだね
危なかった

439:名無しさん@お腹いっぱい。
21/05/23 13:40:34.27 .net
globかlsのたypoです

440:名無しさん@お腹いっぱい。
21/05/24 02:05:05.30 .net
414です
回答ありがとうございます。
ループ前チェックは何だか美しくないように思えたので(個人の感想です)
0個なら即doneに移る方法はないものかとお尋ねした次第です。
0個でも一度はループに入るという仕様が続いているのはきっと何か意味があるのでしょうね。

441:名無しさん@お腹いっぱい。
21/05/24 08:05:21.35 .net
ループじゃなくて*の展開の仕様だよ
合理的に考えれば、展開を指示してマッチ無しならば0件にヒットしたとして何も返さないか空文字
展開が失敗したと考えてエラーのどちらかだろう
多分深い意味はないから気にすんな

442:名無しさん@お腹いっぱい。
21/05/24 08:08:28.58 .net
いや気にしなきゃだめか
ココがヘンだよbshくらいの気持ちで構えてれば、案外可愛く思えてくるぞ

443:名無しさん@お腹いっぱい。
21/05/24 09:50:48.81 .net
>>423
> どうせワンタイムだろうしあんまり細かいこと気にしてるとハゲるぞー
うっせーハゲ!

444:名無しさん@お腹いっぱい。
21/05/24 10:20:26.93 .net
lsとglobがソートされるってどこに書いてあったっけ?
前に見た気がするけど英語の中から探すのめんどいw

445:名無しさん@お腹いっぱい。
21/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:名無しさん@お腹いっぱい。
21/05/24 20:33:55.32 .net
一つでもあればループ内を実行して、(それ以上)無ければ抜ける。
だから、(最初から)無ければそのまま抜けて欲しいな、と。
該当するものが無いのだからループ内を実行するのは無意味だし。

447:名無しさん@お腹いっぱい。
21/06/06 22:14:34.25 .net
標準出力の速度を制限したり、通信速度を表示するコマンドを探しています。どなたか知りませんか?

448:名無しさん@お腹いっぱい。
21/06/07 00:11:53.58 .net
>>439
pvコマンド(Pipe Viewer)でどうよ

449:名無しさん@お腹いっぱい。
21/06/07 11:25:09.09 .net
>>440
ありがとうございました!
 

450:名無しさん@お腹いっぱい。
21/06/15 00:01:20.06 .net
sed の 's/foo/bar/'
スラッシュ直前の【s】って何の意味でしょうか?
g:global
i:ignore
のような意味ありますか?
またman以外でこのような略語を調べるサイトなどありますでしょうか?

451:名無しさん@お腹いっぱい。
21/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:名無しさん@お腹いっぱい。
21/06/15 01:15:20.43 .net
>>443
ありがとうございます

453:名無しさん@お腹いっぱい。
21/06/15 11:14:03.04 .net
edコマンドで気になってるのはv
versed subst?
でもversedって多分古語だしなあ…
exec grep -v "$@"にvrepと名付けることにした

454:名無しさん@お腹いっぱい。
21/06/15 15:03:29.77 .net
>>445
grep の -v は --invert-match だから inVert substitute じゃねーの?

455:名無しさん@お腹いっぱい。
21/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:名無しさん@お腹いっぱい。
21/07/28 19:47:08.66 .net
どう言った用途に使うんでしょうかね

457:名無しさん@お腹いっぱい。
21/07/28 21:32:13.47 .net
>>447
シェルの変数置換じゃなくて、sedで置換したほうがええやろ。
まっとうな正規表現が使えるしな。

458:名無しさん@お腹いっぱい。
21/07/30 07:50:18.18 .net
>>447
そうなるように書いていますけど?

459:名無しさん@お腹いっぱい。
21/07/30 07:51:44.84 .net
彼はsubstringの概念がないんでしょうかね。

460:名無しさん@お腹いっぱい。
21/07/30 08:39:43.50 .net
任意個数の数字だけの塊をglobは表現できないので、お題の変換は無理

461:名無しさん@お腹いっぱい。
21/08/08 22:00:16.40 .net
書き込めるかテスト

462:名無しさん@お腹いっぱい。
21/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:名無しさん@お腹いっぱい。
21/08/08 22:24:57.80 .net
>>449のいうように、sedで一行それも大したことない正規表現で済むな
シェルスクリプトだけという課題の制限でもなければ

464:名無しさん@お腹いっぱい。
21/08/09 01:15:27.49 .net
シェルスクリプトで無理といった途端
シェルスクリプトの実装が出てきたんで
慌てて取り繕ったか?w

465:名無しさん@お腹いっぱい。
21/08/09 01:42:06.59 .net
ねじ曲がりすぎ
そんな発想になるのは、お前>>454ぽいな

466:名無しさん@お腹いっぱい。
21/08/09 13:03:23.04 .net
俺は面白いと思うぞ、やりたくないけどな
bashやzshならパターンの否定が使えるextglobオプション+%パラメータ展開を使うのが多分一番楽かと

467:名無しさん@お腹いっぱい。
21/08/18 19:41:40.78 .net
藤林丈司

468:名無しさん@お腹いっぱい。
21/08/31 05:29:27.62 .net
引数を表示するのに
echo $1
だけのスクリプトファイルを作って実行するのですが
なぜか引数が1&2等の場合にうまくいきません

469:名無しさん@お腹いっぱい。
21/08/31 05:46:42.81 .net
そうなんですね

470:名無しさん@お腹いっぱい。
21/08/31 11:29:04.37 .net
標準出力とエラー出力を引数にしたいってことループしないそれ

471:名無しさん@お腹いっぱい。
21/08/31 11:54:53.66 .net
>>460
クォートしろ。
echo "$1"

472:名無しさん@お腹いっぱい。
21/08/31 12:07:22.10 .net
単に
sh scriptfile.sh 1&2
ってやってしまってるだけじゃないの
呼び出す側の問題
echoで展開後に&が問題になることはないのでクォートしなくても問題にはならない。クォートした方がいいけど

473:名無しさん@お腹いっぱい。
21/09/01 00:03:03.07 .net
>>464
クォートしろ。
sh scriptfile.sh "1&2"

474:名無しさん@お腹いっぱい。
21/09/01 02:30:08.96 .net
そんなわかりきったことを
マウントとりたがりすぎ

475:名無しさん@お腹いっぱい。
21/09/01 03:42:36.41 .net
>>466
マウントマウントうざ。
>>460には「わかりきったこと」ではないのに。

476:名無しさん@お腹いっぱい。
21/09/01 11:21:33.57 .net
間違った指摘してたくせにw
何で常時偉そうにしなきゃならんのだかだが、自覚ないアホか

477:名無しさん@お腹いっぱい。
21/09/02 16:02:37.40 .net
コマンド展開で質問。
echo $(...) | sed ...
みたいなスクリプトで、$(...)内のコマンドが失敗したとき、そこでエラー終了してほしいんだけど、ムリ?
set -eしても、これには効果がないもよう。

478:名無しさん@お腹いっぱい。
21/09/02 17:36:39.83 .net
コマンド置換ではムリだねえ

479:名無しさん@お腹いっぱい。
21/09/02 17:47:03.78 .net
>コマンド置換ではムリだねえ
コマンドの引数にあるのはね
コマンド置換でも変数に入れるだけなら終了ステータス返る/見れる=-eなら止まる。そっちはやってるとかあるだろうけど、いちおう

480:名無しさん@お腹いっぱい。
21/09/03 12:16:10.43 .net
え?馬鹿なの?
var=$(...)
echo "$var" | sed ...
ってするだけじゃん

481:名無しさん@お腹いっぱい。
21/09/03 12:25:07.03 .net
すでにそう書かれてるだろうに

482:名無しさん@お腹いっぱい。
21/09/03 12:30:46.29 .net
流れとか関係なくどこまで知っているのか想定もせず、
偉ぶれると思ったら食いつくいつもの馬鹿だろな

483:名無しさん@お腹いっぱい。
21/09/03 12:47:59.60 .net
口は悪いけどみんなと仲良くしたいだけなんです大目に見てあげてください

484:名無しさん@お腹いっぱい。
21/09/03 12:51:54.14 .net
>>474
おまえこそ、いつものマウンターマウンターだな。w

485:名無しさん@お腹いっぱい。
21/09/03 13:51:00.00 .net
>>475
そうでもないそうではないようだけどw

486:名無しさん@お腹いっぱい。
21/09/03 15:15:28.44 .net
>>470,471
どーも。
やっぱそうか。。。
-o substfailとかあってもいいのに。
>>471
> そっちはやってる
うん、書かなかったけど、やってはみてた。
でもやめた。
なんかひっかかるし、いずれ誤って直しそうだし。
declare/set/exportで書いたら失敗が無視されることも気になる。

487:名無しさん@お腹いっぱい。
21/09/04 07:46:40.91 .net
だからさ、もう結論出てるんだよ
var=$(...)
echo "$var" | sed ...
こう書けば終わり

488:名無しさん@お腹いっぱい。
21/09/05 01:55:02.26 .net
きも

489:名無しさん@お腹いっぱい。
21/09/08 16:22:00.10 .net
sedのホールドスペースは、その内容を削除するにはどうすれば?
とりあえずs/.//g;xでできたけど、もっと直接的なやりかたはないんかなー、と。

490:名無しさん@お腹いっぱい。
21/09/08 16:43:31.22 .net
sed
スレリンク(unix板)

491:名無しさん@お腹いっぱい。
21/09/08 17:50:14.30 .net
おう

492:名無しさん@お腹いっぱい。
21/09/27 09:26:46.66 .net
怪しげなシェル芸が宣伝中
【広告記事】今、ユニケージ開発手法にギークが熱�


493:カするワケ【USP研究所代表&オープンソースOSコミッター対談】 ttps://type.jp/et/feature/14070/



494:名無しさん@お腹いっぱい。
21/11/03 02:25:59.11 .net
空白行でいくつかのブロックに分割されたテキストにて、
文字列にマッチするブロックを出力する方法を探してます
たとえば
111
222
222
aaa
222
333
333
333
のようなテキスト中から、aaaを検索した際に、その前後の空白行に囲まれたブロックである
222
222
aaa
222
という結果を得たいです
いまは最初にブロックごとに一時ファイルを作り、それぞれに対してgrepにて検索し
マッチしたファイルを出力、としているのですがブロックが20万ほどあり、
分割も検索も遅くて困ってます
該当するブロックは3~5個程度なので、むしろgrepでマッチする行番号を調べる
→テキストをless等でひらき該当行へジャンプ
→そのブロックをコピペ
の方が早いくらいでして

495:名無しさん@お腹いっぱい。
21/11/03 02:48:59.29 .net
Linux板くだ質スレでいい加減嫌われたから流れてきたって感じかな
> ブロックが20万ほどあり
この時点でデータ構造の方を考え直すべき

496:名無しさん@お腹いっぱい。
21/11/03 06:26:04.06 .net
\n\n(\n...)ではない \nをスペース(やタブなど)に | grep '\<aaa\>' | スペース(やタブなどにしたの)を\nに

497:名無しさん@お腹いっぱい。
21/11/03 09:59:44.46 .net
テキトーに色々
$ for i in {1..2000000}; do echo aaaa; echo bbbb; echo cccc; echo $i; echo dddd; echo eeee; echo ffff; echo gggg; echo; done > aaa
$ time (awk 'function keepp () { if (matched) { for (i=0 ; i < nkeeps ; i++) print keeps[i]; print } matched=0; nkeeps=0 } NF == 0 { keepp(); next } { keeps[nkeeps++]=$0; if ($1 == "1414213") matched=1 } END{ keepp() }' < aaa )
real 0m10.556s
user 0m10.281s
sys 0m0.271s
$ time (awk 'NF == 0 { print; next } { printf "%s ", $0 }' < aaa | grep '\<1414213\>' | tr ' ' '\n')
real 0m11.101s
user 0m1.177s
sys 0m12.259s
$ time (tr '\n' ' ' < aaa | sed -e 's/ /\
/g' | grep '\<1414213\>' | tr ' ' '\n')
real 0m2.344s
user 0m1.452s
sys 0m0.814s
$ time (tr '\n' ' ' < aaa | sed -e 's/ */\
/g' | grep '\<1414213\>' | tr ' ' '\n')
real 0m3.678s
user 0m1.484s
sys 0m1.078s

498:名無しさん@お腹いっぱい。
21/11/03 10:06:32.55 .net
$ time sh smf1.sh
real 0m4.088s
user 0m2.324s
sys 0m3.803s
$ cat smf1.sh
#!/bin/sh
SMF=/tmp/xxx
[ ! -x $SMF ] && { cc -x c - -o $SMF << 'EOS'
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
const size_t BUFFER_SIZE = 1024 * 1024 + 1;
char *buffer = (char *)malloc(BUFFER_SIZE);
while (fgets(buffer, BUFFER_SIZE, stdin) != NULL) {
char *ep = buffer + strlen(buffer) - 1;
if (ep >= buffer && *ep == '\n')
*ep = '\0';
if (buffer[0] == '\0')
putc('\n', stdout);
else
printf("%s ", buffer);
}
return 0;
}
EOS
[ $? -ne 0 ] && exit 1; }
$SMF < aaa | grep '\<1414213\>' | tr ' ' '\n'

499:名無しさん@お腹いっぱい。
21/11/03 10:07:40.48 .net
$ time sh smf2.sh
real 0m0.717s
user 0m0.381s
sys 0m0.436s
#!/bin/sh
SMF=/tmp/xxx
[ ! -x $SMF ] && { cc -x c - -o $SMF << 'EOS'
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
const size_t BUFFER_SIZE = 1024 * 1024;
char *srcbuff = (char *)malloc(BUFFER_SIZE);
char *dstbuff = (char *)malloc(BUFFER_SIZE+1);
char *const de = dstbuff + BUFFER_SIZE - 1;
int numLFs = 0;
size_t len;
while ((len = fread(srcbuff, 1, BUFFER_SIZE, stdin)) > 0) {
char *sp = srcbuff;
char *const sep = sp + len - 1;
char *dp = dstbuff;
char c;
while (sp <= sep) {
if ((c = *(sp++)) == '\n')
numLFs++;
else{
if (numLFs > 1)
*(dp++) = '\n';
else if (numLFs == 1)

500:名無しさん@お腹いっぱい。
21/11/03 10:07:44.97 .net
*(dp++) = ' ';
numLFs = 0;
*(dp++) = c;
}
}
fwrite(dstbuff, 1, (size_t)(dp - dstbuff), stdout);
}
return 0;
}
EOS
[ $? -ne 0 ] && exit 1; }
$SMF < aaa | grep '\<1414213\>' | tr ' ' '\n'

501:名無しさん@お腹いっぱい。
21/11/04 20:48:41.95 .net
481です
いろいろな方法について情報ありがとうございます
参考にさせていただき、取り入れていこうと思います

502:名無しさん@お腹いっぱい。
21/11/19 02:41:59.96 .net
特定の文字列で始まるファイルが存在するかの判断はどうすればいいでしょうか
ぐぐって見つけた ls を使う方法
if ls $f* > /dev/null 2>&1
then
echo $f で始まるファイルがあります
fi
だと該当ファイルが存在しない場合に
...にアクセスできません: そのようなファイルやディレクトリはありません
というエラーメッセージが表示されます。
また、
for g in $f* ; do
echo $f で始まるファイル $g があります
done
だと該当ファイルがない場合でもループの中に入ってしまいます。

503:名無しさん@お腹いっぱい。
21/11/19 03:28:14.33 .net
find使うのはスクリプトじゃないから関係ないか

504:名無しさん@お腹いっぱい。
21/11/19 10:37:01.91 .net
>>493
zshでじゃないの
そういう余計なオプション(nomatch)がデフォでオンになってるのでオフにする
setopt nonomatch

505:名無しさん@お腹いっぱい。
21/11/19 10:51:08.20 .net
>>493
あと、forの場合は、シェルが対象がなくてglob展開できない場合はglobそのままの値となる。forの場合に限らずglobはそういうもの
for g in $f*
の場合は、g が $f* になるので、展開されずにそのままなのかチェックするのは必要
for g in $f*; do
[ "$g" = "$f*" ] && { echo 展開できませんでした; break; }
な感じで

506:名無しさん@お腹いっぱい。
21/11/19 11:01:48.57 .net
>forの場合に限らずglobはそういうもの
なので、
if [ "$(echo $f*)" != "$f*" ]
then
echo $f で始まるファイルがあります
fi
とかとも書ける
zshでnomatchだと余計なメッセージが出るし、>>493のls使ってる方が見た目なにしたいのかわかりやすいと思うけど、いちおう

507:名無しさん@お腹いっぱい。
21/11/19 11:07:42.62 .net
>>496
ああ、念のためには元globとの比較ではなくて -e する方がいいな
[ "$g" = "$f*" ]
でなくて
[ -e "$g" ]

508:名無しさん@お腹いっぱい。
21/11/19 12:04:30.54 .net
zshネタ、シェルスクリプトではなくて zsh script になってしまうが
null_glob
ってのもあるんだな
setopt null_glob
ってすると、エラーメッセージは出ないわ、globに当てはまらない場合globを入れない/消すわで、>>493のどっちも動くようになるな
そんな応えは求めてないだろうけどw

509:名無しさん@お腹いっぱい。
21/11/19 12:07:54.26 .net
ああ、bashにもnullglobって同じようなのがあるのか
シェルスクリプトという汎用ではなく各シェル固有独特の機能なので使わないだろけど

510:名無しさん@お腹いっぱい。
21/11/19 12:11:32.22 .net
そして、bashにも
failglob
ってあるのか。オンになってたら>>493はbashでも似たような動きになるか
bashはデフォではオンではないので、zshだろと思うけど

511:名無しさん@お腹いっぱい。
21/11/19 23:23:19.51 .net
489です
ありがとうございます。
とても参考になりました。

512:名無しさん@お腹いっぱい。
21/11/21 19:09:01.55 .net
コマンドの出力を(だけ)ではなく、シェルそのものの出力(=コマンドの出力もになる)を消すなら
if (exec 1>/dev/null;exec 2>&1;ls $f*); then
echo $f で始まるファイルがあります
fi
て現在のシェル環境を変更(元に戻すのが面倒なのでサブシェルでそこの環境を変更)で消すというのもできたな

513:名無しさん@お腹いっぱい。
21/11/21 19:15:56.45 .net
>if (exec 1>/dev/null;exec 2>&1;ls $f*); then
execのディスクリプタ操作は羅列ができるようなのね
if (exec 1>/dev/null 2>&1;ls $f*); then
の方が良さげか

514:名無しさん@お腹いっぱい。
21/11/21 22:35:21.95 .net
>>493
check() {
  set -- "$1"*
  [ -e "$1" ]
}
最短だとこうかな?
set -- "$1"* でシェルのglob展開を用いて位置パラメーターにセットする
ファイルが見つかった場合、そのファイル名が$1に入る
ファイルが見つからなかった場合、"$1"*という文字列が入る
まずありえないとは思うけど"$1*"という名前にアスタリスクが含まれた
ファイルがある可能性を考えると>>496よりも-eでチェックした方が良い
>>498で書いてあったかw
>>497
> >>493のls使ってる方が見た目なにしたいのかわかりやすいと思うけど
ls $f* は意味がない。シェルのglob展開されてからlsを実行してる。
つまりls file1 file2 file3 のようなものを実行してるだけ。
呼び出す前にすでにファイル一覧を取得してる
単に呼び出しコストが高い[ -e ] になってる

515:名無しさん@お腹いっぱい。
21/11/21 23:15:10.23 .net
見た目っ言ってるだろ
そんなコスト気にする必要もないから、見た目とそっちの方を重視してだよ

516:名無しさん@お腹いっぱい。
21/11/21 23:18:58.18 .net
他人の提案を直接ダメ出しして自分の知識自慢をしたがり、
マウント取るのが目的なやつは他のシェルスクリプトスレでも居るけど、
同じやつかな

517:名無しさん@お腹いっぱい。
21/11/21 23:19:33.52 .net
lsの見た目の何がいいの?
ファイルリストを取得しても何やってるのか意味わからんでしょ

518:名無しさん@お腹いっぱい。
21/11/21 23:20:38.15 .net
>>507
> 同じやつかな
違うけど、お前が知識不足でマウント取られたやつだってのはよくわかったよw

519:名無しさん@お腹いっぱい。
21/11/21 23:21:00.73 .net
lsはファイルがあるか確認するのに普通に使ってるだろ、手打ちで

520:名無しさん@お腹いっぱい。
21/11/21 23:22:25.30 .net
>>509
見た目って言ってる裏を読めないで決めつけられてもな
同じやつとしか思えないその短絡的なレス

521:名無しさん@お腹いっぱい。
21/11/21 23:31:25.93 .net
でたw
自分が説明できてないだけなのに
裏が読めてないと相手のせいにする
詐欺師の手段と同じ

522:名無しさん@お腹いっぱい。
21/11/21 23:34:45.43 .net
自分にある意味ダメ出しされたらイキリマ来るくせに。変なやつ
説明できないとか似たようなフレーズはあいつもすぐにしてたなあ
巣に帰れよw

523:名無しさん@お腹いっぱい。
21/11/21 23:40:47.87 .net
「裏を読めない」と言った時点で
自分で書いてないって言ってるのってわかってないのかな?
思い込み激しすぎるんだよな
例のPOSIX原理主義者みたいだw

524:名無しさん@お腹いっぱい。
21/11/21 23:46:30.79 .net
読めませんでしたと素直に言えよ
わざわざ見た目って言ってるのはなんなのかは、細かいこと言うなら、
また、そこまで食い下がるならそれぐらい裏読めよ
せめて、読めませんでしたと素直になれよ。他人にダメ出しばっかしてないで
自分にダメ出しされたらイキリまくるくせに、他人にダメ出しはするって、
マジでマウント取るのが目的でしかないだろう
マウント取るためだから素直には人の言うことは読めないから、
イキリまくることになるんだろうなと
そのしつこさはやはりなっていう
マウント取るためだからしつこく食い下がるんだろうなあ...

525:名無しさん@お腹いっぱい。
21/11/22 00:00:02.71 .net
書いてないものは読めません
アホすぎる

526:名無しさん@お腹いっぱい。
21/11/22 00:00:26.12 .net
POSIX原理主義者って本当みたいだなw

527:名無しさん@お腹いっぱい。
21/11/22 00:02:28.08 .net
書いてないものは読めません
って短絡的に言えちゃうのは確かにアホだな、それが攻撃的な人格のヤツがなら

528:名無しさん@お腹いっぱい。
21/11/22 00:08:40.31 .net
>>517
自らアホ晒してるだけだぞ
なんでPOSIX原理主義者に結びつけるのか意味わからん
もちろんあんな自ら手足縛るのは嫌いだ/必要ないし、イキってる姿勢はもっと嫌いだし
ホント短絡的だな。トンチンカンな決めつけばかりって何したいんだか

529:名無しさん@お腹いっぱい。
21/11/22 00:09:15.81 .net
説明不足を他人のせいにするのが流行ってるの?

530:名無しさん@お腹いっぱい。
21/11/22 00:10:39.73 .net
相手によるだろう

531:名無しさん@お腹いっぱい。
21/11/22 00:16:59.61 .net
>>519
> なんでPOSIX原理主義者に結びつけるのか意味わからん
そりゃPOSIX原理主義者に知識不足でマウント取られた恨みがあるから、というぐらいは読めるよねえ

532:名無しさん@お腹いっぱい。
21/11/22 00:18:57.19 .net
また思い込みで語ってるw

533:名無しさん@お腹いっぱい。
21/11/22 00:23:14.57 .net
>>522
イミフすぎな文で、読めないぞ
誰がPOSIX原理主義者なの?
裏読めないやつがPOSIX原理主義者ってことになる文だと思うけど、その文は
POSIX原理主義者って出てきたのは、>>514だぞ
>>514がPOSIX原理主義者?>>514のレスの相手であろう俺がPOSIX原理主義者??

534:名無しさん@お腹いっぱい。
21/11/22 00:29:52.48 .net
俺がPOSIX原理主義者だとしたいなら、
POSIX原理主義者のくせに知識不足でマウント取られた恨みがあるから
かな
だとしてもPOSIX原理主義者に結びつける説明にはなってないなあ
カオスだな。ここまでにしとこか

535:名無しさん@お腹いっぱい。
21/11/22 02:10:39.67 .net
>>524
× POSIX原理主義者
○ 例のPOSIX原理主義者
シェルスクリプトスレでは、意味が全然変わる。w

536:名無しさん@お腹いっぱい。
21/11/22 02:11:59.82 .net
>>524
510には「POSIX原理主義者」に知識不足でマウント取られた過去があって
恨みがあるから「POSIX原理主義者」という言葉を持ち出した
ってことでしょ
510がマウントとられてぐぬぬとなった時に、510には相手がPOSIX原理主義者のように思えたらしいというだけで
本当にPOSIX原理主義者かどうかさえ不明だし、誰がPOSIX原理主義者かなんてどうでもいい

537:名無しさん@お腹いっぱい。
21/11/22 02:13:47.43 .net
>>526
言語新作は病気だよ

538:名無しさん@お腹いっぱい。
21/11/22 03:28:05.45 .net
>>527
無理があるだろう

539:名無しさん@お腹いっぱい。
21/12/11 11:26:25.87 .net
fishについて質問です
fish_vi_key_bindingsを入力するとviモードに入りプロンプトの左にモードステイタスが表示されますが、
$XDG_CONFIG_HOME/fish/config.fish にfish_vi_key_bindingsを記入した場合はログイン後すぐにviモードか使えますがモードステイタスが表示されません
どうやったら表示出来ますか?

540:名無しさん@お腹いっぱい。
21/12/11 13:46:58.57 .net
fish_prompt

541:名無しさん@お腹いっぱい。
21/12/11 13:48:39.11 .net
fish_mode_prompt

542:名無しさん@お腹いっぱい。
21/12/11 13:49:12.15 .net
を、$XDG_CONFIG_HOME/fish/config.fish に書いてるんじゃないの

543:名無しさん@お腹いっぱい。
21/12/11 15:39:24.15 .net
>>533
どうもありがとうございます
それらは書かれていませんが、こう書かれてありましたのでコメントアウトしてみたらモードが表示されるようになりました
function hybrid_bindings --description "Vi-style bindings that inherit emacs-style bindings in all modes"
for mode in insert default visual
fish_default_key_bindings -M $mode
end
fish_vi_key_bindings --no-erase
end
set -g fish_key_bindings hybrid_bindings

544:名無しさん@お腹いっぱい。
21/12/11 15:48:57.02 .net
インサートモードの時にjjを押したらノーマルモードに戻りたくてfish_user_key_bindingsに以下のように書いたらまたモードが消えました
function fish_user_key_bindings
fish_vi_key_bindings
bind -M insert -m default jj backward-char force-repaint
end

545:名無しさん@お腹いっぱい。
22/02/26 23:09:30.57 .net
端末では正常な
$declare -i w0=180 w1=30 w2=20 w3=50 ; w3=w3+(w0-w1)/10-1 ; echo $w3
ですが、shファイルで使うとなぜかエラーになります。(w? の数値は違います)
予期しないトークン `(' 周辺に構文エラーがあります w3=w3+(w0-w1)/10-1
ですが、分割すると通ります。
w2=(w0-w1)/10 ; w3=w3+w2-1
理由をご存知でしたら教えて下さい。
GNU bash, バージョン 5.0.17(1)

546:名無しさん@お腹いっぱい。
22/02/27 07:10:41.81 .net
>>536
理由はよく分からないけど extglob が on ならエラーにならないね

547:名無しさん@お腹いっぱい。
22/02/27 09:42:18.76 .net
>>536
シバンでググれ

548:名無しさん@お腹いっぱい。
22/02/27 19:45:20.55 .net
なんかbashの仕様のグダグダなところを踏んだって感じだな。
エスケープされていない生の ( は基本的にwordの途中に出てこないので、
w3+( ときたところでsyntax errorになる。
ところが、shopt -s extglob しておくと、
+(hoge|fuga) みたいなパターンマッチを許すため、
w3+( をエラー扱いできなくなり、全部まとめて数式としてパースしてくれる。
*( も可。しかし、/( と -( は不可。
おとなしく $(( )) を使っておくのが吉。

549:名無しさん@お腹いっぱい。
22/02/28 06:45:21.62 .net
自分が理解できないからって
bashのせいにするのは恥ずかしい行為

550:名無しさん@お腹いっぱい。
22/03/08 18:54:54.29 .net
grepとかで使える正規表現の「\s」は、manページのどこに書いてますか?
「\b」「\w」は、man 1 grepに書いてあるけど、「\s」は見当たらない。

551:名無しさん@お腹いっぱい。
22/03/10 22:56:33.04 .net
declare -i n; n="3/2" は通るのに、n="1.5" が通らないのはなぜだろ

552:名無しさん@お腹いっぱい。
22/03/10 23:31:05.02 .net
エラーで出ている通り、
リテラルもintegerしかでintegerでは.(5) というのは数値はあり得ない
数値の一部ではないので算術演算子とみるが、算術演算子としてもそんなのない
てとこかな

553:名無しさん@お腹いっぱい。
22/03/10 23:46:00.98 .net
リテラル じゃなく、右辺中 か
>>541
manには無さげかな。manには無いがPOSIXのドキュメントには詳しくある

554:名無しさん@お腹いっぱい。
22/03/11 00:08:44.90 .net
>>544,541
いや、POSIXのドキュメントには無いな
個々の実装での�


555:Cまぐれmanに記載のないのは記載漏れかな 使えるかどうかは試してみなければわからない、使えるのも多いだろうけど 自分で試して使えるなら使うなら、 https://en.wikipedia.org/wiki/Regular_expression https://www.boost.org/doc/libs/1_71_0/libs/regex/doc/html/boost_regex/syntax/basic_extended.html とか、manではなくPOSIXのでもなく他の資料を当たるしかないかな



556:名無しさん@お腹いっぱい。
22/03/11 00:14:53.27 .net
ああ、決まり事を規定する団体が規定してるドキュメントでは ユニコードコンソーシアム のがある
URLリンク(unicode.org)
これを実装していればだが

557:名無しさん@お腹いっぱい。
22/03/11 12:03:17.08 .net
>>544-546
やっぱり記載漏れかな?
理想としては、man 7 regexくらいに全仕様がまとまっててほしいんだけどな。
個人的には、慣れで「\d」を使ってしまって、よく標準コマンド系でガッカリするんだよね。。。

558:名無しさん@お腹いっぱい。
22/03/11 12:17:43.20 .net
>>547
他の環境は知らんがGNUのなら仕様はinfoを読めというスタンスだぞ

559:名無しさん@お腹いっぱい。
22/03/11 16:00:00.94 .net
>>548
たしかにinfo grepには「\s」が書いてあるな。
でもinfo bashには書かれてなくて、man 3 regexに回されてるような。
結局はinfoでも解決しなさそうな気がするんだけど、違う?
info regexだとlibc関数のことが表示されるし、たとえばman 7 regexに相当するinfoは存在しないんでは?
まあ、man7セクションに入るような内容はGNUに関係なさそうだとは思う。

560:あぼーん
NG NG.net
あぼーん

561:名無しさん@お腹いっぱい。
22/05/12 22:19:26.11 .net
シェルスクリプトの [ -a (AND) と -o (OR) ] は非推奨だかんね
URLリンク(qiita.com)
には -a や -o ではなく && と || を使うように書かれています。
否定の場合、 [ $a != $b ] と [ ! $a = $b ] はどちらを使ってもいいのでしょうか?

562:名無しさん@お腹いっぱい。
22/05/13 01:22:03.48 .net
>>551
知らなかった。
勉強になった

563:名無しさん@お腹いっぱい。
22/05/13 16:01:08.55 .net
>>551
いいんじゃね?
ただ [ "$a" != "$b" ] や [ ! "$a" = "$b" ] ってしないとだめだけど
あと ! [ "$a" = "$b" ] でもよさそう

564:名無しさん@お腹いっぱい。
22/05/14 23:52:35.51 .net
昔のFreeBSDでは
[ -n abc -lt 5 ]
みたいのが通った記憶
[ gnu 8.30で今試すとextra argument '['
と怒られる
手元のunix magazineコレクション(1997-2000)にもこの用法が述べられてるが、まあ要らん機能だわな

565:名無しさん@お腹いっぱい。
22/05/15 03:02:55.37 .net
シェルスクリプトって息が長いから
そういう使うべきじゃないものも残っていて困るね
さすがに古すぎる機能は互換性切り捨てた方が良くない?

566:名無しさん@お腹いっぱい。
22/05/15 12:09:01.91 .net
whileの、条件が偽でも一度はループって仕様が不思議

567:名無しさん@お腹いっぱい。
22/05/15 15:51:51.12 .net
そんな仕様なんて無いし
シェルスクリプトに文句言ってるやつの8割は
自分の知らない言語を勉強せずに文句言ってるだけなんだなってわかる

568:名無しさん@お腹いっぱい。
22/05/15 17:54:30.30 .net
do while をシェルスクリプトでどう実現するかって話もWeb上であるけど、
それなんの話ってことになるわな

569:名無しさん@お腹いっぱい。
22/05/23 13:54:54.31 .net
ぐぐっても見つけられないんだけど
functionの中のlocal変数に整数属性付与って出来ないのかな?

570:名無しさん@お腹いっぱい。
22/05/23 23:44:52.02 .net
bashの話だとして普通に整数属性付いてるぞ?
bash -c 'v=1+2; foo() { local v; declare -i v; v=3+4; echo $v; }; foo; echo $v'
7
1+2
というかdeclareで-gをつけない限り
デフォルトでlocalになるだろ?

571:名無しさん@お腹いっぱい。
22/05/24 01:33:27.87 .net
ぐぐるな!
黙って
man sh

572:名無しさん@お腹いっぱい。
22/05/24 17:18:15.58 .net
>>560
ありがとうございます。
declare はスクリプトファイルの先頭でしか使ったことがなかったのでループ内(や関数)でも使えるとは知りませんでした。
なるほど、それならデフォルトlocalですね。
>>561
使い方の例を見て学ぶタイプなので^^

573:名無しさん@お腹いっぱい。
22/05/25 00:13:58.24 .net
3つの引数を必要とする関数があります。
x=$1 y=$2 ANS=$3の絶対値
$3が正の場合はxを、負の場合はyを増減し、xとyとで算出される結果がANSになった時のxまたはyを返します。
x=a[0] y=a[1]とし、最初に$3の符号で添字を0または1に設定することでループ内での場合分けを減らしたいと思います。
質問:整数配列の宣言はできますか?

574:名無しさん@お腹いっぱい。
22/05/25 01:04:48.10 .net
>>562
内部的にはlocalとかreadonlyとか変数に属性つけるやつは
内部的にはdeclareかtypesetの別名

575:名無しさん@お腹いっぱい。
22/05/25 01:06:31.16 .net
>>563
昨日、近所の吉野家行ったんです。吉野家。
そしたらなんか人がめちゃくちゃいっぱいで座れないんです。
で、よく見たらなんか垂れ幕下がってて、150円引き、とか書いてあるんです。
もうね、アホかと。馬鹿かと。
お前らな、150円引き如きで普段来てない吉野家に来てんじゃねーよ、ボケが。
150円だよ、150円。
なんか親子連れとかもいるし。一家4人で吉野家か。おめでてーな。
よーしパパ特盛頼んじゃうぞー、とか言ってるの。もう見てらんない。
お前らな、150円やるからその席空けろと。
吉野家ってのはな、もっと殺伐としてるべきなんだよ。
Uの字テーブルの向かいに座った奴といつ喧嘩が始まってもおかしくない、
刺すか刺されるか、そんな雰囲気がいいんじゃねーか。女子供は、すっこんでろ。
で、やっと座れたかと思ったら、隣の奴が、大盛つゆだくで、とか言ってるんです。
そこでまたぶち切れですよ。
あのな、つゆだくなんてきょうび流行んねーんだよ。ボケが。
得意げな顔して何が、つゆだくで、だ。
お前は本当につゆだくを食いたいのかと問いたい。問い詰めたい。小1時間問い詰めたい。
お前、つゆだくって言いたいだけちゃうんかと。
吉野家通の俺から言わせてもらえば今、吉野家通の間での最新流行はやっぱり、
ねぎだく、これだね。
大盛りねぎだくギョク。これが通の頼み方。
ねぎだくってのはねぎが多めに入ってる。そん代わり肉が少なめ。これ。
で、それに大盛りギョク(玉子)。これ最強。
しかしこれを頼むと次から店員にマークされるという危険も伴う、諸刃の剣。
素人にはお薦め出来ない。
まあお前らド素人は、牛鮭定食でも食ってなさいってこった。
答え:できまsん

576:名無しさん@お腹いっぱい。
22/05/31 05:07:04.68 .net
ありがとうございます。
色々やってみたら、配列として宣言しなくても使えるようです。
declare -i i a[0] a[1] ; a[0]=3 ; a[1]=6 ; i=1 ; a[$i]=${a[$i]}+1 ; echo a=${a[$i]}
a=7

577:名無しさん@お腹いっぱい。
22/07/31 09:46:48.93 .net
ちょっとスレチかもですが、
for filename in *
とかでカレントディレクトリにあるファイル名を得る場合、どんな順番なのでしょうか?
ディレクトリエントリ順とか、ファイル名順とか。

578:名無しさん@お腹いっぱい。
22/07/31 11:17:31.68 .net
ある程度ファイルがあるところで
echo *
すればわかる

579:名無しさん@お腹いっぱい。
22/07/31 12:25:43.85 .net
>>567
お使いのシェルのマニュアル見ろってさ
URLリンク(detail.chiebukuro.yahoo.co.jp)

580:名無しさん@お腹いっぱい。
22/07/31 17:53:21.88 .net
>>567
GLOB
POSIXに規定されてる
The glob() function shall store the number of matched pathnames into pglob->gl_pathc and a pointer to a list of pointers to pathnames into pglob->gl_pathv. The pathnames shall be in sort order as defined by the current setting of the LC_COLLATE category
名前順

581:名無しさん@お腹いっぱい。
22/07/31 17:56:03.40 .net
>>570,567
SORTしないというオプションもあるが、その場合には順番の決まりなんてないということになるね

582:名無しさん@お腹いっぱい。
22/07/31 19:31:44.03 .net
質問者の使ってるシェルはposix準拠なのか

583:名無しさん@お腹いっぱい。
22/07/31 19:47:57.19 .net
>>572
> □お約束
> ・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。

584:名無しさん@お腹いっぱい。
22/08/02 17:31:23 .net
POSIX準拠が当たり前、
POSIXにはない/POSIXで足らない勝手に拡張部分で独自が当たり前
って当たり前がわからないんだろな

拡張するにしてもPOSIXをベース+αって馬鹿でもわかりそうなもんだが
機能的に必要最低限のPOSIXを無視する利益なんてないだろに

585:名無しさん@お腹いっぱい。
22/08/02 19:09:16.74 .net
POSIXを無視する利益は互換性でしょ?
今までの動きを変えたらだめ

586:名無しさん@お腹いっぱい。
22/08/02 20:31:00.79 .net
>POSIXを無視する利益は互換性
www
>今までの動きを変えたらだめ
前段からそれになるとか無茶苦茶
POSIXの経緯、POSIXは何をベースに作られたか勉強してきてから寝言言うんだよ

587:名無しさん@お腹いっぱい。
22/08/03 09:45:22.85 .net
皆様ありがとうございました。シェルはbashです。
名前順的に最後のファイル名を得るには
for filename in * ; do
:
done
とするしかないようですね。
でもKDEのDolphineの自然なソート(ゼロパディング分の0を無視)のようなオプションは欲しいかも

588:名無しさん@お腹いっぱい。
22/08/03 14:26:27.63 .net
>>577
> 名前順的に最後のファイル名を得るには
普通に
ls -r | head -1
でよくね?

589:名無しさん@お腹いっぱい。
22/08/03 20:32:58.41 .net
>>576
何をベースにってBSDベースでしょ?
SolarisとかはSystemVベースだからtrコマンドの挙動が違う
互換性を重視してPOSIXを無視してる

590:名無しさん@お腹いっぱい。
22/08/03 20:34:34.24 .net
URLリンク(qiita.com)
> POSIXに準拠してないSystem V実装が悪いと言ってしまえばそれまでなのだが、
> 歴史の上ではPOSIXよりも早いのでそれをいうのもまた理不尽というもの。ではどうすればいいか。

591:名無しさん@お腹いっぱい。
22/08/04 09:47:52.75 .net
>>576
おら。ちゃんとPOSIXの経緯調べてきたか?
黙ってないでなんとかいえや

592:名無しさん@お腹いっぱい。
22/08/05 10:23:52.72 .net
>>577
sh ではできるだけパイプで処理することを考えるんだ
もちろん for, while などが必要な局面はあるが
パイプで済むなら速くて簡潔でフィルターとして組み合わせられる

593:名無しさん@お腹いっぱい。
22/08/05 10:46:42.12 .net
>>582
ファイル名に改行が入る場合はどうすればいいのでしょうか?

594:名無しさん@お腹いっぱい。
22/08/08 18:30:05.02 .net
自分ならまずそういうアホなファイル名を変更するが
権限がなければまあ
find -print0 | xargs -0
くらいだな

595:名無しさん@お腹いっぱい。
22/08/08 21:06:49.38 .net
>>584
POSIX準拠じゃないので
FreeBSDで動きませんw

596:名無しさん@お腹いっぱい。
22/08/14 20:39:40.32 .net
POSIX準拠じゃなくてもFreeBSDで動くけどな
POSIXにないのでも、ツール間で合わせ合う、どっちかがどっちかに似せるというのは普通にあるしな

597:名無しさん@お腹いっぱい。
22/08/14 21:19:42.49 .net
POSIXにないオプションは使用禁止だ
そんなものを使うと持続性がなくなる
なんらかの理由で別のOSに変更になった時
システムは動かなくなってデータはただのゴミになる
何度言えば理解できるのか

598:名無しさん@お腹いっぱい。
22/08/15 12:57:39.48 .net
はいはい、原理主義ごくろうさん
使ってる本人次第でしかないのに押し付けとかホント原理主義者は

599:名無しさん@お腹いっぱい。
22/08/15 13:03:07.61 .net
原理主義者は自惚れてるけど無知さがだだ漏れる
無知さを隠す誤魔化すためのマウント取りでしかない

600:名無しさん@お腹いっぱい。
22/08/15 13:26:13.07 .net
リッチー大佐はC言語も使える
ただし分割コンパイルやmakeといった高度な機能は使わない
そんなものはなくてもシェルスクリプトでmake.shを作れば良いからだ

601:名無しさん@お腹いっぱい。
22/08/15 13:28:32.48 .net
>>585
pkg install findutils

602:名無しさん@お腹いっぱい。
22/08/15 14:25:12.28 .net
それ入れなくてもFreeBSDのfindで可能だけどな
がっつりGNU依存のにしても、それ入れる+ちょっとパス修正だけだわな

603:名無しさん@お腹いっぱい。
22/08/15 16:04:55.82 .net
BSDのfindなら
find 場所 -print0 | xargs -0

604:名無しさん@お腹いっぱい。
22/08/15 20:36:03.11 .net
持続性なら、もはやPOSIXよりも、Linuxのほうがいいのでは。

605:名無しさん@お腹いっぱい。
22/08/16 12:18:54.66 .net
posixってソフトウェア規格でしょ?

606:名無しさん@お腹いっぱい。
22/08/16 12:28:09.90 .net
ソフトウェア規格って?
公式ページでも見れば?

607:名無しさん@お腹いっぱい。
22/09/19 12:12:56.52 .net
bashの関数で文字列を返したい場合、その関数名を文字列名称に使うことは仕様的に可能ですか?
function kotae () {
kotae=$1$2
}
kotae ab cd
echo $kotae

608:名無しさん@お腹いっぱい。
22/09/23 09:54:01.90 .net
>>597
関数と変数の名前空間は別なので別に構わない、そして宣言(declare)してなければ変数concはグローバル
ややこしいのでそういう使い方のおすすめはしない

609:名無しさん@お腹いっぱい。
22/09/23 09:55:09.11 .net
concはkotaeの間違い
頭の中で勝手に命名しちゃった

610:名無しさん@お腹いっぱい。
22/09/24 14:46:59.72 .net
>>597
そのようなことをしたい場合はこうする
function kotae () {
printf -v $1 "%s" $2$3
}
kotae ret ab cd
echo $ret

611:名無しさん@お腹いっぱい。
22/10/28 02:25:37.28 .net
bash 5.2.2(1)で最初の!だけ全角の
echo "abc!? xyz!"
は通るのに、半角にすると
echo "abcecho "abc!? xyz!"
>
になってしまいます。
一対の"で通すにはどうすればいいのでしょうか?
>>598-600
ありがとうございます。
printfのvオプションは初めて知りました。

612:名無しさん@お腹いっぱい。
22/10/28 13:13:38.41 .net
ヒストリ機能
知らない/活用してないならオフにしておくべき
対話モードでしか機能しないから切っても特に問題はない

613:名無しさん@お腹いっぱい。
22/10/29 10:43:22.22 .net
バックスラッシュをつけてエスケープ。

614:名無しさん@お腹いっぱい。
22/11/06 16:47:34.57 .net
恥を忍んで質問させて下さい:
Larry Wallせんせーが書いたmetaconfigが普及せずに、同じ機能を果たす、
Autoconf/Autotoolsが普及した理由って何でしょう?
1)Perlよりm4の方が普及してた(どっちも文法はアレだけど)
2)というかPerl嫌いな人が少なくなかった
3)そのほか(開発モデルとか)
...imakeって何だっけ?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch