1 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 11:53:21.38 ID:BBiLRgnj0.net] !extend:on:vvvvv:1000:512 !extend:on:vvvvv:1000:512 シェルスクリプトに関する総合スレッドです。 スレ立て時は以下の文を先頭行に加えて下さい。 後のつけ忘れ防止の為に複数行重ねて追加推奨 !extend:on:vvvvv:1000:512 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 前スレ シェルスクリプト総合 その28 mevius.5ch.net/test/read.cgi/tech/1532397676/ VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 11:57:44.54 ID:rfhCLeCra.net] お約束 ・特記なき場合、Bourne ShellもしくはPOSIX準拠のsh可換シェルが既定です つまりシバンは#! /bin/shです。 他のシェル(bash, zsh, ksh, (d)ash, yash, posh, fish, (t)csh)などの専用機能に依存する場合は明示しましょう。 OS X, GNU/Linuxユーザーは/bin/shの実体がbashなので*特に*注意(自覚なきbashism---シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?)。 ただしDebian, Ubuntuなどでは/bin/shの実体はPOSIX sh互換のdashですのであまり気にしないでも大丈夫です。 FreeBSDユーザーは/bin/shの実体がashなので注意。 Solaris, OpenBSDユーザーは/bin/shの実体がkshなので注意。 csh/tcshでのシェルスクリプトは*まったく推奨しません*。 (参考URL: www.speech-lab.org/~hiroki/csh-whynot.euc ) ・POSIXに準拠しましょう 有用なリンクはhttps://en.wikipedia.org/wiki/POSIXにまとめられています。 最新の仕様はこちらへ: pubs.opengroup.org/onlinepubs/9699919799/ (左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます) ・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh、次点でDebianなどに搭載されているDash shell Heirloom sh: heirloom.sourceforge.net/sh.html Dash shell: gondor.apana.org.au/~herbert/dash/ ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります Manページや各種リンク(pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html など)を見ましょう。 apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。 ・ワイルドカードは正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆうな
3 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 11:58:06.49 ID:rfhCLeCra.net] 初心者へのアドバイス ・適した道具を判断するのも頭の重要な使い方。 シェルスクリプトよりもPerlまたはPythonの方が適した処理にはそちらを使いましょう。 ・知らないコマンドが出てきたらman(1)を引きましょう。 ・思い通りに動かないときは、まずはsh(1)の-xオプションでトレースしましょう。 回答者への注意事項 ・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに、「そういうのはPerl, Python使え」と回答するのはやめましょう。 安易にPerlやPythonに逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。 ・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。
4 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 12:01:23.98 ID:rfhCLeCra.net] (補足:今スレのみ) 同名スレッドが乱立していますが、Unix版→ム版移行に伴い荒らしとミスが横行したためであり、実際に使用されるのはこのスレのみです。同名の他スレは利用しないように願います
5 名前:デフォルトの名無しさん [2018/09/22(土) 12:08:49.50 ID:dRsA3CmI0.net] 【震災を容認、原爆脳】 安部「小型核なら合憲」 ロシア「偽装実験は容易」 読売「原爆で人工地震」 rosie.5ch.net/test/read.cgi/liveplus/1537583222/l50
6 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 12:15:31.76 ID:rfhCLeCra.net] 早速役にたったな これでワッチョイをNGすればこいつは消える
7 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 17:29:57.71 ID:dKJ+Zat70.net] 前のスレでASCII US,RSを区切り文字にしたファイル形式について話してた者だけど エスケープ文字を\␟,\␞の二つにできないかな。 これで大分処理が楽になるんだけど,この規則で区別できない二種類以上の文字列があれば教えてほしい。
8 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 18:51:26.94 ID:DxQImHVza.net] 前スレも埋まらないうちから主張はじめんなや 前スレでやれ
9 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 18:52:48.23 ID:n0R7Fe5t0.net] マジ同意
10 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 20:16:11.27 ID:dKJ+Zat70.net] えぇ……
11 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 20:47:04.94 ID:Ig57RuXo0.net] >>8 がいつもの荒らしやろ 確かスマホから書き込んで自作自演してるって どこかでみたし
12 名前:デフォルトの名無しさん [2018/09/22(土) 20:49:57.60 ID:PGp2AKzL0.net] それだとな USとRSのasciiデータを含むことができないワケ やっぱりな低学歴知恵遅れは致命的に頭悪い
13 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 21:19:04.63 ID:SEEeyc/qa.net] >>11 だから前スレでやれ ついでに俺はスレ立てた本人だ
14 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 21:37:44.00 ID:Ma0PioWH0.net] > ついでに俺はスレ立てた本人だ 1デフォルトの名無しさん (ワッチョイ 3efb-m2E0)2018/09/22(土) 11:53:21.38ID:BBiLRgnj0 13デフォルトの名無しさん (アウアウカー Sae9-m2E0)2018/09/22(土) 21:19:04.63ID:SEEeyc/q ワッチョイ アウアウカー なるほどねw
15 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 22:01:52.49 ID:XHaRNOKU0.net] 何でも喧嘩越しだなんて… お前ら人生もっと楽に生きろよ
16 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 22:04:10.95 ID:SEEeyc/qa.net] >>14 スマホ回線だとスレ立て規制されてたからWi-Fi繋いだだけだぞ 恥ずかしい思いする前にワッチョイの右側読み取ろうな
17 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 22:16:05.03 ID:n0R7Fe5t0.net] 無敵だなw無敵という表現は正しくはないが まあ、あんまカッカしないでw
18 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 22:21:58.24 ID:j6So/S370.net] シュッ シュッ ∧∧ シュッ シュッ (`・ω・) シュッ シュッ みんな、ここは飲んで気を落ち着かせるんだ!! (つ と彡 / シュッ /// / /c□ / /旦 / //c□ ./ /旦 Y / | | 旦 | |旦 ガシャーン ガシャーン ガシャーン ガシャーン
19 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 23:18:46.87 ID:KDtJrl5K0.net] ワッチョイもついたようだし、スレ新しくなったので前スレのこれお願い bashでさ、typesetで関数の中身を出力できるじゃん? それをevalで評価したら同じ関数が出来上がるじゃん? これってどれくらい信用できるんだろう? 作成した関数のコードそのままの形で出力されるなら evalで評価して同じものができるだろうけど、 ぱっとみtypesetで出力するされたものをみると、 改行の位置とか変わって整形された状態になって 関数にはfunctionが頭に追加されてる。 元のコードをどれくらい書き換えるんだろうか? これ以外になにか変わる事知ってたりする人いない?
20 名前:デフォルトの名無しさん [2018/09/22(土) 23:40:33.97 ID:T1K71jdo0.net] >>19 つまりおまえは定義した関数とそれをtypesetで表示させた物が別もんやと思とるんか? そこまで疑っとって逆によくbash使えんなw おまえの頭の中はどおなっとるんやw
21 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 00:19:41.09 ID:gqT47rCG0.net] ワッチョイでスレを立てたのは前スレを荒らしに荒らしまくった多数回線で自演するRubyアンチのPyキチだよ 自分だけが自演できるワッチョイスレを立てて工作したいんだと思う 次世代スレもワッチョイで立てようとしたけどあっちは失敗したみたいだし
22 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 00:21:35.03 ID:IvXdDnc90.net] 前スレの終わらせ具合からそう見えないこともないなww
23 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 00:25:42.58 ID:wRiEEsWva.net] スレ立てたのも前スレ終わらせたのも俺だがそれのこと言ってんのか? rubyもpythonも語ったことなんてないが妄想すごいですね
24 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 00:40:41.02 ID:IvXdDnc90.net] うん、妄想は尽きないw ちょっと終わらせ方が強引だったからねえ、ヤツならやりそうだなと。反省してっwまた、すぐ怒ったり(?)しないでね
25 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 00:51:46.20 ID:IvXdDnc90.net] 発端となった>>7 が全然続かないのな。もう続けてもええんやで じゃなきゃ、前スレでやれでしかなかった、および、無理やり終わらせた意味がゼロだなw
26 名前:デフォルトの名無しさん [2018/09/23(日) 00:53:01.00 ID:cRG95Xcq0.net] 低学歴知恵遅れの戯言にだれも興味なんかない まずその自覚がない
27 名前:デフォルトの名無しさん [2018/09/23(日) 00:54:17.26 ID:cRG95Xcq0.net] まず相当頭悪いこと書いてる自覚がない そこが問題だからな
28 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 00:56:29.70 ID:IvXdDnc90.net] ワンパターンのフレーズを繰り返すしかできないのあったが、悔しくてそれでもしてしまう自称賢いはんかくであった としか見えないなw
29 名前:デフォルトの名無しさん [2018/09/23(日) 00:57:32.98 ID:cRG95Xcq0.net] >>12 にも書いたとおり USとRSのasciiデータを含むことができない コレでおわりだからな
30 名前:デフォルトの名無しさん [2018/09/23(日) 00:58:37.38 ID:cRG95Xcq0.net] 頭悪いことを自覚できないかぎり 頭悪いのは治らない コレは真理だからな
31 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 01:02:12.95 ID:wRiEEsWva.net] なんでワッチョイつけた後になっても半角に構ってるんですかねぇ とっととNGしてどうぞ
32 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 01:04:05.84 ID:IvXdDnc90.net] >>29 ,30 あんた自身ではわざわざ終わってるのに蒸し返すんだな。俺の蒸し返し(?)の意味は違うぞ おとなしく前スレでやればいいことだった、前スレを強制終了することもなかった だからな?あんたの主張なんて関係ない興味ない(自称賢いを言いたいがためのなんてw) >>31 んー、まあ、ノリでw
33 名前:デフォルトの名無しさん [2018/09/23(日) 01:04:07.40 ID:cRG95Xcq0.net] まず勘違いしてるのは オレが賢いとかいってるところ オレが賢いのではなく 当事者が日常生活に支障をきたすであろうと考えられるぐらい頭悪いこと問題だからな そういう問題だ 軽度の知的障害があると推認できる
34 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 01:05:09.76 ID:IvXdDnc90.net] よく言うよ。不特定に向けてもそういうフレーズ使ってるくせに。ほんと自称賢いだな
35 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 01:34:23.77 ID:D4/zD5nR0.net] 淫夢語録を使うな
36 名前:デフォルトの名無しさん [2018/09/23(日) 02:37:03.28 ID:Te/My51X0.net] 別人なんですアピール終わった? ほんとうざいわコイツ
37 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 08:59:25.73 ID:a7uxw1Gj0.net] 前スレのPOSIX荒らしの頃から、雰囲気悪いなぁ
38 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 09:03:53.53 ID:4WDm+Clw0.net] そんなに悔しかったんだ...
39 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 12:00:26.57 ID:MAME2I+ya.net] 大学生が課題貼り始めたあたりから何かがおかしくなっていったな 極めつけはCSVだったが
40 名前:デフォルトの名無しさん [2018/09/23(日) 12:30:25.47 ID:0vXeudiz0.net] >>39 おまえが出入りしだしたあたりからだいぶおかしいでwおまえのせいとは言わんけどw
41 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 12:51:24.23 ID:MAME2I+ya.net] >>40 さてそれはいつ頃か正確に言ってくれませんかね? ドンピシャしたらROMってあげよう単芝君
42 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 13:51:05.35 ID:VGMMYKH/0.net] なんでそうすぐにムキになるんだか。>>39 なんて俯瞰してもの言えないんじゃねと
43 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 15:46:02.02 ID:D4/zD5nR0.net] でもASCII区切り文字を使ったいいアイデアが出たので俺は嬉しいよ
44 名前:デフォルトの名無しさん [2018/09/23(日) 18:04:09.53 ID:cRG95Xcq0.net] エクセルの出力結果みればわかるとおり もともとなにも問題ない 低学歴知恵遅れがその出力より劣化したアイデア()を ドヤ顔してだしてるだけだからな それはな世間一般ではアイデアとはいわない それは頭悪い寝言という わかった?
45 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 20:05:39.90 ID:i9SY9vW90.net] とお前は言う
46 名前:デフォルトの名無しさん [2018/09/23(日) 21:39:22.13 ID:0vXeudiz0.net] >>41 ムキになっとるのは何か自覚でもあったんか?w
47 名前:デフォルトの名無しさん [2018/09/24(月) 07:30:26.77 ID:csv6kfNU0.net] CSV、CSVうるせーんだよ、このCSV野郎が!
48 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 00:49:55.83 ID:lmrEE7TE0.net] Shell Scriptって国際化はできないの? 調べるとBashは$"text"→$"文"みたいなことができたらしいけどこれも今では使えないし(Bash 3.xで削除?)。 需要がないのかな やっぱり
49 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 01:56:25.59 ID:BMMTvniR0.net] >>48 できるよ。gettext.shってのが用意されてる。 ライブラリになっていて、おそらくパスも通ってるはずだから . gettext.shで読み込めるはず。 そしてeval_gettext関数を使って翻訳するわけだが、 www.nofuture.tv/diary/20130329.html の記事を見ると > echo "$(eval_gettext "hello world")" と書いてあるな? eval_gettext "hello world" だけじゃだめなんだろうか? 一般的には等価だし、これだけでもメッセージの抜き出しはできるはず なにより"$(・・・)"を使うとforkが行われるから WSLで遅くなることが懸念される そのうち使うことになるとは思ってるが、まだ試してないのでよろしくw
50 名前:デフォルトの名無しさん [2018/09/25(火) 02:52:25.49 ID:VjhU4mZC0.net] >>48 え?これできないの? www.unixuser.org/~ysjj/bash_script_i18n.html しかし Linux の bash の man ページには $"string" あるなあ。 https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html
51 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 05:08:08.34 ID:BMMTvniR0.net] だからセキュリティの理由により非推奨になったって書いてあるやん 一つ上のレスぐらい読もうよ
52 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 05:09:28.74 ID:S/r6pG9La.net] 長いから読んでもらえないんじゃね
53 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 05:18:05.28 ID:lmrEE7TE0.net] え,俺?
54 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 05:20:16.93 ID:S/r6pG9La.net] なんか俺は勘違いしたかもしれん、 >>52 は無視してくれ
55 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 07:05:22.02 ID:BMMTvniR0.net] >>52 それで恥をかくのは読んでない人なわけで 自業自得だけどな
56 名前:デフォルトの名無しさん [2018/09/25(火) 08:29:51.94 ID:VjhU4mZC0.net] >>51 今見た。元々リロード忘れて一つ上が見えない状態で書いてたのと、見えた後でリンク先見てなかったのでセキュリティの都合で非推奨になった事に気づかなかった。 でも非推奨ってことは使えないこともないのかな?だからmanページには残ってるとか?使わん方が良いことには変わりはないだろうが。
57 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 09:03:56.75 ID:BMMTvniR0.net] > この方法はセキュリティ上の問題(シフトJISや中国語のエンコーディングではダブルクォーテーションを無効にできてしまうなど。 というような、ASCIIと互換性がない文字コードによる問題だから そういう文字コード自体を非推奨として対応から外せたら良いのに Unicode以外の文字コードが絶滅するのはいつになるんだろうな
58 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 22:39:41.88 ID:lmrEE7TE0.net] shebangって書かないほうがいいのかもな。 > If the first line of a file of shell commands starts with the characters "#!", > the results are unspecified ---pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html だそうだし > One common historical implementation is that > the execl(), execv(), execle(), and execve() functions > return an [ENOEXEC] error for any file not recognizable as executable, including a shell script. > When the execlp() and execvp() functions encounter such a file, > they assume the file to be a shell script > and invoke a known command interpreter to interpret such files. > This is now required by POSIX.1-2017. ---pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html#tag_16_111_08 だし。
59 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 00:23:55.64 ID:+a+RcOTAM.net] それは誤読だろ。 execveとかにシェルスクリプト渡したらどうなるか知らん、 execlpとか使えってことでしょ。 実装としてどっちで#!を解釈するかはOSに任せられている。
60 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 01:08:43.37 ID:yzZF1GUc0.net] shebangって書かないほうがいいんじゃないかって話は どこかの誰かがまとめてただろ 書かなくて良いんじゃないかと思うが 書かないとshellcheckが警告出すんだよな。 パラメータじゃない方法でシェルを指定する方法があれば良いんだが
61 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 06:41:40.90 ID:aDQj+U850.net] >>60 > shebangって書かないほうがいいんじゃないかって話はどこかの誰かがまとめてただろ 読んでみたい
62 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 07:00:32.41 ID:p8TYnMT50.net] Google検索ぐらいしたらいいのに https://myfuturesightforpast.blogspot.com/2017/01/what-is-shebang-binsh-in-posix-shell.html#20170101T1739_Shebang%EF%BC%88#!%EF%BC%89%E3%81%8C%E3%81%82%E3%82%8B%E5%A0%B4%E5%90%88
63 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 07:43:20.75 ID:yzZF1GUc0.net] ったく、そっちじゃねーよ https://togetter.com/li/1077808 簡単にまとめるとだな。Androidでは sh は /bin/sh に存在しない /system/bin/sh だから、どちらでも通じるシバンは書けない なら書かなくて良いのでは? → そのとおり。POSIXではシバンがなければshで起動されると明記されてる (注意 ログインシェルとしてcshを使用してる場合、先頭一文字目が# つまりコメント行だったらcshで起動されるので:コマンドなどで無効化する cshはファイルの先頭が#でなければPOSIX shで起動する)
64 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 08:05:31.15 ID:p8TYnMT50.net] ちなみに bash$ cat ./sbtest.sh ps -o comm= $$ bash$ ./sbtest.sh bash ↑↑ Bashじゃねーか っていう罠もある。
65 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 09:25:36.26 ID:pB5sfbMh0.net] ちょっと質問です。 プログラムが終了していたら再起動し、20秒以上動いていたら強制終了させて再起動したい。 どう書けばいいですか?
66 名前:デフォルトの名無しさん [2018/09/26(水) 09:56:06.94 ID:QtvShas/a.net] >>65 そうだなあ。Linuxとかならkillでシグナル番号0を送ると指定のプロセスの生死を確認できるのでそれ利用して作るかな。 しかしその場合は動いているプロセスのPIDがわからないとダメだ。これがわからない状態でやらねばならない場合はpsの出力にgrepして探すかな。
67 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 10:01:22.38 ID:FJCeOZRMr.net] > プログラムが終了していたら再起動し、 親シェルスクリプト(プログラム)作ってループ起動 例えばcronの5分間隔とかにすると隙間が開く可能性がある > 20秒以上動いていたら強制終了させて再起動したい。 監視シェルスクリプト(プログラム)作る 起動させた時間はpsコマンドで分かる 今の時刻はdateコマンドで分かる 強制終了はkillコマンドでできる 監視の間隔(チェックを何分おきにやるか)は自分で決める 例えば1分間隔で監視したら最悪60秒以上動く場合がある waitしないループは結構CPUに負荷をかけるから注意
68 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 11:15:01.91 ID:yzZF1GUc0.net] こんな感じかねぇ プログラム名からプロセスIDを取得して変数に入れる while :; do psコマンドでプロセスID変数の起動時間取得 if 取得できたら; then if 20秒以上経過していたら; then kill プロセスID fi else # 取得できなかったら プログラム起動 & 新たなプロセスIDを変数に入れる fi sleep 1 done
69 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 15:07:59.55 ID:yzZF1GUc0.net] setコマンドで変数一覧が見れる機能の使い道にやっと気づいた man bashにはこうある > オプションなしの場合は、シェル変数全ての名前と値の組が表示されます。 > 表示は、現在設定されている変数を設定や再設定をする入力 として > 再利用できるフォーマットで行われます。 ようは変数のシリアライズとデシリアライズだよなーと思ってた でもそうだとすると普通は特定の変数のみシリアライズ&デシリアライズしたいわけで 全部だされても困る。指定された変数だけ表示できないのか? 変数の中には改行が含まれることもあるから、絞り込むのも大変だぞ ちなみになんのために俺がsetを調べていたかと言うと、サブシェルの中から 変数の値を返す方法はないものかと(再度)調べていた。 いわゆるwhile read の中で行数数えても、変数は元に戻る問題な i=0 cat /etc/hosts | while read line; do i=$((i+1)) done echo $i # whileがサブシェルで実行されるからもとに戻る この解決方法として、echoでevalできる形の文字列を返してサブシェルの外で evalするやり方。このテクニックは最近俺の中で常識となっていた。 でもな、setでevalできる文字を返せるのはわかる。だが欲しいのは変数 i だけなんだよ! set使えねーなって思ってた。 頭が硬かった。setで表示されたものすべてをevalすりゃいいんや。 サブシェルの中の変数は、サブシェルの外を引き継いてるんだから変えない限り同じ。 evalしても変わらない。いちいち必要なものだけechoする必要なかったんや
70 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 15:10:23.80 ID:yzZF1GUc0.net] 長文乙w つーわけで、サブシェルの中から変数を返す方法 汎用版 i=0 eval "$(cat /etc/hosts | { while read line; do i=$((i+1)) done set })" echo $i # 俺の環境では11だった set呼ぶだけで、簡単に変数返せるぞ
71 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 15:11:28.48 ID:yzZF1GUc0.net] ちなみにbashとかだとデフォルトでは関数まで返しちゃうので注意な
72 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 22:48:58.32 ID:p8TYnMT50.net] シェルスクリプトじゃないんだけど Makefileのファイル名(例えばGNUMakefileだったりmakefileだったりするよね) を取得したりってできる? つまり $ cat ./Makefile all: >---echo $0 $ make Makefile みたいな。もちろんMakefileはshが解釈しないんで, $0を使うことはできないけど。
73 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 23:44:41.88 ID:p8TYnMT50.net] 追記 GNU makeなら$(MAKEFILE_LIST)が使えるらしいがFreeBSDでも使いたいんだよね……
74 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 00:12:48.73 ID:indBRC1Z0.net] MAKEFILE_LIST https://www.freebsd.org/cgi/man.cgi?query=make&apropos=0&sektion=0&manpath=FreeBSD+6.2-RELEASE&format=html
75 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 00:23:32.14 ID:IUmy3t5S0.net] all: @echo $(lastword $(MAKEFILE_LIST)) とか。
76 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 00:24:08.12 ID:IUmy3t5S0.net] おっと、TAB が使えないんだったな
77 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 00:36:01.18 ID:indBRC1Z0.net] ああ、>>74 はめっちゃ古いのか .MAKE.MAKEFILES https://www.freebsd.org/cgi/man.cgi?query=make&apropos=0&sektion=0&manpath=FreeBSD+11.2-RELEASE&arch=default&format=html 今度は試してみたが確かにっぽい
78 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 02:38:06.19 ID:RGPgoULv0.net] >>70 なんでcatがいるの? catなくせば苦労しないんじゃないの?
79 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 02:48:37.10 ID:Fk1HpByz0.net] >>78 catはただの一例にすぎん。そこは本質ではない。 サブシェルの中の変数を、サブシェルの呼び出し元に 戻す方法の話をしてる
80 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 03:09:09.89 ID:Fk1HpByz0.net] もう少し見やすく、汎用的な書き方をするとこんな感じかな サブシェル(change_vars)内で追加や変更した変数を すべてサブシェルの親に返す方法 # もちろん例 change_vars() { i=123; } eval "$(somecommand | { change_vars; set; })" echo $i 実際には変更してないものすべてを再代入してるわけだが それを行った所で問題はない。 ただしreadonlyを使ってると代入できなくてエラーになる。 これはなにかいい回避策はないだろうか
81 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 03:23:00.68 ID:Fk1HpByz0.net] readonlyになってる変数一覧はreadonly -pで取得できる その結果をパースしてごにゃごにゃやればできるんだろうけど、 readonly -pの結果が、 bashだと declare -r a="1" dashだと readonly a='1' と異なるのでパースが面倒くさい上に、 変数名がわかったからといってどうするのだ?問題がある サブシェル内でもreadonlyだからunsetできない。 setをパースして消すのは改行文字とかの対応で面倒 エラーを無視しようにもうまくいかない 詰んだw
82 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 03:37:41.74 ID:GWQb325r0.net] "Field with Space" "Second Field" ... みたいなフィールの連続に対して一番初めのフィールドを取得したいんだけど なんかいい方法ない? ただしフィールドのなかに特殊な文字は含まれないし、「"」記号もフィールを区別する目的以外には使われてない。 これコマンドに渡す引数の形と似てるから$1とか上手く利用したらいい感じの処理ができそうなんだけど 思い付かん……。
83 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 03:38:09.61 ID:GWQb325r0.net] なぜかフィールドが二箇所でフィールになってるww
84 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 03:50:48.26 ID:Fk1HpByz0.net] ちゃんとフールって書けよw こんな感じだな line='"Field with Space" "Second Field"' echo $line # 関数呼び出し foo() { echo "foo1: $1" echo "foo2: $2" } eval fool $line # または eval set -- $line echo "set1: $1" echo "set2: $2" もちろんeval使ってるので、入力データが安全であることが前提 あとは1文字ずつパースして処理するとか
85 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 04:38:59.49 ID:GWQb325r0.net] あーやっぱり変数に代入する感じか。 (データが安全なのは保証されてるんだけど 長いんだよね) でもありがとう。とりあえずそれで行く。
86 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 04:43:30.53 ID:Fk1HpByz0.net] 変数というか、$1, $2, ... だけど 変数($1等含む)に入れないでどうやれとw 標準入力?
87 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 05:30:19.44 ID:GWQb325r0.net] いや 結局変数に入れることと一緒なんだけど $ echo '"Field with Space" "Second Field"' | { eval set -- "$(cat -)"; echo $1; } みたいにしてみた。というのは実際のデータは標準出力から流れてくるから できるだけパイプで処理したいなというのがあった。 いずれにせよeval setなんて思い付きもしなかったんで むちゃくちゃ感謝してる。 難癖を付けてる訳ではないよ。いやマジで。
88 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 07:41:11.09 ID:wRik+4En0.net] >>87 別に気分悪くしたとかじゃなくて、 なにか処理するなら結局変数に入れるよなーってだけだよ 標準入力からでもreadで変数に入れるわけだし 最近eval多用してる。もちろんそれがどうしても必要だからだけど 特に速度が遅くなるわけでもないし色々と便利
89 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 09:31:12.30 ID:0Kr1SoI20.net] 丁寧な回答をもらっておいて「でも」「とりあえず」は失礼だろう 「お前の回答はイマイチだが時間もないし採用してやるか」という感じかな?
90 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 09:36:53.29 ID:wRik+4En0.net] 今日の荒らしは>>89
91 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 10:20:00.38 ID:pwwRK9qRa.net] 荒らし認定兄貴今日もお疲れ様です
92 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 11:06:37.78 ID:RGPgoULv0.net] 正論を書くとあらし認定されるんですね
93 名前:デフォルトの名無しさん [2018/09/27(木) 12:20:46.63 ID:99b9Jx0Mr.net] 大体失礼なのはこの手の答えたがりw
94 名前:デフォルトの名無しさん [2018/09/27(木) 13:17:03.86 ID:U92lHhY6a.net] >>70 それ set じゃなくて最後に echo i=$i だけで良いのでは?
95 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 14:01:53.41 ID:wRik+4En0.net] >>94 だから汎用的な解だってばw 変数が複数あっても対応できるし 変数の中にエスケープが必要な文字があっても対応できる あ、これに関して良いアイデアが浮かんできた。気がするw
96 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 14:05:58.33 ID:wRik+4En0.net] こういう問題について考えていると、bashの拡張ってよく考えられてるなって思うよ ちゃんと足りなくて必要な機能を追加してくれてる https://qiita.com/t_nakayama0714/items/80b4c94de43643f4be51#prefix-%E5%A4%89%E6%95%B0%E5%90%8D%E4%B8%80%E8%A6%A7
97 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 17:43:23.75 ID:GWQb325r0.net] https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#compact こういうのとかもすっげえ便利だよね。 $ VAR=val; echo ${VAR@A} VAR='val' でも新しい機能なのか,日本語版のマニュアルに掲載されてない。 (まあ俺はPOSIXに準拠したほうがいいと思ってるので,こういう機能は それこそ一時的な使い捨てスクリプトにしか使わんけど)
98 名前:デフォルトの名無しさん [2018/09/28(金) 02:21:47.32 ID:5yuIehG00.net] >>97 それCentOS7に入ってるbashではエラーになる。 新しい機能だな。
99 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 10:45:59.06 ID:TLhVFQk50.net] ファイルのメディアタイプを取得する汎用な方法ってあるかな。 自作してもいいんだけどできれば既存のものを利用したい。 file(1)コマンドの-iオプションがまず思い付いたんだけど,これは GNU/Linux(man7.org/linux/man-pages/man1/file.1.html ) FreeBSD(https://www.freebsd.org/cgi/man.cgi?query=file&sektion=1) ではメディアタイプで出力するとあるのに対し 本家POSIX(pubs.opengroup.org/onlinepubs/9699919799/utilities/file.html ) Solaris(https://docs.oracle.com/cd/E26502_01/html/E29030/file-1.html) AIX(https://www.ibm.com/support/knowledgecenter/en/ssw_aix_72/com.ibm.aix.cmds2/file.htm) なんかでは特になんの指定もなし……。 メディアタイプなんてド標準なんだから,しっかり規定しておいてほしかったなぁ。 POSIX 2017あたりでさ。
100 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 13:07:01.59 ID:bPXaydqo0.net] >>99 メディアタイプの種類自体は標準化されていたとしても、 あるファイルがどのメディアタイプかってのは決まらないでしょ? 拡張子cgiのスクリプトファイルだって、ソースコード配布サイトなら テキストファイル扱いにしたいだろうし