- 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
- 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のスクリプトファイルだって、ソースコード配布サイトなら テキストファイル扱いにしたいだろうし
- 101 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 13:10:10.20 ID:d3Gl2lPg0.net]
- 特別な意味をもたせた終了コードをなんにしようかな?って考えてるんだけど
既存で使われてる終了コードとなるべくかぶらせたくない。 どんなのがあるか知らない? 1, 2, 126, 127, 255(bashの予約) 0〜63(fsckで使用) 64〜78(sysexits ユーザー用のうち定義済みのもの) 128〜192(シグナルコードの範囲?) 参考 https://ja.wikipedia.org/wiki/%E7%B5%82%E4%BA%86%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9 https://linuxjm.osdn.jp/html/LDP_man-pages/man7/signal.7.html https://linuxjm.osdn.jp/html/e2fsprogs/man8/fsck.8.html kaworu.jpn.org/doc/FreeBSD/jman/man3/sysexits.3.php tldp.org/LDP/abs/html/exitcodes.html 一番最後のリンクでsysexitsの作者は64〜113をユーザー用に使うことを提案してるみたいだけど 定義済みを除けば残りは79〜113かな
- 102 名前:デフォルトの名無しさん [2018/09/29(土) 13:18:50.90 ID:IuTgmxg/0.net]
- オツムに欠陥があるヤツでなければ
普通に別の環境変数にいれる
- 103 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 14:08:42.53 ID:PPHj/b7C0.net]
- >>101
ていうか寧ろそのなかのどれかでいいんじゃないの? それともその定義に収まらないエラーなの? 鼻からドラゴンが出ました!exit 80 とか。
- 104 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 15:12:55.62 ID:d3Gl2lPg0.net]
- >>103
そう言われるかなとは思ったw 「俺の作ったプログラム」 ==> 「俺の作ったフィルタ」 ==> 「任意のプログラム」 という呼び出しの流れで 「俺の作ったプログラム」 で「任意のプログラム」 の終了コードを知りたいが、 「俺の作ったフィルタ」 独自の終了コードだけは特別扱いしたいということ 「任意のプログラム」のエラーは想定外のエラーで 「俺の作ったフィルタ」のエラーは想定されたエラーで どちらもエラーではあるんだけど「俺の作ったプログラム」で表示するメッセージが違う それぐらいなので、かぶってしまっても大きな問題は発生しないんだけどね
- 105 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 17:52:02.97 ID:PPHj/b7C0.net]
- >>104
なるほど。 たしかにそういう目的ならば,終了コードが混ざる≠フはよくないな。 しかし例えばapt(1)は非root権限でシステム操作しようとすると exit 100を返すというトンデモ仕様[Debian 2015]なので,もうどうしようもないんじゃねw せっかくsysexitに権限異常を示す77があるのにどうして100番を使ってしまったのか……。 [Debian 2015]: https://manpages.debian.org/stretch/apt/apt.8.ja.html#%E8%A8%BA%E6%96%AD%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8
- 106 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 17:54:32.38 ID:PPHj/b7C0.net]
- ああ,なんか説明不足で投稿しちゃった。
つまりさ,一応標準で定められたエラー番号はあるものの, 各種アプリケーションが従っている訳でもなく Debian系のaptコマンドのような超大手のアプリケーションでさえ標準を無視してるんだから, > 定義済みを除けば残りは79〜113かな ↑こういうのは考えないほうがいいんじゃない? ってこと。
- 107 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:22:23.04 ID:d3Gl2lPg0.net]
- >>105-106
どこかのなにかにかぶってしまうのは防ぎようがないけど よく使われるコマンドがこんな終了コードを使っていたっていう事例を知りたいのよ fsckとかどう見てもエラーじゃねーだろコレっていうのが エラーあつかいになってて以前はハマったことあるしw https://linuxjm.osdn.jp/html/e2fsprogs/man8/fsck.8.html > 1 - ファイルシステムのエラーが修正された
- 108 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:23:25.37 ID:d3Gl2lPg0.net]
- 標準に準拠したいとかそういう話ではなく
単にぶつかりたくないだけ
- 109 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:24:45.45 ID:d3Gl2lPg0.net]
- > exit 100を返すというトンデモ仕様[Debian 2015]なので,もうどうしようもないんじゃねw
実を言うと今100を使おうとしていたw やはり裏の裏の裏の裏ぐらいを読まないとダメだなw
- 110 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:40:55.97 ID:PPHj/b7C0.net]
- 非0の返り値だけどコマンドは成功しているっていう例として有名なのはdiff(1)とかかな。
pubs.opengroup.org/onlinepubs/9699919799/utilities/diff.html#tag_20_34_14 >1 > Differences were found.
- 111 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:46:56.62 ID:8M0IW2fy0.net]
- シグナルでも使ってみたらどうだろうか。
あるいは別にパイプを用意するとか。
- 112 名前:デフォルトの名無しさん [2018/09/30(日) 02:44:50.58 ID:KPqVv5wd0.net]
- 絶対にぶつからないようにするには別の方法でエラーを伝えるようにするぐらいしか方法ないんじゃないか?
同じ値になる可能性のあるものをどちらから発生したかわからない状態で同じ所から得るなんてやはり無理があるだろう。
- 113 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 01:15:09.47 ID:2Ehpmx/A0.net]
- こんな書き方できたのか
a=1 case $a in ( 1 ) echo ok esac
- 114 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 02:02:45.71 ID:IEGoOL+v0.net]
- お、おう
- 115 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 19:23:29.52 ID:6qOrAQgQ0.net]
- お題
ある関数に対して、apple orange banana ... とN個(Nは任意の個数)の引数を渡した時、 以下のような、引数とその引数のインデックス番号を出力する関数を作成せよ (単語に対して数値が対応しているわけではない) apple 1 orange 2 banana 3 : ただし、外部コマンド、拡張POSIX機能、変数の使用は禁止とする (ここでいう変数とはsetコマンドで表示されるもののことである)
- 116 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 21:27:13.63 ID:yoF3UpeG0.net]
- >>115
argidx() { i=1 for argv in "$@"; do echo "${argv}" $i i=$((i+1)) done } 簡単すぎ
- 117 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 21:45:46.37 ID:yoF3UpeG0.net]
- おいこら答えてやったんだからなんとか言えよコラ
エレガントすぎて腰が抜けたか?wwwww まあ実際,自分で言うのもなんだけどかなり最良に近い方法じゃないかしら。 ・POSIX.1-2017準拠 ・空白などを含む引数も直感的に指定可能("word with space") ・単純 構造が簡単 ・数値の増加にexpr(1)ではなく算術式を利用している為速い
- 118 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 22:03:54.77 ID:kkfm+1S90.net]
- 変数禁止だから不正解じゃない?
- 119 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 22:15:20.79 ID:xDUI5Isc0.net]
- >>115といい、>>117といい変なヤツしかいないやんけ
- 120 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 23:00:16.05 ID:xTxFBCr4a.net]
- 最初の一個だけならスマートだったのに
褒められたがりが
- 121 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 00:30:44.79 ID:ej0n10jM0.net]
- 煽りだよ だって明らかに学校の課題かなにかでしょ。
そんなのに真面目に付き合うほど俺は素直じゃない。
- 122 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 00:44:57.49 ID:m57KKa9e0.net]
- 苦しすぎな言い訳w
- 123 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 01:48:10.18 ID:ej0n10jM0.net]
- まあそう思っとけw
- 124 名前:デフォルトの名無しさん [2018/10/03(水) 01:59:13.13 ID:jikKostS0.net]
- >>115
echo は使っては駄目? 拡張されていない sh だと echo はビルトインではなく /usr/bin/echo だと思うが。
- 125 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 02:01:17.96 ID:NkO7phbc0.net]
- >>118
そう。変数禁止なので不正解 >>121 変数禁止とか学校の課題ででるわけないじゃないw
- 126 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 02:03:27.25 ID:NkO7phbc0.net]
- >>124
使ってOK。 俺の知る限りechoがビルトインでないものは知らない 関係ないけどechoみたいな基本的なコマンドが シェルによって挙動が違うのはどうにか ならなかったんだろうか
- 127 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 02:14:54.02 ID:NkO7phbc0.net]
- そうか。evalとか外部コマンドは実装不可能なものを除いて
ビルトインで実装することなんて決まりはないのか では外部コマンドの定義を「現存するシェルでビルトインで実装されたことがないもの」にしよう オレオレシェル作ってビルトインするのは問題の意図から外れるので、 現存する(誰もが容易に入手可能な)いずれかのシェルで ビルトインされているならば使って良いものとする
- 128 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 02:18:56.23 ID:NkO7phbc0.net]
- あと拡張POSIX機能も使用してOKにしよう。
それを実現する裏技みたいなのがあったら嫌だなと思って入れたが、 もしそれでできるなら俺も勉強になるし。 ようするにPATH環境変数を空にして、どれかのシェルで動けばOKってことだな 条件がグダグダになってしまったw
- 129 名前:デフォルトの名無しさん [2018/10/03(水) 12:27:47.15 ID:61GCF4dla.net]
- if や while を外部コマンド動かさずに使うには [ がビルトインのシェルでないとダメだな。
昔の sh は [ が test コマンドへのシンボリックリンクで外部コマンドだったし。 今でもその名残で /bin または /usr/bin に [ が入ってるよな。
- 130 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:43:00.79 ID: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 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:47:38.74 ID:m57KKa9e0.net]
- いいから、お題の参考答えを出しなさいw
オレオレ定義が曖昧すぎでお題になってないから、もういいでしょ
- 132 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:57:02.54 ID:NkO7phbc0.net]
- >>131
問題訂正してやるから、もう少し頑張れやw お題 ある関数に対して、apple orange banana ... とN個(Nは任意の個数)の引数を渡した時、 以下のような、引数とその引数のインデックス番号を出力する関数を作成せよ (単語に対して数値が対応しているわけではない) apple 1 orange 2 banana 3 : ただし、変数の使用は禁止とし、シェル機能とビルトインコマンドのみを用いること (ここでいう変数とはsetコマンドで表示されるもののことである) (使用するコマンドはいずれかのシェルのビルトインコマンドであればよいが、 この問題用に独自シェルを作成するのは禁止とする)
- 133 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:59:49.96 ID:m57KKa9e0.net]
- なんの目的かさっぱりわからんな。自分でできてんの?っていう疑問からなんだけどなw
>変数の使用は禁止とし >(ここでいう変数とはsetコマンドで表示されるもののことである) 環境変数のことを言っているのかと思えば違うし、これだけでも曖昧というかオレオレ定義が曖昧だろう
- 134 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:11:05.97 ID:NkO7phbc0.net]
- >>133
setコマンド実行してみてみばわかるでしょw setコマンドで表示される変数はシェル変数(環境変数含む)だよ それを使うのは禁止ってこと
- 135 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:13:32.35 ID:NkO7phbc0.net]
- 今日の24時までに答えが出なければヒント出しますw
- 136 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:16:57.73 ID:6m7pNgyW0.net]
- そのヒントとやらもグダグダなんでしょw
- 137 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:17:05.40 ID:m57KKa9e0.net]
- 変数を使わない 言語(マシン語すら) は知らんなあ。そういう縛りを設けての目的はなんなん?
やってみたできるけど、クソのようなwにしかならんから、どうか、参考の答えを出してw
- 138 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:19:23.20 ID:NkO7phbc0.net]
- 答えは明日。まあヒントみれば気づく人はすぐわかるでしょう。
コロンブスの卵だよ
- 139 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:20:30.02 ID:m57KKa9e0.net]
- なんで常時上から目線なのかw コードで語ればいいのに
素晴らしいコードならそんなおれおれ上から目線しなくてもいいくらいなのに。なんかしらんがもったいつけてのまだ「ヒント」とかもったいつけてるしw
- 140 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:21:39.64 ID:m57KKa9e0.net]
- なんかしらんが見つけて、俺すげーしたいだけっぽいなw
- 141 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:22:11.11 ID:NkO7phbc0.net]
- > そういう縛りを設けての目的はなんなん?
その理由も答えと一緒に明かします
- 142 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:23:23.18 ID:m57KKa9e0.net]
- いや、もういらんわw なんかキモすぎて付き合いきれないw
- 143 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:36:43.15 ID:ej0n10jM0.net]
- 多分だけど学校の課題だと予想
根拠は二点: 1. 問題が実利的でない。学校(それもあまり学力の高くない)にありがちな「こんなのできるかな?」系の問題である。 2. 煽ったらそれに乗っかって答えを出してくれる人が思ってるという点で質問者が精神的に幼ない。(高校生くらいか?)
- 144 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:45:22.66 ID:m57KKa9e0.net]
- posh とかいつもの人でしょ
いつもの人が学校の課題をしなきゃならん人なのか知らんけどw
- 145 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 15:06:30.08 ID:ej0n10jM0.net]
- poshなんていうシェルがあるのね。初耳だわ。
- 146 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 15:10:04.24 ID:NkO7phbc0.net]
- >>2に書いてあるよ。俺もここ(の何スレか前)で初めて知った
- 147 名前:デフォルトの名無しさん [2018/10/03(水) 15:58:50.21 ID:4kFnpcnsa.net]
- $# と shift を使って逆順に値を付加することは簡単にできたんだがな。
- 148 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 17:25:26.25 ID:NkO7phbc0.net]
- >>147
俺も第一歩目はそこまでだったw 俺の本来の目的(今回の問題とは別件)は逆順でも実現できたんだけど なんか悔しかったので、もう一歩進めたら逆にすることなく実現できた
- 149 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 21:20:26.89 ID:SM8JpmZX0.net]
- ちょっと前にもこんなグダグダ無かったっけ?
- 150 名前:デフォルトの名無しさん [2018/10/03(水) 21:48:53.18 ID:Tma5IQlaF.net]
- 変数使ってはダメって、非合理的でない?
シェルの仕様否定してどーするの? 外部コマンドだって、それがUNIXの設計思想なんだからそれさえも否定するってのも理解不能 ならば、OSそのものを仮想的なものを仮定して その上で動かすとでもしないと 大昔の情報処理技術者試験用に作られたアセンブラみたいな感じでさ 変数使わない、外部コマンド使用禁止、そんなアルゴリズムが何の役に立つんだろう?
- 151 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 22:35:14.41 ID:ej0n10jM0.net]
- でも前はワッチョイやIDがなかったから もっと酷かった。
今はNGすればオッケー☆
- 152 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:37:38.01 ID:8ua9ZMtc0.net]
- ヒント忘れてたわw
func() { ********* while [ $# -gt 1 ]; do ********* shift done } func apple orange banana ********の所は1行とは限りません
- 153 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:41:45.65 ID:8ua9ZMtc0.net]
- >>150
シェルスクリプトはPOSIXの範囲では ローカル変数がないから、変数名がかぶると困るんだよ もちろんサブシェルを使うという手もあるが 引き出しは多いほうが良い
- 154 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:43:44.36 ID:8ua9ZMtc0.net]
- >>151
それなw 見たくないやつが絡んでこなくなったので 過ごしやすくなった。
- 155 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:46:12.13 ID:8ua9ZMtc0.net]
- >>150
ちなみにこれアルゴリズムじゃないよ アルゴリズム系だと一時変数を使わずに変数を入れ替える方法とかあるけど これはシェルの機能を使った、あぁ、なるほど系の問題
- 156 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:49:17.75 ID:C6pwZkBD0.net]
- いきなりレス数増えたと思ったらもう木曜か
- 157 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 04:55:02.39 ID:/YMF27MO0.net]
- >>152よ、お前のなかでは「$#」は変数じゃないのか……。
人様にクイズとやらを出す前にシェルとはなんなのかを学んだらどうだ?
- 158 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 05:43:44.35 ID:8ua9ZMtc0.net]
- 出題ぐらいちゃんと読もうぜw
> ただし、変数の使用は禁止とし、シェル機能とビルトインコマンドのみを用いること > (ここでいう変数とはsetコマンドで表示されるもののことである)
- 159 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 08:51:53.43 ID:/YMF27MO0.net]
- bash 4.2以降はset組み込みコマンドの中に$#が含まれるようになったんだよなぁ…
ちゃんと調べて、どうぞ。
- 160 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 09:17:07.53 ID: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 またはそれ以降 <gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
- 161 名前:デフォルトの名無しさん [2018/10/04(木) 09:50:29.05 ID:8DudSISka.net]
- >>160
grap のパターンはそれでいいのか?
- 162 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 10:01:44.50 ID:8ua9ZMtc0.net]
- >>161
良いに決まってるだろ 正規表現に自信がないなら自分で調べたら? 質問してるってことは、動かしてないんだろうし。
- 163 名前:デフォルトの名無しさん [2018/10/04(木) 10:47:30.53 ID:8DudSISka.net]
- ああ。そうか。最初の$は要らないからそれでいいのか。
- 164 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 14:55:58.09 ID:7ib5/eAS0.net]
- grap コマンドか、なんか強うそうなイメージ
- 165 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 16:22:52.78 ID:/YMF27MO0.net]
- なんかもう誰かが作ってそうだよね。
まるでyaから始まる4文字のソフトウェアが被りまくってるように。
- 166 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 16:55:15.20 ID:8ua9ZMtc0.net]
- 犯人はya
- 167 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:00:19.77 ID:8ua9ZMtc0.net]
- 正解者もいないようなのででは解答
このコードがどういうときに有用かは>>153で書いたとおり set は使わなくても別にもう一つ関数を作れば同じことができるが 関数を作らずとも引数の再設定という方法がある。意外と便利だよ func() { set -- "$@" $(($#+2)) while [ $# -gt 1 ]; do eval "echo \"$1 \$((\$$#-$#))\"" shift done } func apple orange banana
- 168 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:11:54.69 ID:n5lIiyiD0.net]
- そんなクソなコードを意気揚々としてあげてるけどさ、なんか変数被るからというもっともらしい言い訳してたけど、なるべく変数使わないように書くわけだ、これから。ほーっw。そんなのクソだな、個人的にw
なんでそういうお題をそんな俺偉いじゃなくてできないのかな。よほどそれを出すのに時間かかったとか??
- 169 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:12:23.41 ID:8ua9ZMtc0.net]
- はい。想定通りのレスだね。
言い訳だけは一人前w
- 170 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:13:26.14 ID:n5lIiyiD0.net]
- いや、ふつうわかるだろう。まあ、かなり頑張って出したんだね、やっぱりw
- 171 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:14:13.91 ID:8ua9ZMtc0.net]
- じゃあもう一問。そんなに言うなら次は答えてね
- 172 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:15:02.61 ID:n5lIiyiD0.net]
- だから、なんでそんな上から目線なのよ
んなのに付き合うと思ってるの?あんた自体が上から目線でモノ言われたらすぐ反発するくせにww
- 173 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:18:43.51 ID:n5lIiyiD0.net]
- いや、上から目線じゃなくても反論されたらかwww
- 174 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:20:37.56 ID:8ua9ZMtc0.net]
- >>172
お前はこのおっさんと同じ種類の人間だろうな 相手が下だと思って接してるやつ。 まずお前が上から目線を止めたら? https://togetter.com/li/1175445 おっさんがタメ語で聞いてきたからタメ語で返したらショックを受けてた。敬意が返ってくると思ってる日本のおっさんって不思議。
- 175 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:24:38.91 ID:n5lIiyiD0.net]
- いや、お前に合わせているだけだな。さすが常時上から目線なんかしらんが常時上に立ちたいの人は言うことが違うなw
- 176 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:27:29.69 ID:8ua9ZMtc0.net]
- 上にたってるつもりはないんですが、上に見えちゃうんですかね?w
悪い奴らが「正義の味方のつもりかよwww」って 笑ってるようなシーンがあるけど、あれも悪い奴らに 正義に見えてるからそう言うんでしょうねぇ
- 177 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:28:28.79 ID:n5lIiyiD0.net]
- 忘れているのか常時上に立っているつもりで気がつけないwのか知らんが、ID:8ua9ZMtc0 の上から目線なレスに対しての俺のレスでしかないよ
なので、その得意げの>>174はそっくりそのままあんたにお返しいたします
- 178 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:29:44.58 ID:n5lIiyiD0.net]
- あーあ、病気なのか社会性がないのか話にならんな。まあ、いつもの無理やりなごまかしモードかな?w
- 179 名前:デフォルトの名無しさん [2018/10/04(木) 20:33:31.45 ID:vhCji18k0.net]
- 目くそ鼻くそに上も下もないわwwww
- 180 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:34:30.94 ID:n5lIiyiD0.net]
- やかましいわっw
- 181 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:50:21.03 ID:8ua9ZMtc0.net]
- これはある意味有名だから簡単だと思う
お題 ある関数に対して1以上の整数Nを引数にして呼び出した時、 1からNまでを出力する関数を作成せよ(要するにseqコマンドの簡易版) seq 5 1 2 3 4 5 : ただし、シェルビルトイン関数のみを使い、変数の使用は禁止とする (ここでいう変数とはsetコマンドで表示されるもののことである)
- 182 名前:デフォルトの名無しさん [2018/10/04(木) 20:52:49.73 ID:vhCji18k0.net]
- >>181
調子にのるな鼻くそ
- 183 名前:デフォルトの名無しさん [2018/10/04(木) 21:39:22.36 ID:sVn7z6Qaa.net]
- >>167
それ最初のposix縛りがあったら解けなくないか? $(( ))で計算させてるし。
- 184 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 23:11:17.39 ID:4+O8yrpt0.net]
- こいつ構わん方がいいゼ、俺スゲーしたいだけだから
- 185 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 23:14:04.78 ID:GYhkNq19a.net]
- レス番飛び過ぎにも程があるだろ
まぁいつもの長文だらだら流して悦に浸ってるんだろうが
- 186 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 23:32:35.30 ID:n5lIiyiD0.net]
- >>183
pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html 2004の時点であるらしい。++と--は任意。sizeof()なんてあるのかよっ
- 187 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 23:46:42.45 ID:/YMF27MO0.net]
- >>181
これは興味から訊くんだけど, 「(POSIXの範囲では)変数の局所化ができないので 変数をなるべく使わないべき」 という主張は理解できるし,俺自身もそう思う。 しかしシェルビルトイン関数しか使わず,例えば sed(1)やawk(1)など目的に合った有用なコマンドを用いない理由はなんだ? ただの趣味?
- 188 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 01:23:25.22 ID:x9IT1j0q0.net]
- >>181
$(( )) での計算をしていいなら簡単だよ。 #!/bin/bash f() { if [[ $1 -gt 0 ]]; then f $(( $1 - 1 )) echo $1 fi } f $1
- 189 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 01:24:51.76 ID:x9IT1j0q0.net]
- >>186
そうだったのか。
- 190 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 02:53:44.46 ID: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 名前:デフォルトの名無しさん [2018/10/05(金) 02:58:21.89 ID:elz6X2140.net]
- なんもわかってない低学歴知恵遅れが
はりきってしょうもないwsl使ってキャッキャッいってるわけか なるほどなるほど wsl使ってるのなんかニートぐらいしかいないわ マジで
- 192 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 03:00:21.47 ID:bSHFQ9XI0.net]
- >>188
やっぱり簡単だったかw 再帰を使うやり方で関数型言語ではおなじみの問題 もちろんシェルスクリプトは関数型ではないし 末尾最適化も行われないのでどうしても遅くなる さすがにこれは変数使ったほうが良いかな思ったw 他にも問題を作れそうなネタのはいくつかあるんで 気が向いたらまた問題にしてみるよ
- 193 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 03:01:11.86 ID:bSHFQ9XI0.net]
- >>191
やっぱ内容には全く触れず 叩けそうな所を叩くだけなんだなw 技術者としてつまらないね
- 194 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 03:25:46.03 ID:98l9MfY+0.net]
- 実用的じゃないもの書いてるうちは似非の技術者じゃの
- 195 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 03:52:16.47 ID:DwOdckeN0.net]
- >>190
シェルスクリプトはストリーミング指向だから そもそも制御文を多用することは避けたほうがいいのではってのは違うのかな。
- 196 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 08:48:03.27 ID:bSHFQ9XI0.net]
- >>195
ストリーミング指向と制御文はあまり関係ないと思うよ 流れてくるものに対してなにか処理をしたいなら必ず 制御文を使うことになるし ストリーミング指向の話をするなら、関数呼び出しし結果の標準出力を 変数にキャプチャするっていうのはストリーミング指向と反してると思う 例えば result=$(command "$data") みたいな形のことね 俺もこの書き方はなるべく避けるようになった ストリーミング指向的には echo "$data" | command | 別のなにか とするほうが良いだろう ただ気づいたのがこの形だとサブシェルになってしまうから、 commandや別のなにかから、呼び出しの起点にデータを戻すことが 簡単にはできないという所。値を戻すこと自体がストリーミングの流れに反しているし かと言ってそれが必要な場合もある。例えば処理した行数をカウントしたりとかね。 なので最近はイベントハンドラ方式を使うようになった echo "$data" | command "別のなにか(関数名)" (または command "$data" "別のなにか") 例えばだけどこんな感じにして、commandで$dataを1行ずつ処理して その都度、別のなにか(関数)を呼び出す。そうするとサブシェルにはならないので ストリーミングで処理しつつ、グローバル変数経由で呼び出し元に結果を返すことができる この時、別の何かがシェル関数の場合に、commandが外部コマンドだとシェル関数を呼び出せないので 連鎖的にcommandもシェル関数として実装。みたいなこともやってたりする
- 197 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 17:11:32.63 ID:bSHFQ9XI0.net]
- 10. 移植性のあるシェルプログラミング
web.sfc.wide.ad.jp/~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html
- 198 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 21:16:49.85 ID:NK5dBb8n0.net]
- >>196
なるほど。 俺は https://www.ipsj.or.jp/dp/contents/publication/32/S0804-R1601.html ここの3.1.1を読んで、制御文をなるべく使わない方向に開発をシフトしてみたんだよね。 まあどうしても必要な部分はあなたも云ってる通りもちろんあるけど。
- 199 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 08:20:34.66 ID: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
|

|