18/09/22 11:53:21.38 BBiLRgnj0.net
!extend:on:vvvvv:1000:512
!extend:on:vvvvv:1000:512
シェルスクリプトに関する総合スレッドです。
スレ立て時は以下の文を先頭行に加えて下さい。
後のつけ忘れ防止の為に複数行重ねて追加推奨
!extend:on:vvvvv:1000:512
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ
シェルスクリプト総合 その28
スレリンク(tech板)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2:デフォルトの名無しさん
18/09/22 11:57:44.54 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: URLリンク(www.speech-lab.org))
・POSIXに準拠しましょう
有用なリンクはURLリンク(en.wikipedia.org)にまとめられています。
最新の仕様はこちらへ: URLリンク(pubs.opengroup.org)
(左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh、次点でDebianなどに搭載されているDash shell
Heirloom sh: URLリンク(heirloom.sourceforge.net)
Dash shell: URLリンク(gondor.apana.org.au)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります
Manページや各種リンク(URLリンク(pubs.opengroup.org)など)を見ましょう。
apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
3:デフォルトの名無しさん
18/09/22 11:58:06.49 rfhCLeCra.net
初心者へのアドバイス
・適した道具を判断するのも頭の重要な使い方。
シェルスクリプトよりもPerlまたはPythonの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらman(1)を引きましょう。
・思い通りに動かないときは、まずはsh(1)の-xオプションでトレースしましょう。
回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに、「そういうのはPerl, Python使え」と回答するのはやめましょう。
安易にPerlやPythonに逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。
4:デフォルトの名無しさん
18/09/22 12:01:23.98 rfhCLeCra.net
(補足:今スレのみ)
同名スレッドが乱立していますが、Unix版→ム版移行に伴い荒らしとミスが横行したためであり、実際に使用されるのはこのスレのみです。同名の他スレは利用しないように願います
5:デフォルトの名無しさん
18/09/22 12:08:49.50 dRsA3CmI0.net
【震災を容認、原爆脳】 安部「小型核なら合憲」 ロシア「偽装実験は容易」 読売「原爆で人工地震」
スレリンク(liveplus板)
6:デフォルトの名無しさん
18/09/22 12:15:31.76 rfhCLeCra.net
早速役にたったな
これでワッチョイをNGすればこいつは消える
7:デフォルトの名無しさん
18/09/22 17:29:57.71 dKJ+Zat70.net
前のスレでASCII US,RSを区切り文字にしたファイル形式について話してた者だけど
エスケープ文字を\␟,\␞の二つにできないかな。
これで大分処理が楽になるんだけど,この規則で区別できない二種類以上の文字列があれば教えてほしい。
8:デフォルトの名無しさん
18/09/22 18:51:26.94 DxQImHVza.net
前スレも埋まらないうちから主張はじめんなや
前スレでやれ
9:デフォルトの名無しさん
18/09/22 18:52:48.23 n0R7Fe5t0.net
マジ同意
10:デフォルトの名無しさん
18/09/22 20:16:11.27 dKJ+Zat70.net
えぇ……
11:デフォルトの名無しさん
18/09/22 20:47:04.94 Ig57RuXo0.net
>>8がいつもの荒らしやろ
確かスマホから書き込んで自作自演してるって
どこかでみたし
12:デフォルトの名無しさん
18/09/22 20:49:57.60 PGp2AKzL0.net
それだとな
USとRSのasciiデータを含むことができないワケ
やっぱりな低学歴知恵遅れは致命的に頭悪い
13:デフォルトの名無しさん
18/09/22 21:19:04.63 SEEeyc/qa.net
>>11
だから前スレでやれ
ついでに俺はスレ立てた本人だ
14:デフォルトの名無しさん
18/09/22 21:37:44.00 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:デフォルトの名無しさん
18/09/22 22:01:52.49 XHaRNOKU0.net
何でも喧嘩越しだなんて…
お前ら人生もっと楽に生きろよ
16:デフォルトの名無しさん
18/09/22 22:04:10.95 SEEeyc/qa.net
>>14
スマホ回線だとスレ立て規制されてたからWi-Fi繋いだだけだぞ
恥ずかしい思いする前にワッチョイの右側読み取ろうな
17:デフォルトの名無しさん
18/09/22 22:16:05.03 n0R7Fe5t0.net
無敵だなw無敵という表現は正しくはないが
まあ、あんまカッカしないでw
18:デフォルトの名無しさん
18/09/22 22:21:58.24 j6So/S370.net
シュッ シュッ
∧∧ シュッ シュッ
(`・ω・) シュッ シュッ みんな、ここは飲んで気を落ち着かせるんだ!!
(つ と彡 / シュッ
/// /
/c□ /
/旦 /
//c□ ./
/旦 Y /
| | 旦 |
|旦 ガシャーン
ガシャーン
ガシャーン ガシャーン
19:デフォルトの名無しさん
18/09/22 23:18:46.87 KDtJrl5K0.net
ワッチョイもついたようだし、スレ新しくなったので前スレのこれお願い
bashでさ、typesetで関数の中身を出力できるじゃん?
それをevalで評価したら同じ関数が出来上がるじゃん?
これってどれくらい信用できるんだろう?
作成した関数のコードそのままの形で出力されるなら
evalで評価して同じものができるだろうけど、
ぱっとみtypesetで出力するされたものをみると、
改行の位置とか変わって整形された状態になって
関数にはfunctionが頭に追加されてる。
元のコードをどれくらい書き換えるんだろうか?
これ以外になにか変わる事知ってたりする人いない?
20:デフォルトの名無しさん
18/09/22 23:40:33.97 T1K71jdo0.net
>>19
つまりおまえは定義した関数とそれをtypesetで表示させた物が別もんやと思とるんか?
そこまで疑っとって逆によくbash使えんなw
おまえの頭の中はどおなっとるんやw
21:デフォルトの名無しさん
18/09/23 00:19:41.09 gqT47rCG0.net
ワッチョイでスレを立てたのは前スレを荒らしに荒らしまくった多数回線で自演するRubyアンチのPyキチだよ
自分だけが自演できるワッチョイスレを立てて工作したいんだと思う
次世代スレもワッチョイで立てようとしたけどあっちは失敗したみたいだし
22:デフォルトの名無しさん
18/09/23 00:21:35.03 IvXdDnc90.net
前スレの終わらせ具合からそう見えないこともないなww
23:デフォルトの名無しさん
18/09/23 00:25:42.58 wRiEEsWva.net
スレ立てたのも前スレ終わらせたのも俺だがそれのこと言ってんのか?
rubyもpythonも語ったことなんてないが妄想すごいですね
24:デフォルトの名無しさん
18/09/23 00:40:41.02 IvXdDnc90.net
うん、妄想は尽きないw
ちょっと終わらせ方が強引だったからねえ、ヤツならやりそうだなと。反省してっwまた、すぐ怒ったり(?)しないでね
25:デフォルトの名無しさん
18/09/23 00:51:46.20 IvXdDnc90.net
発端となった>>7が全然続かないのな。もう続けてもええんやで
じゃなきゃ、前スレでやれでしかなかった、および、無理やり終わらせた意味がゼロだなw
26:デフォルトの名無しさん
18/09/23 00:53:01.00 cRG95Xcq0.net
低学歴知恵遅れの戯言にだれも興味なんかない
まずその自覚がない
27:デフォルトの名無しさん
18/09/23 00:54:17.26 cRG95Xcq0.net
まず相当頭悪いこと書いてる自覚がない
そこが問題だからな
28:デフォルトの名無しさん
18/09/23 00:56:29.70 IvXdDnc90.net
ワンパターンのフレーズを繰り返すしかできないのあったが、悔しくてそれでもしてしまう自称賢いはんかくであった
としか見えないなw
29:デフォルトの名無しさん
18/09/23 00:57:32.98 cRG95Xcq0.net
>>12にも書いたとおり
USとRSのasciiデータを含むことができない
コレでおわりだからな
30:デフォルトの名無しさん
18/09/23 00:58:37.38 cRG95Xcq0.net
頭悪いことを自覚できないかぎり
頭悪いのは治らない
コレは真理だからな
31:デフォルトの名無しさん
18/09/23 01:02:12.95 wRiEEsWva.net
なんでワッチョイつけた後になっても半角に構ってるんですかねぇ
とっととNGしてどうぞ
32:デフォルトの名無しさん
18/09/23 01:04:05.84 IvXdDnc90.net
>>29,30
あんた自身ではわざわざ終わってるのに蒸し返すんだな。俺の蒸し返し(?)の意味は違うぞ
おとなしく前スレでやればいいことだった、前スレを強制終了することもなかった
だからな?あんたの主張なんて関係ない興味ない(自称賢いを言いたいがためのなんてw)
>>31
んー、まあ、ノリでw
33:デフォルトの名無しさん
18/09/23 01:04:07.40 cRG95Xcq0.net
まず勘違いしてるのは
オレが賢いとかいってるところ
オレが賢いのではなく
当事者が日常生活に支障をきたすであろうと考えられるぐらい頭悪いこと問題だからな
そういう問題だ
軽度の知的障害があると推認できる
34:デフォルトの名無しさん
18/09/23 01:05:09.76 IvXdDnc90.net
よく言うよ。不特定に向けてもそういうフレーズ使ってるくせに。ほんと自称賢いだな
35:デフォルトの名無しさん
18/09/23 01:34:23.77 D4/zD5nR0.net
淫夢語録を使うな
36:デフォルトの名無しさん
18/09/23 02:37:03.28 Te/My51X0.net
別人なんですアピール終わった?
ほんとうざいわコイツ
37:デフォルトの名無しさん
18/09/23 08:59:25.73 a7uxw1Gj0.net
前スレのPOSIX荒らしの頃から、雰囲気悪いなぁ
38:デフォルトの名無しさん
18/09/23 09:03:53.53 4WDm+Clw0.net
そんなに悔しかったんだ...
39:デフォルトの名無しさん
18/09/23 12:00:26.57 MAME2I+ya.net
大学生が課題貼り始めたあたりから何かがおかしくなっていったな
極めつけはCSVだったが
40:デフォルトの名無しさん
18/09/23 12:30:25.47 0vXeudiz0.net
>>39
おまえが出入りしだしたあたりからだいぶおかしいでwおまえのせいとは言わんけどw
41:デフォルトの名無しさん
18/09/23 12:51:24.23 MAME2I+ya.net
>>40
さてそれはいつ頃か正確に言ってくれませんかね?
ドンピシャしたらROMってあげよう単芝君
42:デフォルトの名無しさん
18/09/23 13:51:05.35 VGMMYKH/0.net
なんでそうすぐにムキになるんだか。>>39なんて俯瞰してもの言えないんじゃねと
43:デフォルトの名無しさん
18/09/23 15:46:02.02 D4/zD5nR0.net
でもASCII区切り文字を使ったいいアイデアが出たので俺は嬉しいよ
44:デフォルトの名無しさん
18/09/23 18:04:09.53 cRG95Xcq0.net
エクセルの出力結果みればわかるとおり
もともとなにも問題ない
低学歴知恵遅れがその出力より劣化したアイデア()を
ドヤ顔してだしてるだけだからな
それはな世間一般ではアイデアとはいわない
それは頭悪い寝言という
わかった?
45:デフォルトの名無しさん
18/09/23 20:05:39.90 i9SY9vW90.net
とお前は言う
46:デフォルトの名無しさん
18/09/23 21:39:22.13 0vXeudiz0.net
>>41
ムキになっとるのは何か自覚でもあったんか?w
47:デフォルトの名無しさん
18/09/24 07:30:26.77 csv6kfNU0.net
CSV、CSVうるせーんだよ、このCSV野郎が!
48:デフォルトの名無しさん
18/09/25 00:49:55.83 lmrEE7TE0.net
Shell Scriptって国際化はできないの?
調べるとBashは$"text"→$"文"みたいなことができたらしいけどこれも今では使えないし(Bash 3.xで削除?)。
需要がないのかな やっぱり
49:デフォルトの名無しさん
18/09/25 01:56:25.59 BMMTvniR0.net
>>48
できるよ。gettext.shってのが用意されてる。
ライブラリになっていて、おそらくパスも通ってるはずだから
. gettext.shで読み込めるはず。
そしてeval_gettext関数を使って翻訳するわけだが、
URLリンク(www.nofuture.tv) の記事を見ると
> echo "$(eval_gettext "hello world")"
と書いてあるな?
eval_gettext "hello world"
だけじゃだめなんだろうか?
一般的には等価だし、これだけでもメッセージの抜き出しはできるはず
なにより"$(・・・)"を使うとforkが行われるから
WSLで遅くなることが懸念される
そのうち使うことになるとは思ってるが、まだ試してないのでよろしくw
50:デフォルトの名無しさん
18/09/25 02:52:25.49 VjhU4mZC0.net
>>48
え?これできないの?
URLリンク(www.unixuser.org)
しかし Linux の bash の man ページには $"string" あるなあ。
URLリンク(linuxjm.osdn.jp)
51:デフォルトの名無しさん
18/09/25 05:08:08.34 BMMTvniR0.net
だからセキュリティの理由により非推奨になったって書いてあるやん
一つ上のレスぐらい読もうよ
52:デフォルトの名無しさん
18/09/25 05:09:28.74 S/r6pG9La.net
長いから読んでもらえないんじゃね
53:デフォルトの名無しさん
18/09/25 05:18:05.28 lmrEE7TE0.net
え,俺?
54:デフォルトの名無しさん
18/09/25 05:20:16.93 S/r6pG9La.net
なんか俺は勘違いしたかもしれん、
>>52は無視してくれ
55:デフォルトの名無しさん
18/09/25 07:05:22.02 BMMTvniR0.net
>>52
それで恥をかくのは読んでない人なわけで
自業自得だけどな
56:デフォルトの名無しさん
18/09/25 08:29:51.94 VjhU4mZC0.net
>>51
今見た。元々リロード忘れて一つ上が見えない状態で書いてたのと、見えた後でリンク先見てなかったのでセキュリティの都合で非推奨になった事に気づかなかった。
でも非推奨ってことは使えないこともないのかな?だからmanページには残ってるとか?使わん方が良いことには変わりはないだろうが。
57:デフォルトの名無しさん
18/09/25 09:03:56.75 BMMTvniR0.net
> この方法はセキュリティ上の問題(シフトJISや中国語のエンコーディングではダブルクォーテーションを無効にできてしまうなど。
というような、ASCIIと互換性がない文字コードによる問題だから
そういう文字コード自体を非推奨として対応から外せたら良いのに
Unicode以外の文字コードが絶滅するのはいつになるんだろうな
58:デフォルトの名無しさん
18/09/25 22:39:41.88 lmrEE7TE0.net
shebangって書かないほうがいいのかもな。
> If the first line of a file of shell commands starts with the characters "#!",
> the results are unspecified
---URLリンク(pubs.opengroup.org)
だそうだし
> 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.
---URLリンク(pubs.opengroup.org)
だし。
59:デフォルトの名無しさん
18/09/26 00:23:55.64 +a+RcOTAM.net
それは誤読だろ。
execveとかにシェルスクリプト渡したらどうなるか知らん、
execlpとか使えってことでしょ。
実装としてどっちで#!を解釈するかはOSに任せられている。
60:デフォルトの名無しさん
18/09/26 01:08:43.37 yzZF1GUc0.net
shebangって書かないほうがいいんじゃないかって話は
どこかの誰かがまとめてただろ
書かなくて良いんじゃないかと思うが
書かないとshellcheckが警告出すんだよな。
パラメータじゃない方法でシェルを指定する方法があれば良いんだが
61:デフォルトの名無しさん
18/09/26 06:41:40.90 aDQj+U850.net
>>60
> shebangって書かないほうがいいんじゃないかって話はどこかの誰かがまとめてただろ
読んでみたい
62:デフォルトの名無しさん
18/09/26 07:00:32.41 p8TYnMT50.net
Google検索ぐらいしたらいいのに
URLリンク(myfuturesightforpast.blogspot.com)
63:デフォルトの名無しさん
18/09/26 07:43:20.75 yzZF1GUc0.net
ったく、そっちじゃねーよ
URLリンク(togetter.com)
簡単にまとめるとだな。Androidでは sh は /bin/sh に存在しない
/system/bin/sh だから、どちらでも通じるシバンは書けない
なら書かなくて良いのでは?
→ そのとおり。POSIXではシバンがなければshで起動されると明記されてる
(注意 ログインシェルとしてcshを使用してる場合、先頭一文字目が#
つまりコメント行だったらcshで起動されるので:コマンドなどで無効化する
cshはファイルの先頭が#でなければPOSIX shで起動する)
64:デフォルトの名無しさん
18/09/26 08:05:31.15 p8TYnMT50.net
ちなみに
bash$ cat ./sbtest.sh
ps -o comm= $$
bash$ ./sbtest.sh
bash
↑↑ Bashじゃねーか
っていう罠もある。
65:デフォルトの名無しさん
18/09/26 09:25:36.26 pB5sfbMh0.net
ちょっと質問です。
プログラムが終了していたら再起動し、20秒以上動いていたら強制終了させて再起動したい。
どう書けばいいですか?
66:デフォルトの名無しさん
18/09/26 09:56:06.94 QtvShas/a.net
>>65
そうだなあ。Linuxとかならkillでシグナル番号0を送ると指定のプロセスの生死を確認できるのでそれ利用して作るかな。
しかしその場合は動いているプロセスのPIDがわからないとダメだ。これがわからない状態でやらねばならない場合はpsの出力にgrepして探すかな。
67:デフォルトの名無しさん
18/09/26 10:01:22.38 FJCeOZRMr.net
> プログラムが終了していたら再起動し、
親シェルスクリプト(プログラム)作ってループ起動
例えばcronの5分間隔とかにすると隙間が開く可能性がある
> 20秒以上動いていたら強制終了させて再起動したい。
監視シェルスクリプト(プログラム)作る
起動させた時間はpsコマンドで分かる
今の時刻はdateコマンドで分かる
強制終了はkillコマンドでできる
監視の間隔(チェックを何分おきにやるか)は自分で決める
例えば1分間隔で監視したら最悪60秒以上動く場合がある
waitしないループは結構CPUに負荷をかけるから注意
68:デフォルトの名無しさん
18/09/26 11:15:01.91 yzZF1GUc0.net
こんな感じかねぇ
プログラム名からプロセスIDを取得して変数に入れる
while :; do
psコマンドでプロセスID変数の起動時間取得
if 取得できたら; then
if 20秒以上経過していたら; then
kill プロセスID
fi
else # 取得できなかったら
プログラム起動 &
新たなプロセスIDを変数に入れる
fi
sleep 1
done
69:デフォルトの名無しさん
18/09/26 15:07:59.55 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:デフォルトの名無しさん
18/09/26 15:10:23.80 yzZF1GUc0.net
長文乙w つーわけで、サブシェルの中から変数を返す方法 汎用版
i=0
eval "$(cat /etc/hosts | { while read line; do
i=$((i+1))
done
set
})"
echo $i # 俺の環境では11だった
set呼ぶだけで、簡単に変数返せるぞ
71:デフォルトの名無しさん
18/09/26 15:11:28.48 yzZF1GUc0.net
ちなみにbashとかだとデフォルトでは関数まで返しちゃうので注意な
72:デフォルトの名無しさん
18/09/26 22:48:58.32 p8TYnMT50.net
シェルスクリプトじゃないんだけど
Makefileのファイル名(例えばGNUMakefileだったりmakefileだったりするよね)
を取得したりってできる?
つまり
$ cat ./Makefile
all:
>---echo $0
$ make
Makefile
みたいな。もちろんMakefileはshが解釈しないんで, $0を使うことはできないけど。
73:デフォルトの名無しさん
18/09/26 23:44:41.88 p8TYnMT50.net
追記
GNU makeなら$(MAKEFILE_LIST)が使えるらしいがFreeBSDでも使いたいんだよね……
74:デフォルトの名無しさん
18/09/27 00:12:48.73 indBRC1Z0.net
MAKEFILE_LIST
URLリンク(www.freebsd.org)
75:デフォルトの名無しさん
18/09/27 00:23:32.14 IUmy3t5S0.net
all:
@echo $(lastword $(MAKEFILE_LIST))
とか。
76:デフォルトの名無しさん
18/09/27 00:24:08.12 IUmy3t5S0.net
おっと、TAB が使えないんだったな
77:デフォルトの名無しさん
18/09/27 00:36:01.18 indBRC1Z0.net
ああ、>>74はめっちゃ古いのか
.MAKE.MAKEFILES
URLリンク(www.freebsd.org)
今度は試してみたが確かにっぽい
78:デフォルトの名無しさん
18/09/27 02:38:06.19 RGPgoULv0.net
>>70
なんでcatがいるの?
catなくせば苦労しないんじゃないの?
79:デフォルトの名無しさん
18/09/27 02:48:37.10 Fk1HpByz0.net
>>78
catはただの一例にすぎん。そこは本質ではない。
サブシェルの中の変数を、サブシェルの呼び出し元に
戻す方法の話をしてる
80:デフォルトの名無しさん
18/09/27 03:09:09.89 Fk1HpByz0.net
もう少し見やすく、汎用的な書き方をするとこんな感じかな
サブシェル(change_vars)内で追加や変更した変数を
すべてサブシェルの親に返す方法
# もちろん例
change_vars() { i=123; }
eval "$(somecommand | { change_vars; set; })"
echo $i
実際には変更してないものすべてを再代入してるわけだが
それを行った所で問題はない。
ただしreadonlyを使ってると代入できなくてエラーになる。
これはなにかいい回避策はないだろうか
81:デフォルトの名無しさん
18/09/27 03:23:00.68 Fk1HpByz0.net
readonlyになってる変数一覧はreadonly -pで取得できる
その結果をパースしてごにゃごにゃやればできるんだろうけど、
readonly -pの結果が、
bashだと declare -r a="1"
dashだと readonly a='1'
と異なるのでパースが面倒くさい上に、
変数名がわかったからといってどうするのだ?問題がある
サブシェル内でもreadonlyだからunsetできない。
setをパースして消すのは改行文字とかの対応で面倒
エラーを無視しようにもうまくいかない
詰んだw
82:デフォルトの名無しさん
18/09/27 03:37:41.74 GWQb325r0.net
"Field with Space" "Second Field" ...
みたいなフィールの連続に対して一番初めのフィールドを取得したいんだけど
なんかいい方法ない? ただしフィールドのなかに特殊な文字は含まれないし、「"」記号もフィールを区別する目的以外には使われてない。
これコマンドに渡す引数の形と似てるから$1とか上手く利用したらいい感じの処理ができそうなんだけど
思い付かん……。
83:デフォルトの名無しさん
18/09/27 03:38:09.61 GWQb325r0.net
なぜかフィールドが二箇所でフィールになってるww
84:デフォルトの名無しさん
18/09/27 03:50:48.26 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:デフォルトの名無しさん
18/09/27 04:38:59.49 GWQb325r0.net
あーやっぱり変数に代入する感じか。
(データが安全なのは保証されてるんだけど 長いんだよね)
でもありがとう。とりあえずそれで行く。
86:デフォルトの名無しさん
18/09/27 04:43:30.53 Fk1HpByz0.net
変数というか、$1, $2, ... だけど
変数($1等含む)に入れないでどうやれとw
標準入力?
87:デフォルトの名無しさん
18/09/27 05:30:19.44 GWQb325r0.net
いや 結局変数に入れることと一緒なんだけど
$ echo '"Field with Space" "Second Field"' | { eval set -- "$(cat -)"; echo $1; }
みたいにしてみた。というのは実際のデータは標準出力から流れてくるから
できるだけパイプで処理したいなというのがあった。
いずれにせよeval setなんて思い付きもしなかったんで むちゃくちゃ感謝してる。
難癖を付けてる訳ではないよ。いやマジで。
88:デフォルトの名無しさん
18/09/27 07:41:11.09 wRik+4En0.net
>>87
別に気分悪くしたとかじゃなくて、
なにか処理するなら結局変数に入れるよなーってだけだよ
標準入力からでもreadで変数に入れるわけだし
最近eval多用してる。もちろんそれがどうしても必要だからだけど
特に速度が遅くなるわけでもないし色々と便利
89:デフォルトの名無しさん
18/09/27 09:31:12.30 0Kr1SoI20.net
丁寧な回答をもらっておいて「でも」「とりあえず」は失礼だろう
「お前の回答はイマイチだが時間もないし採用してやるか」という感じかな?
90:デフォルトの名無しさん
18/09/27 09:36:53.29 wRik+4En0.net
今日の荒らしは>>89
91:デフォルトの名無しさん
18/09/27 10:20:00.38 pwwRK9qRa.net
荒らし認定兄貴今日もお疲れ様です
92:デフォルトの名無しさん
18/09/27 11:06:37.78 RGPgoULv0.net
正論を書くとあらし認定されるんですね
93:デフォルトの名無しさん
18/09/27 12:20:46.63 99b9Jx0Mr.net
大体失礼なのはこの手の答えたがりw
94:デフォルトの名無しさん
18/09/27 13:17:03.86 U92lHhY6a.net
>>70
それ set じゃなくて最後に echo i=$i だけで良いのでは?
95:デフォルトの名無しさん
18/09/27 14:01:53.41 wRik+4En0.net
>>94
だから汎用的な解だってばw
変数が複数あっても対応できるし
変数の中にエスケープが必要な文字があっても対応できる
あ、これに関して良いアイデアが浮かんできた。気がするw
96:デフォルトの名無しさん
18/09/27 14:05:58.33 wRik+4En0.net
こういう問題について考えていると、bashの拡張ってよく考えられてるなって思うよ
ちゃんと足りなくて必要な機能を追加してくれてる
URLリンク(qiita.com)
97:デフォルトの名無しさん
18/09/27 17:43:23.75 GWQb325r0.net
URLリンク(www.gnu.org)
こういうのとかもすっげえ便利だよね。
$ VAR=val; echo ${VAR@A}
VAR='val'
でも新しい機能なのか,日本語版のマニュアルに掲載されてない。
(まあ俺はPOSIXに準拠したほうがいいと思ってるので,こういう機能は
それこそ一時的な使い捨てスクリプトにしか使わんけど)
98:デフォルトの名無しさん
18/09/28 02:21:47.32 5yuIehG00.net
>>97
それCentOS7に入ってるbashではエラーになる。
新しい機能だな。
99:デフォルトの名無しさん
18/09/28 10:45:59.06 TLhVFQk50.net
ファイルのメディアタイプを取得する汎用な方法ってあるかな。
自作してもいいんだけどできれば既存のものを利用したい。
file(1)コマンドの-iオプションがまず思い付いたんだけど,これは
GNU/Linux(URLリンク(man7.org))
FreeBSD(URLリンク(www.freebsd.org))
ではメディアタイプで出力するとあるのに対し
本家POSIX(URLリンク(pubs.opengroup.org))
Solaris(URLリンク(docs.oracle.com))
AIX(URLリンク(www.ibm.com))
なんかでは特になんの指定もなし……。
メディアタイプなんてド標準なんだから,しっかり規定しておいてほしかったなぁ。
POSIX 2017あたりでさ。
100:デフォルトの名無しさん
18/09/28 13:07:01.59 bPXaydqo0.net
>>99
メディアタイプの種類自体は標準化されていたとしても、
あるファイルがどのメディアタイプかってのは決まらないでしょ?
拡張子cgiのスクリプトファイルだって、ソースコード配布サイトなら
テキストファイル扱いにしたいだろうし
101:デフォルトの名無しさん
18/09/29 13:10:10.20 d3Gl2lPg0.net
特別な意味をもたせた終了コードをなんにしようかな?って考えてるんだけど
既存で使われてる終了コードとなるべくかぶらせたくない。
どんなのがあるか知らない?
1, 2, 126, 127, 255(bashの予約)
0~63(fsckで使用)
64~78(sysexits ユーザー用のうち定義済みのもの)
128~192(シグナルコードの範囲?)
参考
URLリンク(ja.wikipedia.org)
URLリンク(linuxjm.osdn.jp)
URLリンク(linuxjm.osdn.jp)
URLリンク(kaworu.jpn.org)
URLリンク(tldp.org)
一番最後のリンクでsysexitsの作者は64~113をユーザー用に使うことを提案してるみたいだけど
定義済みを除けば残りは79~113かな
102:デフォルトの名無しさん
18/09/29 13:18:50.90 IuTgmxg/0.net
オツムに欠陥があるヤツでなければ
普通に別の環境変数にいれる
103:デフォルトの名無しさん
18/09/29 14:08:42.53 PPHj/b7C0.net
>>101
ていうか寧ろそのなかのどれかでいいんじゃないの?
それともその定義に収まらないエラーなの?
鼻からドラゴンが出ました!exit 80 とか。
104:デフォルトの名無しさん
18/09/29 15:12:55.62 d3Gl2lPg0.net
>>103
そう言われるかなとは思ったw
「俺の作ったプログラム」 ==> 「俺の作ったフィルタ」 ==> 「任意のプログラム」
という呼び出しの流れで
「俺の作ったプログラム」 で「任意のプログラム」 の終了コードを知りたいが、
「俺の作ったフィルタ」 独自の終了コードだけは特別扱いしたいということ
「任意のプログラム」のエラーは想定外のエラーで
「俺の作ったフィルタ」のエラーは想定されたエラーで
どちらもエラーではあるんだけど「俺の作ったプログラム」で表示するメッセージが違う
それぐらいなので、かぶってしまっても大きな問題は発生しないんだけどね
105:デフォルトの名無しさん
18/09/29 17:52:02.97 PPHj/b7C0.net
>>104
なるほど。
たしかにそういう目的ならば,終了コードが〝混ざる〟のはよくないな。
しかし例えばapt(1)は非root権限でシステム操作しようとすると
exit 100を返すというトンデモ仕様[Debian 2015]なので,もうどうしようもないんじゃねw
せっかくsysexitに権限異常を示す77があるのにどうして100番を使ってしまったのか……。
[Debian 2015]: URLリンク(manpages.debian.org)
106:デフォルトの名無しさん
18/09/29 17:54:32.38 PPHj/b7C0.net
ああ,なんか説明不足で投稿しちゃった。
つまりさ,一応標準で定められたエラー番号はあるものの,
各種アプリケーションが従っている訳でもなく
Debian系のaptコマンドのような超大手のアプリケーションでさえ標準を無視してるんだから,
> 定義済みを除けば残りは79~113かな
↑こういうのは考えないほうがいいんじゃない? ってこと。
107:デフォルトの名無しさん
18/09/29 18:22:23.04 d3Gl2lPg0.net
>>105-106
どこかのなにかにかぶってしまうのは防ぎようがないけど
よく使われるコマンドがこんな終了コードを使っていたっていう事例を知りたいのよ
fsckとかどう見てもエラーじゃねーだろコレっていうのが
エラーあつかいになってて以前はハマったことあるしw
URLリンク(linuxjm.osdn.jp)
> 1 - ファイルシステムのエラーが修正された
108:デフォルトの名無しさん
18/09/29 18:23:25.37 d3Gl2lPg0.net
標準に準拠したいとかそういう話ではなく
単にぶつかりたくないだけ
109:デフォルトの名無しさん
18/09/29 18:24:45.45 d3Gl2lPg0.net
> exit 100を返すというトンデモ仕様[Debian 2015]なので,もうどうしようもないんじゃねw
実を言うと今100を使おうとしていたw
やはり裏の裏の裏の裏ぐらいを読まないとダメだなw
110:デフォルトの名無しさん
18/09/29 18:40:55.97 PPHj/b7C0.net
非0の返り値だけどコマンドは成功しているっていう例として有名なのはdiff(1)とかかな。
URLリンク(pubs.opengroup.org)
>1
> Differences were found.
111:デフォルトの名無しさん
18/09/29 18:46:56.62 8M0IW2fy0.net
シグナルでも使ってみたらどうだろうか。
あるいは別にパイプを用意するとか。
112:デフォルトの名無しさん
18/09/30 02:44:50.58 KPqVv5wd0.net
絶対にぶつからないようにするには別の方法でエラーを伝えるようにするぐらいしか方法ないんじゃないか?
同じ値になる可能性のあるものをどちらから発生したかわからない状態で同じ所から得るなんてやはり無理があるだろう。
113:デフォルトの名無しさん
18/10/01 01:15:09.47 2Ehpmx/A0.net
こんな書き方できたのか
a=1
case $a in
( 1 ) echo ok
esac
114:デフォルトの名無しさん
18/10/01 02:02:45.71 IEGoOL+v0.net
お、おう
115:デフォルトの名無しさん
18/10/02 19:23:29.52 6qOrAQgQ0.net
お題
ある関数に対して、apple orange banana ... とN個(Nは任意の個数)の引数を渡した時、
以下のような、引数とその引数のインデックス番号を出力する関数を作成せよ
(単語に対して数値が対応しているわけではない)
apple 1
orange 2
banana 3
:
ただし、外部コマンド、拡張POSIX機能、変数の使用は禁止とする
(ここでいう変数とはsetコマンドで表示されるもののことである)
116:デフォルトの名無しさん
18/10/02 21:27:13.63 yoF3UpeG0.net
>>115
argidx()
{
i=1
for argv in "$@"; do
echo "${argv}" $i
i=$((i+1))
done
}
簡単すぎ
117:デフォルトの名無しさん
18/10/02 21:45:46.37 yoF3UpeG0.net
おいこら答えてやったんだからなんとか言えよコラ
エレガントすぎて腰が抜けたか?wwwww
まあ実際,自分で言うのもなんだけどかなり最良に近い方法じゃないかしら。
・POSIX.1-2017準拠
・空白などを含む引数も直感的に指定可能("word with space")
・単純 構造が簡単
・数値の増加にexpr(1)ではなく算術式を利用している為速い
118:デフォルトの名無しさん
18/10/02 22:03:54.77 kkfm+1S90.net
変数禁止だから不正解じゃない?
119:デフォルトの名無しさん
18/10/02 22:15:20.79 xDUI5Isc0.net
>>115といい、>>117といい変なヤツしかいないやんけ
120:デフォルトの名無しさん
18/10/02 23:00:16.05 xTxFBCr4a.net
最初の一個だけならスマートだったのに
褒められたがりが
121:デフォルトの名無しさん
18/10/03 00:30:44.79 ej0n10jM0.net
煽りだよ だって明らかに学校の課題かなにかでしょ。
そんなのに真面目に付き合うほど俺は素直じゃない。
122:デフォルトの名無しさん
18/10/03 00:44:57.49 m57KKa9e0.net
苦しすぎな言い訳w
123:デフォルトの名無しさん
18/10/03 01:48:10.18 ej0n10jM0.net
まあそう思っとけw
124:デフォルトの名無しさん
18/10/03 01:59:13.13 jikKostS0.net
>>115
echo は使っては駄目? 拡張されていない sh だと echo はビルトインではなく /usr/bin/echo だと思うが。
125:デフォルトの名無しさん
18/10/03 02:01:17.96 NkO7phbc0.net
>>118
そう。変数禁止なので不正解
>>121
変数禁止とか学校の課題ででるわけないじゃないw
126:デフォルトの名無しさん
18/10/03 02:03:27.25 NkO7phbc0.net
>>124
使ってOK。
俺の知る限りechoがビルトインでないものは知らない
関係ないけどechoみたいな基本的なコマンドが
シェルによって挙動が違うのはどうにか
ならなかったんだろうか
127:デフォルトの名無しさん
18/10/03 02:14:54.02 NkO7phbc0.net
そうか。evalとか外部コマンドは実装不可能なものを除いて
ビルトインで実装することなんて決まりはないのか
では外部コマンドの定義を「現存するシェルでビルトインで実装されたことがないもの」にしよう
オレオレシェル作ってビルトインするのは問題の意図から外れるので、
現存する(誰もが容易に入手可能な)いずれかのシェルで
ビルトインされているならば使って良いものとする
128:デフォルトの名無しさん
18/10/03 02:18:56.23 NkO7phbc0.net
あと拡張POSIX機能も使用してOKにしよう。
それを実現する裏技みたいなのがあったら嫌だなと思って入れたが、
もしそれでできるなら俺も勉強になるし。
ようするにPATH環境変数を空にして、どれかのシェルで動けばOKってことだな
条件がグダグダになってしまったw
129:デフォルトの名無しさん
18/10/03 12:27:47.15 61GCF4dla.net
if や while を外部コマンド動かさずに使うには [ がビルトインのシェルでないとダメだな。
昔の sh は [ が test コマンドへのシンボリックリンクで外部コマンドだったし。
今でもその名残で /bin または /usr/bin に [ が入ってるよな。
130:デフォルトの名無しさん
18/10/03 13:43:00.79 NkO7phbc0.net
別件で現在主要のシェルで何がビルトインか調べたことがあるよ
. : [ break cd command continue echo eval exec exit export false kill pwd
read readonly return set shift test times trap true umask unset wait
これらは全てのシェルで使えると言っていいだろう
poshはログインシェルとしては使わないもの扱いなのか
alias bg fg type ulimitが削除されている。(typeないとか地味につらい)
busyboxはgetoptsがないみたい
意外だったのはprintfがビルトインでないシェルがmkshとposhの2つもあったこと。
しかも両方共echoでエスケープシーケンスを解釈してくれるから文字をそのまま出力できない。
mkshの方はset -o posixでエスケープシーケンスを無効にできるしビルトインのprintで代用できるんだが
poshは調べた限りビルトインコマンドでそのまま出力する方法がない
131:デフォルトの名無しさん
18/10/03 13:47:38.74 m57KKa9e0.net
いいから、お題の参考答えを出しなさいw
オレオレ定義が曖昧すぎでお題になってないから、もういいでしょ
132:デフォルトの名無しさん
18/10/03 13:57:02.54 NkO7phbc0.net
>>131
問題訂正してやるから、もう少し頑張れやw
お題
ある関数に対して、apple orange banana ... とN個(Nは任意の個数)の引数を渡した時、
以下のような、引数とその引数のインデックス番号を出力する関数を作成せよ
(単語に対して数値が対応しているわけではない)
apple 1
orange 2
banana 3
:
ただし、変数の使用は禁止とし、シェル機能とビルトインコマンドのみを用いること
(ここでいう変数とはsetコマンドで表示されるもののことである)
(使用するコマンドはいずれかのシェルのビルトインコマンドであればよいが、
この問題用に独自シェルを作成するのは禁止とする)
133:デフォルトの名無しさん
18/10/03 13:59:49.96 m57KKa9e0.net
なんの目的かさっぱりわからんな。自分でできてんの?っていう疑問からなんだけどなw
>変数の使用は禁止とし
>(ここでいう変数とはsetコマンドで表示されるもののことである)
環境変数のことを言っているのかと思えば違うし、これだけでも曖昧というかオレオレ定義が曖昧だろう
134:デフォルトの名無しさん
18/10/03 14:11:05.97 NkO7phbc0.net
>>133
setコマンド実行してみてみばわかるでしょw
setコマンドで表示される変数はシェル変数(環境変数含む)だよ
それを使うのは禁止ってこと
135:デフォルトの名無しさん
18/10/03 14:13:32.35 NkO7phbc0.net
今日の24時までに答えが出なければヒント出しますw
136:デフォルトの名無しさん
18/10/03 14:16:57.73 6m7pNgyW0.net
そのヒントとやらもグダグダなんでしょw
137:デフォルトの名無しさん
18/10/03 14:17:05.40 m57KKa9e0.net
変数を使わない 言語(マシン語すら) は知らんなあ。そういう縛りを設けての目的はなんなん?
やってみたできるけど、クソのようなwにしかならんから、どうか、参考の答えを出してw
138:デフォルトの名無しさん
18/10/03 14:19:23.20 NkO7phbc0.net
答えは明日。まあヒントみれば気づく人はすぐわかるでしょう。
コロンブスの卵だよ
139:デフォルトの名無しさん
18/10/03 14:20:30.02 m57KKa9e0.net
なんで常時上から目線なのかw コードで語ればいいのに
素晴らしいコードならそんなおれおれ上から目線しなくてもいいくらいなのに。なんかしらんがもったいつけてのまだ「ヒント」とかもったいつけてるしw
140:デフォルトの名無しさん
18/10/03 14:21:39.64 m57KKa9e0.net
なんかしらんが見つけて、俺すげーしたいだけっぽいなw
141:デフォルトの名無しさん
18/10/03 14:22:11.11 NkO7phbc0.net
> そういう縛りを設けての目的はなんなん?
その理由も答えと一緒に明かします
142:デフォルトの名無しさん
18/10/03 14:23:23.18 m57KKa9e0.net
いや、もういらんわw なんかキモすぎて付き合いきれないw
143:デフォルトの名無しさん
18/10/03 14:36:43.15 ej0n10jM0.net
多分だけど学校の課題だと予想
根拠は二点:
1. 問題が実利的でない。学校(それもあまり学力の高くない)にありがちな「こんなのできるかな?」系の問題である。
2. 煽ったらそれに乗っかって答えを出してくれる人が思ってるという点で質問者が精神的に幼ない。(高校生くらいか?)
144:デフォルトの名無しさん
18/10/03 14:45:22.66 m57KKa9e0.net
posh とかいつもの人でしょ
いつもの人が学校の課題をしなきゃならん人なのか知らんけどw
145:デフォルトの名無しさん
18/10/03 15:06:30.08 ej0n10jM0.net
poshなんていうシェルがあるのね。初耳だわ。
146:デフォルトの名無しさん
18/10/03 15:10:04.24 NkO7phbc0.net
>>2に書いてあるよ。俺もここ(の何スレか前)で初めて知った
147:デフォルトの名無しさん
18/10/03 15:58:50.21 4kFnpcnsa.net
$# と shift を使って逆順に値を付加することは簡単にできたんだがな。
148:デフォルトの名無しさん
18/10/03 17:25:26.25 NkO7phbc0.net
>>147
俺も第一歩目はそこまでだったw
俺の本来の目的(今回の問題とは別件)は逆順でも実現できたんだけど
なんか悔しかったので、もう一歩進めたら逆にすることなく実現できた
149:デフォルトの名無しさん
18/10/03 21:20:26.89 SM8JpmZX0.net
ちょっと前にもこんなグダグダ無かったっけ?
150:デフォルトの名無しさん
18/10/03 21:48:53.18 Tma5IQlaF.net
変数使ってはダメって、非合理的でない?
シェルの仕様否定してどーするの?
外部コマンドだって、それがUNIXの設計思想なんだからそれさえも否定するってのも理解不能
ならば、OSそのものを仮想的なものを仮定して
その上で動かすとでもしないと
大昔の情報処理技術者試験用に作られたアセンブラみたいな感じでさ
変数使わない、外部コマンド使用禁止、そんなアルゴリズムが何の役に立つんだろう?
151:デフォルトの名無しさん
18/10/03 22:35:14.41 ej0n10jM0.net
でも前はワッチョイやIDがなかったから もっと酷かった。
今はNGすればオッケー☆
152:デフォルトの名無しさん
18/10/04 00:37:38.01 8ua9ZMtc0.net
ヒント忘れてたわw
func() {
*********
while [ $# -gt 1 ]; do
*********
shift
done
}
func apple orange banana
********の所は1行とは限りません
153:デフォルトの名無しさん
18/10/04 00:41:45.65 8ua9ZMtc0.net
>>150
シェルスクリプトはPOSIXの範囲では
ローカル変数がないから、変数名がかぶると困るんだよ
もちろんサブシェルを使うという手もあるが
引き出しは多いほうが良い
154:デフォルトの名無しさん
18/10/04 00:43:44.36 8ua9ZMtc0.net
>>151
それなw 見たくないやつが絡んでこなくなったので
過ごしやすくなった。
155:デフォルトの名無しさん
18/10/04 00:46:12.13 8ua9ZMtc0.net
>>150
ちなみにこれアルゴリズムじゃないよ
アルゴリズム系だと一時変数を使わずに変数を入れ替える方法とかあるけど
これはシェルの機能を使った、あぁ、なるほど系の問題
156:デフォルトの名無しさん
18/10/04 00:49:17.75 C6pwZkBD0.net
いきなりレス数増えたと思ったらもう木曜か
157:デフォルトの名無しさん
18/10/04 04:55:02.39 /YMF27MO0.net
>>152よ、お前のなかでは「$#」は変数じゃないのか……。
人様にクイズとやらを出す前にシェルとはなんなのかを学んだらどうだ?
158:デフォルトの名無しさん
18/10/04 05:43:44.35 8ua9ZMtc0.net
出題ぐらいちゃんと読もうぜw
> ただし、変数の使用は禁止とし、シェル機能とビルトインコマンドのみを用いること
> (ここでいう変数とはsetコマンドで表示されるもののことである)
159:デフォルトの名無しさん
18/10/04 08:51:53.43 /YMF27MO0.net
bash 4.2以降はset組み込みコマンドの中に$#が含まれるようになったんだよなぁ…
ちゃんと調べて、どうぞ。
160:デフォルトの名無しさん
18/10/04 09:17:07.53 8ua9ZMtc0.net
ないですね。ちゃんと調べてどうぞ
foo() { set | grep '#='; }; foo
$ bash --version
GNU bash, バージョン 4.4.19(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <URLリンク(gnu.org)
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
161:デフォルトの名無しさん
18/10/04 09:50:29.05 8DudSISka.net
>>160
grap のパターンはそれでいいのか?
162:デフォルトの名無しさん
18/10/04 10:01:44.50 8ua9ZMtc0.net
>>161
良いに決まってるだろ
正規表現に自信がないなら自分で調べたら?
質問してるってことは、動かしてないんだろうし。
163:デフォルトの名無しさん
18/10/04 10:47:30.53 8DudSISka.net
ああ。そうか。最初の$は要らないからそれでいいのか。
164:デフォルトの名無しさん
18/10/04 14:55:58.09 7ib5/eAS0.net
grap コマンドか、なんか強うそうなイメージ
165:デフォルトの名無しさん
18/10/04 16:22:52.78 /YMF27MO0.net
なんかもう誰かが作ってそうだよね。
まるでyaから始まる4文字のソフトウェアが被りまくってるように。
166:デフォルトの名無しさん
18/10/04 16:55:15.20 8ua9ZMtc0.net
犯人はya
167:デフォルトの名無しさん
18/10/04 20:00:19.77 8ua9ZMtc0.net
正解者もいないようなのででは解答
このコードがどういうときに有用かは>>153で書いたとおり
set は使わなくても別にもう一つ関数を作れば同じことができるが
関数を作らずとも引数の再設定という方法がある。意外と便利だよ
func() {
set -- "$@" $(($#+2))
while [ $# -gt 1 ]; do
eval "echo \"$1 \$((\$$#-$#))\""
shift
done
}
func apple orange banana
168:デフォルトの名無しさん
18/10/04 20:11:54.69 n5lIiyiD0.net
そんなクソなコードを意気揚々としてあげてるけどさ、なんか変数被るからというもっともらしい言い訳してたけど、なるべく変数使わないように書くわけだ、これから。ほーっw。そんなのクソだな、個人的にw
なんでそういうお題をそんな俺偉いじゃなくてできないのかな。よほどそれを出すのに時間かかったとか??
169:デフォルトの名無しさん
18/10/04 20:12:23.41 8ua9ZMtc0.net
はい。想定通りのレスだね。
言い訳だけは一人前w
170:デフォルトの名無しさん
18/10/04 20:13:26.14 n5lIiyiD0.net
いや、ふつうわかるだろう。まあ、かなり頑張って出したんだね、やっぱりw
171:デフォルトの名無しさん
18/10/04 20:14:13.91 8ua9ZMtc0.net
じゃあもう一問。そんなに言うなら次は答えてね
172:デフォルトの名無しさん
18/10/04 20:15:02.61 n5lIiyiD0.net
だから、なんでそんな上から目線なのよ
んなのに付き合うと思ってるの?あんた自体が上から目線でモノ言われたらすぐ反発するくせにww
173:デフォルトの名無しさん
18/10/04 20:18:43.51 n5lIiyiD0.net
いや、上から目線じゃなくても反論されたらかwww
174:デフォルトの名無しさん
18/10/04 20:20:37.56 8ua9ZMtc0.net
>>172
お前はこのおっさんと同じ種類の人間だろうな
相手が下だと思って接してるやつ。
まずお前が上から目線を止めたら?
URLリンク(togetter.com)
おっさんがタメ語で聞いてきたからタメ語で返したらショックを受けてた。敬意が返ってくると思ってる日本のおっさんって不思議。
175:デフォルトの名無しさん
18/10/04 20:24:38.91 n5lIiyiD0.net
いや、お前に合わせているだけだな。さすが常時上から目線なんかしらんが常時上に立ちたいの人は言うことが違うなw
176:デフォルトの名無しさん
18/10/04 20:27:29.69 8ua9ZMtc0.net
上にたってるつもりはないんですが、上に見えちゃうんですかね?w
悪い奴らが「正義の味方のつもりかよwww」って
笑ってるようなシーンがあるけど、あれも悪い奴らに
正義に見えてるからそう言うんでしょうねぇ
177:デフォルトの名無しさん
18/10/04 20:28:28.79 n5lIiyiD0.net
忘れているのか常時上に立っているつもりで気がつけないwのか知らんが、ID:8ua9ZMtc0 の上から目線なレスに対しての俺のレスでしかないよ
なので、その得意げの>>174はそっくりそのままあんたにお返しいたします
178:デフォルトの名無しさん
18/10/04 20:29:44.58 n5lIiyiD0.net
あーあ、病気なのか社会性がないのか話にならんな。まあ、いつもの無理やりなごまかしモードかな?w
179:デフォルトの名無しさん
18/10/04 20:33:31.45 vhCji18k0.net
目くそ鼻くそに上も下もないわwwww
180:デフォルトの名無しさん
18/10/04 20:34:30.94 n5lIiyiD0.net
やかましいわっw
181:デフォルトの名無しさん
18/10/04 20:50:21.03 8ua9ZMtc0.net
これはある意味有名だから簡単だと思う
お題
ある関数に対して1以上の整数Nを引数にして呼び出した時、
1からNまでを出力する関数を作成せよ(要するにseqコマンドの簡易版)
seq 5
1
2
3
4
5
:
ただし、シェルビルトイン関数のみを使い、変数の使用は禁止とする
(ここでいう変数とはsetコマンドで表示されるもののことである)
182:デフォルトの名無しさん
18/10/04 20:52:49.73 vhCji18k0.net
>>181
調子にのるな鼻くそ
183:デフォルトの名無しさん
18/10/04 21:39:22.36 sVn7z6Qaa.net
>>167
それ最初のposix縛りがあったら解けなくないか?
$(( ))で計算させてるし。
184:デフォルトの名無しさん
18/10/04 23:11:17.39 4+O8yrpt0.net
こいつ構わん方がいいゼ、俺スゲーしたいだけだから
185:デフォルトの名無しさん
18/10/04 23:14:04.78 GYhkNq19a.net
レス番飛び過ぎにも程があるだろ
まぁいつもの長文だらだら流して悦に浸ってるんだろうが
186:デフォルトの名無しさん
18/10/04 23:32:35.30 n5lIiyiD0.net
>>183
URLリンク(pubs.opengroup.org)
2004の時点であるらしい。++と--は任意。sizeof()なんてあるのかよっ
187:デフォルトの名無しさん
18/10/04 23:46:42.45 /YMF27MO0.net
>>181
これは興味から訊くんだけど,
「(POSIXの範囲では)変数の局所化ができないので
変数をなるべく使わないべき」
という主張は理解できるし,俺自身もそう思う。
しかしシェルビルトイン関数しか使わず,例えば
sed(1)やawk(1)など目的に合った有用なコマンドを用いない理由はなんだ?
ただの趣味?
188:デフォルトの名無しさん
18/10/05 01:23:25.22 x9IT1j0q0.net
>>181
$(( )) での計算をしていいなら簡単だよ。
#!/bin/bash
f() {
if [[ $1 -gt 0 ]]; then
f $(( $1 - 1 ))
echo $1
fi
}
f $1
189:デフォルトの名無しさん
18/10/05 01:24:51.76 x9IT1j0q0.net
>>186
そうだったのか。
190:デフォルトの名無しさん
18/10/05 02:53:44.46 bSHFQ9XI0.net
>>187
現実的なポータビリティと速度のため
POSIXの範囲でやれば、シェルが異なっても動くことが期待できる
だけど現実的にはすべての環境がPOSIXに準拠してるわけではない
特にbusyboxは組み込み向けに必要最小限の機能に減らせるから
sedやawkすらない環境というのもあり得るだろう
そしてもう一つforkは遅い。WSL上だと目に見えて遅い
以下のコードをWSLで実行すると約25秒かかる。fork一回あたり2.5ミリ秒
Linuxだと約2秒。fork1回あたり2ミリ秒。10倍以上の差がある
i=0
while [ $i -lt 10000 ]; do
( :; )
i=$((i+1))
done
この()を外すとWSL上で0.05秒にまで減る。コマンド実行のオーバーヘッドに
埋もれてしまってよくわからないので、10,000から1,000,000から増やすと約1.7秒
つまり一回あたり0.0017ミリ秒。この値はLinuxでも変わらない
外部コマンドの実行でもforkが行われるから
Linux・・・0.0017ミリ秒 → 2ミリ秒 (約1176倍)
WSL・・・0.0017ミリ秒 → 25ミリ秒 (約14706倍)
と大幅に速度が落ちる。シェルスクリプトが遅いと言われる原因の一つ
191:デフォルトの名無しさん
18/10/05 02:58:21.89 elz6X2140.net
なんもわかってない低学歴知恵遅れが
はりきってしょうもないwsl使ってキャッキャッいってるわけか
なるほどなるほど
wsl使ってるのなんかニートぐらいしかいないわ
マジで
192:デフォルトの名無しさん
18/10/05 03:00:21.47 bSHFQ9XI0.net
>>188
やっぱり簡単だったかw
再帰を使うやり方で関数型言語ではおなじみの問題
もちろんシェルスクリプトは関数型ではないし
末尾最適化も行われないのでどうしても遅くなる
さすがにこれは変数使ったほうが良いかな思ったw
他にも問題を作れそうなネタのはいくつかあるんで
気が向いたらまた問題にしてみるよ
193:デフォルトの名無しさん
18/10/05 03:01:11.86 bSHFQ9XI0.net
>>191
やっぱ内容には全く触れず
叩けそうな所を叩くだけなんだなw
技術者としてつまらないね
194:デフォルトの名無しさん
18/10/05 03:25:46.03 98l9MfY+0.net
実用的じゃないもの書いてるうちは似非の技術者じゃの
195:デフォルトの名無しさん
18/10/05 03:52:16.47 DwOdckeN0.net
>>190
シェルスクリプトはストリーミング指向だから
そもそも制御文を多用することは避けたほうがいいのではってのは違うのかな。
196:デフォルトの名無しさん
18/10/05 08:48:03.27 bSHFQ9XI0.net
>>195
ストリーミング指向と制御文はあまり関係ないと思うよ
流れてくるものに対してなにか処理をしたいなら必ず
制御文を使うことになるし
ストリーミング指向の話をするなら、関数呼び出しし結果の標準出力を
変数にキャプチャするっていうのはストリーミング指向と反してると思う
例えば result=$(command "$data") みたいな形のことね
俺もこの書き方はなるべく避けるようになった
ストリーミング指向的には echo "$data" | command | 別のなにか
とするほうが良いだろう
ただ気づいたのがこの形だとサブシェルになってしまうから、
commandや別のなにかから、呼び出しの起点にデータを戻すことが
簡単にはできないという所。値を戻すこと自体がストリーミングの流れに反しているし
かと言ってそれが必要な場合もある。例えば処理した行数をカウントしたりとかね。
なので最近はイベントハンドラ方式を使うようになった
echo "$data" | command "別のなにか(関数名)" (または command "$data" "別のなにか")
例えばだけどこんな感じにして、commandで$dataを1行ずつ処理して
その都度、別のなにか(関数)を呼び出す。そうするとサブシェルにはならないので
ストリーミングで処理しつつ、グローバル変数経由で呼び出し元に結果を返すことができる
この時、別の何かがシェル関数の場合に、commandが外部コマンドだとシェル関数を呼び出せないので
連鎖的にcommandもシェル関数として実装。みたいなこともやってたりする
197:デフォルトの名無しさん
18/10/05 17:11:32.63 bSHFQ9XI0.net
10. 移植性のあるシェルプログラミング
URLリンク(web.sfc.wide.ad.jp)
198:デフォルトの名無しさん
18/10/05 21:16:49.85 NK5dBb8n0.net
>>196
なるほど。
俺は
URLリンク(www.ipsj.or.jp)
ここの3.1.1を読んで、制御文をなるべく使わない方向に開発をシフトしてみたんだよね。
まあどうしても必要な部分はあなたも云ってる通りもちろんあるけど。
199:デフォルトの名無しさん
18/10/06 08:20:34.66 Sfai+wMy0.net
>>198
別にその記事に大きく反対したいわけじゃないけど
おかしな点は指摘しておかないといけない
その手続き型コーディングがステップ数が多く処理効率が低いと書いてある所だが
その原因はストリーミング型コーディングのせいじゃない
rmコマンドの発行回数が原因だ
■手続き型コーディング(ステップ数が多く処理効率が低い)
i=3
while [ $i -le 10000 ]; do
file="file${i}.txt"
rm -f "$file" # 何度もrmコマンドを実行している
i=$((i+3))
done
結果
real 0m3.232s
user 0m2.488s
sys 0m0.808s
■ストリーミング型コーディング
awk 'BEGIN{for(i=3;i<=10000;i+=3){print i;}}' |
sed 's/.*/file&.txt/' |
xargs rm -f
結果
real 0m0.040s
user 0m0.004s
sys 0m0.040s
200:デフォルトの名無しさん
18/10/06 08:23:22.22 Sfai+wMy0.net
プロセスが分かれており並列で動く可能性があるから
多少ストリーミング型の方が早くはなるとは思うが
以下のように修正すると差は殆ど無くなる。
■手続き型コーディング修正版
i=3
files() {
while [ $i -le 10000 ]; do
file="file${i}.txt"
echo $file
i=$((i+3))
done
}
rm -f $(files)
結果
real 0m0.052s
user 0m0.018s
sys 0m0.044s
余談だがこれはLinuxで実行した結果だがforkが遅いWSLだと
起動プロセスが多い分逆転するかもしれない
201:デフォルトの名無しさん
18/10/06 08:41:27.69 Sfai+wMy0.net
訂正
その手続き型コーディングがステップ数が多く処理効率が低いと書いてある所だが
その原因は手続き型コーディングのせいじゃない
202:デフォルトの名無しさん
18/10/06 10:50:18.29 10V4sLOp0.net
>>200
非本質的だけど
rm -f $(files)とかだとARG_MAXに引っ掛かる可能性がない?
尤も手元の機械では
$ getconf ARG_MAX
2097152
だったので無問題かも知れないけど。
203:デフォルトの名無しさん
18/10/06 11:49:41.89 Sfai+wMy0.net
>>202
> rm -f $(files)とかだとARG_MAXに引っ掛かる可能性がない?
あるよ。それならxargsを使えばいいし、
xargsはファイルから読み込む方法もあるからパイプ使わなくても使える。
ともかく速さの理由はストリーミング型コーディングではないと言いたかっただけ
だいたいawkの中に書いてあるコードは手続き型だろといいたいし、
ステップ数だってちょっと書き方変えれば、大差ないってのがわかるだろう
i=3; while [ $i -le 10000 ]; do rm -f "file${i}.txt"
i=$((i+3)); done
awk 'BEGIN{for(i=3;i<=10000;i+=3){print i;}}' |
sed 's/.*/file&.txt/' |
xargs rm -f
204:デフォルトの名無しさん
18/10/07 07:00:55.51 9DLOHMhB0.net
お題
関数fooに対して3つ以上の引数を渡した時、1番目と2番目の引数を入れ替え以下の例のように出力せよ
(引数が3つ未満の場合は考慮する必要はなし)
ただし、シェルビルトイン関数のみを使い、変数の使用は禁止とする
(ここでいう変数とはsetコマンドで表示されるもののことである)
foo 1 2 3 4 5
2
1
3
4
5
レベル1: 引数に使用する文字は英数のみとする
レベル2: 引数にダブルクォート、シングルクォート、スペース、タブが含まれていても動作するようにせよ
205:デフォルトの名無しさん
18/10/07 07:03:41.18 9DLOHMhB0.net
あ、いかん。>>204は簡単な解答があるわw
ちょっと修正する
206:デフォルトの名無しさん
18/10/07 07:13:43.37 9DLOHMhB0.net
お題(>>204の訂正版)
次のような関数barがある。
bar() { echo 'begin'; printf '%s\n' "$@"; echo 'end'; }
3つ以上の引数を渡した時、1番目と2番目の引数を入れ替えて関数barを呼び出す関数fooを作成し
以下の例のような出力をせよ(引数が3つ未満の場合は考慮する必要はなし)
ただし、シェルビルトイン関数のみを使い、変数の使用は禁止とする
(ここでいう変数とはsetコマンドで表示されるもののことである)
foo 1 2 3 4 5
[出力]
begin
2
1
3
4
5
end
レベル1: 引数に使用する文字は英数のみとする
レベル2: 引数にダブルクォート、シングルクォート、スペース、タブが含まれていても動作するようにせよ
207:デフォルトの名無しさん
18/10/07 07:18:54.69 9DLOHMhB0.net
余談だが、
func() { printf '%s\n' "begin$@end";} という関数の時、
func 1 2 3 4 5 って書いたら
begin1
2
3
4
5end
func 3 って書いたら
begin3end
って表示されるんだよな。
理解はできるが、なんか不思議だ
208:デフォルトの名無しさん
18/10/08 03:36:26.64 tKqgyITq0.net
お題はお題スレに
プログラミングのお題スレ Part12
スレリンク(tech板)
209:デフォルトの名無しさん
18/10/08 18:41:40.22 IMi/szTI0.net
func -a --foo file1 -b file2 -c --bar
みたいな、オプションとファイル名が交互に来てるときに
オプションを全部解析し終わってから
ファイルに対して処理を実行していくのってけっこう大変なんだな
forで回すのもwhileで回すのも一筋縄ではいかない
もちろんbashなんかの配列を使わないという前提
210:デフォルトの名無しさん
18/10/08 18:48:20.63 IMi/szTI0.net
func -a --foo foo1 file1 -b file2 -c --bar
あ、例えば、foo1は--fooはパラメータ、のようなものが有る場合だった
-で始まる or 始まらないだけで見分けるならまだ簡単
211:デフォルトの名無しさん
18/10/08 18:50:15.77 NcWFD+EU0.net
そもそもそんな指定の仕方ありうる?
ありえない状況を想定してヤキモキするのは非生産的だと思うんだけど……。
212:デフォルトの名無しさん
18/10/08 19:10:00.18 IMi/szTI0.net
>>211
よくやるよ。
前打ったコマンドをヒストリで呼び出して、後ろにオプション追加して実行とか
213:デフォルトの名無しさん
18/10/08 20:52:36.04 NcWFD+EU0.net
>>212
仮にそうだとして ということは
>>210を〝正規化〟すると
func -a --foo foo1 -b -c --bar -- file1 file2
っていうことかな?
214:デフォルトの名無しさん
18/10/08 21:02:29.11 IMi/szTI0.net
>>213
そういうこと
215:デフォルトの名無しさん
18/10/08 23:31:18.49 tKqgyITq0.net
GNUのgetoptのロングのやつ使えればなんとかなるんじゃないか?
216:デフォルトの名無しさん
18/10/09 02:27:08.37 cJ7fFqob0.net
これでいいな。
$ getopt --options 'a,b,c' --longoptions 'foo:,bar' -- -a --foo foo1 file1 -b file2 -c --bar
217:デフォルトの名無しさん
18/10/09 02:29:18.52 i1ZCVGtYa.net
195から207まで丸ごと吹っ飛んでんだがどんだけレスバトルしてたんだ
見る気もないが
218:デフォルトの名無しさん
18/10/09 07:22:02.82 UgeI4/Dm0.net
>>216
Macでは動きませんでした
219:デフォルトの名無しさん
18/10/09 07:51:19.69 cJ7fFqob0.net
>>218
たのむから一つ前のレスくらい読んでくれ>>215
220:デフォルトの名無しさん
18/10/09 07:55:02.13 UgeI4/Dm0.net
>>219
だからMacのgetoptはGNUのgetpotではないから動かないって言ったんだけど?
221:デフォルトの名無しさん
18/10/09 07:57:18.12 UgeI4/Dm0.net
GNUのgetoptなら動く。そうでないなら動かないと言われても、
どの環境がGNUのgetoptかなんてわからないでしょう?
GNUのgetoptがほとんどの環境で使われているなら問題ないが
使われてな環境は多いかもしれない。そしてそれがMacという形で
現実になったということを書いたんだけど
222:デフォルトの名無しさん
18/10/09 07:58:09.40 cJ7fFqob0.net
>>220
ああそうなの。
Macのgetopt(1)がGNU製じゃないことを知らないような書きぶりだったから てっきり。
すまんな
つーか孰れにしても可搬性は皆無w
223:デフォルトの名無しさん
18/10/09 08:18:38.20 UgeI4/Dm0.net
やはりgetoptは可搬性は皆無か
日本語でgetoptでぐぐるとこれが上の方に出てくるけど
相変わらずの、qiitaクオリティってことでいいのかな?
URLリンク(qiita.com)
> 一般に 使用される getopt のテンプレートは以下です。
>
> getopt.sh
> set -- 'getopt ad: "$@"'
初っ端からおかしいし。バッククォート書いたつもりが、シングルクォートに化けた?
しかもset --じゃだめだろうと思ってたら、後半では正しい書き方してたが
> OPT=`getopt -o ab:c --long long-a, long-b:,long-c -- "$@"`
> 略
> eval set -- "$OPT"
で、次
> getopt には重大な落とし穴があります。それは、スペースや特殊文字が
> 引数に含まれていた場合、正しく処理できないということです。
特殊文字まではやってないが、スペース入れても普通に動いたんだが?
デフォルトでクォートされてるよな?
man getoptすると「伝統的なgetoptの実装では ~略~ 空白 ~略~ 使うことができない ~略~
この実装ではクォートした出力を生成する」ってことは(この記事で言及できないほど)最近対応したのか?
それはそれとしてクォート方法の指定ができて、shとbash(違いあるの?)があるからシェルごとに
使い分けなきゃいけない気がしていやなんだが
ま、この記事のBSD系ではロングオプション非対応っていうのはgetoptを候補からすばやく外すのには役に立ったなw
GNU版ならもう少し色々できることがわかったが、やはり大変だな。今回は書かなかったがサブコマンド対応とか。
あとgetopt使っても自前処理でもコードの量に大差ないってのはなんなだろう?と前から思っている
224:デフォルトの名無しさん
18/10/09 13:51:30.72 cJ7fFqob0.net
parsargコマンドみたいなのを再発明したほうが早いかもね
GNU getoptと同じ(もしくはもうちょっと拡張)挙動でかつ可搬なのを。
225:デフォルトの名無しさん
18/10/15 14:55:49.61 Q15q2Q7Cd.net
質問しようと思ったけど初心者の俺にはレベル高い話ばかりで恥ずかしいぜ、、
226:デフォルトの名無しさん
18/10/15 15:15:36.15 9UZy+Ppr0.net
どうぞどうぞ
227:デフォルトの名無しさん
18/10/15 15:50:29.54 Q15q2Q7Cd.net
ありがとう
やりたいことは、環境を判定して対象の環境にある複数サーバーに対して一括でコマンド発行したい、です
条件
・A環境とB環境があり、引数でそれぞれ指定し(test.sh A のようにしたい)、シェルスクリプト側でどちらが入力されたか判定する
・サーバーにssh接続するためのIPアドレス等は外部ファイルに記載されているため、環境判定後にファイルを読み込んでsshアクセスする必要がある
・サーバーは両環境それぞれ25台ずつあるが、5台ずつコマンドを発行し、waitしてからまた5台と、塊毎にやりたい
質問1
外部ファイルの指定方法が分からないです
ifで環境を判定してthenの後にファイルを指定すれば良いのか?
質問2
5台ずつ、を実現するためにはwhileで良いのか?
そもそも、sshをまとめてやって後からそれらにコマンド発行ってできるのか
初歩的すぎて恥ずかしい限りですがお願いします
228:デフォルトの名無しさん
18/10/15 15:55:57.71 oz1FOCTra.net
どうぞどうぞ
229:デフォルトの名無しさん
18/10/15 16:39:55.24 Q15q2Q7Cd.net
>>227
自己解決
やり方を変えることにしました
230:デフォルトの名無しさん
18/10/15 16:43:11.45 9UZy+Ppr0.net
どういたしまして
231:デフォルトの名無しさん
18/10/15 18:26:03.30 A4+xGAqjM.net
僕にも感謝して
232:デフォルトの名無しさん
18/10/15 18:56:32.85 3C5NcaRXa.net
>>229
どうやることにしたの?
233:デフォルトの名無しさん
18/10/15 20:03:34.75 dTacK6h30.net
ssh ... [command] ができるのがわかったとかじゃないのかな
234:デフォルトの名無しさん
18/10/15 21:27:00.70 0gVRdy5i0.net
>>232
233の言うとおりです
opensshのマニュアル呼んだら、ファイル指定もコマンド発行方法も書いてあったので、それでやることに
あとはifとの組み合わせで頑張ります
まぁつまずいてるんだけど
235:デフォルトの名無しさん
18/10/15 21:32:13.05 E6pr56BO0.net
私たち日本人の、日本国憲法を改正しましょう。
総ム省の、『憲法改正國民投票法』、でググって
みてください。拡散も含め、お願い致します。
236:デフォルトの名無しさん
18/10/18 12:14:09.96 /ofNkRJS0.net
ksh、関数のオーバーライド、くせっていうかバグあるわ
(foo() { echo 1; }; foo; (foo() { echo 2; }; foo;); foo)
何度実行しても1 2 1 と表示される(想定通り)
foo() { echo 1; }; foo; (foo() { echo 2; }; foo;); foo
最初の1回は1 2 1 と表示されるが、
2回目以降は1 1 1 としか表示されない(2でオーバーライドできなくなる)
237:デフォルトの名無しさん
18/10/18 12:32:51.57 /ofNkRJS0.net
もう一つ。kshで関数の定義の場所でオーバーライドできない
場合があるんだが原因がよくわからない。
多分これ関連なんだろうけど
URLリンク(github.com)
これはメインシェルの定義がある場合、サブシェルの中での定義が無視されるということだから、
サブシェルの中で定義していれば、その中のサブシェルではオーバーライドできると解釈できる
たしかに>>236はそのとおりの動きはしてる
もう一つの問題も同じなんだろうか、定義の順番を変えればうまくいくんだが
サブシェルに関しては定義の順番を変えても同じだと思うんだけどなぁ。
.コマンドを使ってるのが関係してるのかなんだこりゃって感じだ
238:デフォルトの名無しさん
18/10/18 12:40:28.86 /ofNkRJS0.net
もう一つの問題は、ちょっとコードが入り組んでて調べるのが面倒くさい。
なんでこれで解決したのかわかってない状況だが、今のところ動いているので
まあなにかわかったら書くよw
239:デフォルトの名無しさん
18/10/18 16:05:20.75 q7k/ngFed.net
初心者です、while文の質問です
このようなスクリプトがあったとします
a=0
while [ $a -le 50 ]
do
a=`expr $a +1`
echo "${a}個目
done
とやると、50個目まで表示されると思いますが、この数値が5の倍数の時だけ、echoで表示させたあとsleepを入れるようにするには、contiuneを使えばよい?
それともifでやる?
よくわからず
240:デフォルトの名無しさん
18/10/18 16:38:15.26 hfM3a7YWa.net
>>239
continue はループ内のその後の処理を飛ばすやつだからできないと思うが。
普通に if 使ってやるしかないのでは?
if [ `expr $a % 5` -eq 0 ] ; then sleep 1 ; fi
とか、done の直前に入れる。
241:デフォルトの名無しさん
18/10/18 17:31:05.73 /ofNkRJS0.net
>>240
> continue はループ内のその後の処理を飛ばすやつだからできないと思うが。
5の倍数以外でsleepを飛ばせばできるYO!
>>239
> とやると、50個目まで表示されると思いますが
51個目まで表示される
> a=`expr $a +1`
は a=$((a+1)) の方が良い
シェルによって実行されるから速い
俺だったらif使わないでこう書くかな
[ $(($a % 5)) = 0 ] && sleep 1
ただこの書き方は if を使った場合と完全に等価なわけじゃなくて
後続行実行時点でのexit codeが異なることがあるから使い方に注意だけど
242:デフォルトの名無しさん
18/10/18 17:40:57.72 hfM3a7YWa.net
あ。そうか。なるほど。
243:デフォルトの名無しさん
18/10/18 17:41:55.70 /ofNkRJS0.net
ついでだから書いておくと、
a=`expr $a +1` でも大差ないだろ?と思った人
WSLの酷さがわかるぞ
たった50回のループ、sleepを行わない状態で
a=$((a+1)) だと 約0.025秒なのに、
a=`expr $a +1` だと 約0.5秒にもなるのだ
10000回のループだと
a=$((a+1)) だと 約0.1秒のところ、
a=`expr $a +1` だと 約90秒
早くWSLのfokの遅さが解決すると良いな
244:デフォルトの名無しさん
18/10/18 17:43:58.54 /ofNkRJS0.net
× [ $(($a % 5)) = 0 ] && sleep 1
○ [ $((a % 5)) = 0 ] && sleep 1
書き込む前に気づいて直したと思ったんだがコピペミスったか
上でも動かないわけではない。無駄なだけ
245:デフォルトの名無しさん
18/10/18 17:56:39.61 uRBurQVb0.net
> [ $((a % 5)) = 0 ]
新旧混ぜんなw
arithmetic使うなら、そのままevaluation記法にしてしまえばいい。
((...))
あと、旧testでの数値比較は-eqを使え。
246:デフォルトの名無しさん
18/10/18 18:24:07.81 /ofNkRJS0.net
>>245
ん? どういうふうに書くってこと?
>>237の件、ぼや~っとだけどわかりかけてきた気がする
スクリプトのコードが.(ドット)コマンドで評価された時点で、
関数がすでに存在している場合、その関数を使用するコードがあれば
事前にリンクされているような動きをしている
その場合サブシェルで関数を再定義しようとしてもできないんじゃないかな
だから事前にリンクできないようにeval呼び出しに変更したら
再定義された方の関数を呼び出すようになった
247:デフォルトの名無しさん
18/10/18 18:35:46.85 uRBurQVb0.net
((a % 5 == 0))&& ...
なんで一々ここまで言わんとわからんような奴が、他人の指摘しているんだろうかね。。。
-eqでの数値比較とか基本中の基本だろうに。
248:デフォルトの名無しさん
18/10/18 18:50:03.03 /ofNkRJS0.net
>>247
$ dash -c 'a=0; ((a % 5 == 0)) && echo ok'
dash: 1: a: not found
$ dash -c 'a=0; (($a % 5 == 0)) && echo ok'
dash: 1: 0: Permission denied
なぜかって?
その書き方はPOSIX準拠じゃないもの
URLリンク(github.com)
249:デフォルトの名無しさん
18/10/18 18:56:56.93 /ofNkRJS0.net
動かないコード出されて、偉そうにされても
やれやれって言うしか無いわなw
250:デフォルトの名無しさん
18/10/18 19:33:42.29 9i8IzX+1a.net
(( )) ではなく [[ ]] では?
251:デフォルトの名無しさん
18/10/18 19:37:12.04 /ofNkRJS0.net
[[ ]] もPOSIX準拠ではない
252:デフォルトの名無しさん
18/10/18 22:39:25.80 3W2GDYvfa.net
またぽっじくすか
253:デフォルトの名無しさん
18/10/19 00:21:19.12 0zKHBU8T0.net
>>239だけど、奥が深いね
if使わずにもできたりするのか
はぁ、先は長そうだ、ありがとう
254:デフォルトの名無しさん
18/10/19 01:23:10.99 JmLVta5V0.net
cat file.txt | ( head; tail) は最高
255:デフォルトの名無しさん
18/10/20 02:22:05.90 V0y1IBp60.net
>>224
> parsargコマンドみたいなのを再発明したほうが早いかもね
違うもの調べてて、こういうのを見つけた。
見つけたってだけでどんなものかは調べていない
URLリンク(zentoo.hatenablog.com)
> ちょっとした理由でgit-flow (URLリンク(github.com)) のソースを
> ちょっとちょっと眺めていたんだけど、内部でコマンドライン引数を
> パースするためにshflagsというツールが使われていたのでメモ。
256:デフォルトの名無しさん
18/10/20 06:26:18.72 EzXK/x1W0.net
>>254
おまえらなんでそんなに猫が好きなん?
257:デフォルトの名無しさん
18/10/20 12:30:19.19 o8LOHz9N0.net
それを疑問に思う人間に説明するのは困難だ
258:デフォルトの名無しさん
18/10/20 12:37:11.93 MzLaXRRvr.net
猫好きてそんなに言語化しにくい複雑怪奇な感情持っとるんか?
259:デフォルトの名無しさん
18/10/20 12:43:08.81 o8LOHz9N0.net
例えば女をみて欲情しない人間に、なぜ欲情するのかを説明するのは難しいだろう
言葉を並べるだけなら本能だとか体の特徴なんかを言えるが、共感はされまい
つまりそれを疑問に感じる人間には、その時点ですでに納得させる言葉がないのだ
260:デフォルトの名無しさん
18/10/20 12:48:37.62 MzLaXRRvr.net
でもそもそも説明するのが困難なのやろ?
おまえが言ったんやで
261:デフォルトの名無しさん
18/10/20 12:55:36.75 V0y1IBp60.net
おい、スレと無関係な話をして荒らすな
262:デフォルトの名無しさん
18/10/20 12:56:11.89 o8LOHz9N0.net
なぜ説明するのが困難かを説明したつもりだったんだが
263:デフォルトの名無しさん
18/10/20 13:01:22.08 V0y1IBp60.net
つまんねーよ。シェルスクリプトに関係ある話をしろ
ってか、>>206お願い
264:デフォルトの名無しさん
18/10/20 14:52:07.13 ZWcyeiuM0.net
お前がつまんねーんだよ
265:デフォルトの名無しさん
18/10/20 14:54:50.53 2nu5r9gua.net
なんかレス番飛んだけどなんだこれ
266:デフォルトの名無しさん
18/10/20 16:25:12.28 EzXK/x1W0.net
>>265
自分でそういう設定してんだろ。
ngしてますアピールうざいよ。
267:デフォルトの名無しさん
18/10/20 17:00:11.18 ZWcyeiuM0.net
なんか遠いレスの番号という意味じゃないの。てか、なんで噛み付いているんだか
268:デフォルトの名無しさん
18/10/20 17:06:13.46 T0X8nuYVa.net
ワッチョイ変わったのになんでNG効いてんだ?と思ったら課題マンだったのか
269:デフォルトの名無しさん
18/10/21 03:41:54.16 dQhyPQp/0.net
あるパスがディレクトリで書き込み可能かは、[ -d "$path" ] とか [ -w "$path" ] で調べられるし、
所有者が自分自身であるかは-Gや-Oで調べられますが、
自分以外が読み書き不可能であることをチェックするにはどうしたら良いですかね?
270:デフォルトの名無しさん
18/10/21 05:19:47.73 C+Apg5Hi0.net
ls
271:デフォルトの名無しさん
18/10/21 05:42:25.02 dQhyPQp/0.net
やっぱlsしかないですかね。
このフォーマットって仕様化されてるんですよね
272:デフォルトの名無しさん
18/10/21 06:29:17.52 9NX69mCX0.net
>>271
pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html#tag_20_73_10
273:デフォルトの名無しさん
18/10/21 06:34:56.07 dQhyPQp/0.net
ありがとう。だがオプション多すぎて読むのだりぃw
なんでだろ?どうもlsって解析する気にならないんだよな
人間向けのフォーマットでコンピュータが解釈するのに向いてない感じがしている
どこまでPOSIXで仕様化されてるのか、どこからが拡張なのか、オプション多すぎて(略
関係ないけど、ふと本棚を見たら
「lsを読まずにプログラマを名乗るな!」という本があったw
そういや買ったっけ(未読)
274:デフォルトの名無しさん
18/10/21 06:42:08.88 xQoMnSHc0.net
URLリンク(pubs.opengroup.org)
STDOUTに記述があるんだからそうじゃね
275:デフォルトの名無しさん
18/10/21 06:42:50.73 xQoMnSHc0.net
あら被りすぎた。すまん
276:デフォルトの名無しさん
18/10/21 06:45:46.73 xQoMnSHc0.net
>>273
>>272はPOSIXの仕様。>>269,270,271の目的には
If the -l option is specified, the following information shall be written for files other than character special and block special files:
と
If the -l option is specified, the following information shall be written for character special and block special files:
で書いてあるフォーマットだけだけどね
277:デフォルトの名無しさん
18/10/21 07:33:05.64 dQhyPQp/0.net
そういや、macだとlsで
drwxr-xr-x+ や
drwxr-xr-x@ みたいに
後ろになにかくっついていることがあるな
> Implementations may add other characters to this list to represent other implementation-defined file types.
くっつけても良いってことなのか?
278:デフォルトの名無しさん
18/10/21 11:22:28.24 C+Apg5Hi0.net
これだからマカーは馬鹿だと言われるんだなあ...
279:デフォルトの名無しさん
18/10/21 20:00:09.31 0dWokXAIa.net
stat コマンドの出力解析した方が楽ではないか?
または find コマンドの -perm 利用してチェックして -exec でやらせたいことをやらせる。
280:デフォルトの名無しさん
18/10/21 20:21:13.14 dQhyPQp/0.net
>>279
そこででてくるのが、またPOSIXですよ
statはPOSIXで規定されてない
SolarisやUP-UXには存在しない
更にLinuxとMacでオプションもフォーマットもぜんぜん違う
281:デフォルトの名無しさん
18/10/21 22:04:44.47 8BH3p2hm0.net
標準入力の代わりにfileの内容を入力するのに、リダイレクトで
$ <file somecmd
とやる方式ってPOSIXで既定されてるっけ。
URLリンク(pubs.opengroup.org)
このへんに書いてそうなんだけど、それっぽい記述がない?
282:デフォルトの名無しさん
18/10/22 02:54:50.03 HyPH6OEy0.net
>>280
じゃ、find で。
ファイルのパーミッションに 066 を and した時に 0 になるやつでいいのなら
find $dir -prune ! -perm -40 ! -perm -20 ! -perm -4 ! -perm -2 -exec やらせたいこと \;
のようにすればいいのではないかな。
URLリンク(pubs.opengroup.org) で find コマンド見てみたら -perm はあるようなので。
もし GNU の find コマンド使えるようなら -perm /mode が使えて、これは何れかのビットが立っていれば
真になるので ! -perm /66 の一つで出来ると思う。
283:デフォルトの名無しさん
18/10/22 03:01:30.80 1Kkbm3du0.net
GNUのfind使っていいという条件なら、GNUのlsやstatでいいじゃんw
284:名無しさん@そうだ選挙に行こう! Go to vote!
18/10/22 10:18:21.67 8WYgXfgna.net
その辺はご自由に。POSIX縛りがあってもこの場合にfindも使えるってだけの話なので。ls使いたいならそうすればいい。
285:デフォルトの名無しさん
18/10/22 14:51:33.47 JUwIDQm90.net
>>281
これ分かる方います?
286:デフォルトの名無しさん
18/10/22 16:55:54.61 9s+yFzz3H.net
>>281
2.1の5で、リダイレクトの処理をしてパラメーターリストから
除去するって書いてあるのと、
6でコマンド名を第0パラメーターとして渡すって書いてるってことは、
先頭もパラメーターリストの一部と解釈できるから、
暗に、先頭にリダイレクトがあってもいいってことを表してるんでは?
287:デフォルトの名無しさん
18/10/22 19:08:52.43 WU2zxBnF6.net
>>286
明示はされてないのね。
でもありがとう。多分 大丈夫ということでしょう。
288:デフォルトの名無しさん
18/10/22 19:09:38.93 WU2zxBnF6.net
あ、ワッチョイもIDも違うけど>>285です。
289:デフォルトの名無しさん
18/10/22 21:35:03.82 oF7wf0Ce0.net
>>118
それはオブジェクト指向の話じゃない
C++の話だ
そもそもテンプレートやジェネリックは、型を明確にすることでバグを少なくしたり
速度を速くするためのもので、オブジェクト指向における問題点を解決するための追加機能
テンプレートやジェネリックを使うことでオブジェクト指向が不要になるのではなく
オブジェクト指向と組み合わせて使うことで問題点が改善される
テンプレートはオブジェクト指向と組み合わせずに使えたと思うが、
テンプレートの殆ど(ジェネリックは全て)はオブジェクト指向なしに使うことはできない
290:デフォルトの名無しさん
18/10/22 21:47:50.25 oF7wf0Ce0.net
あ、書き込まれてないと思ったら書き込む場所間違えてたのかw
291:デフォルトの名無しさん
18/10/22 23:23:26.53 oF7wf0Ce0.net
ただのメモ
各シェルの比較
URLリンク(hyperpolyglot.org)
292:デフォルトの名無しさん
18/10/23 13:27:19.16 QwHjyvjPa.net
シェルというか tar コマンドの問題なんだけど、tar tvf でアーカイブに入っているファイルのタイムスタンプを秒単位まで出す方法ある?
Linux で GNU tar のmanページ見た感じではなさそうなんだけど、やはり自作するしかないなかな。
293:デフォルトの名無しさん
18/10/23 14:12:45.60 mYtscksw0.net
>>292
tar --full-time ...
294:デフォルトの名無しさん
18/10/23 14:38:56.39 QwHjyvjPa.net
>>293
おお!ありがとう。新しい GNU tar にあるね。
最初CentOS6で試しててわからなかった。これは GNU tar 1.23 だ。
CentOS7は GNU tar 1.26 になっててこちらでは出来るしmanページにも書いてあった。