シェルスクリプト総合 その29

■ このスレッドは過去ログ倉庫に格納されています
2018/09/22(土) 11:53:21.38ID:BBiLRgnj0
!extend:on:vvvvv:1000:512
!extend:on:vvvvv:1000:512
シェルスクリプトに関する総合スレッドです。

スレ立て時は以下の文を先頭行に加えて下さい。
後のつけ忘れ防止の為に複数行重ねて追加推奨
!extend:on:vvvvv:1000:512

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ
シェルスクリプト総合 その28
http://mevius.5ch.net/test/read.cgi/tech/1532397676/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
12デフォルトの名無しさん (ワッチョイ c980-yqSl)
垢版 |
2018/09/22(土) 20:49:57.60ID:PGp2AKzL0
それだとな
USとRSのasciiデータを含むことができないワケ

やっぱりな低学歴知恵遅れは致命的に頭悪い
2018/09/22(土) 21:19:04.63ID:SEEeyc/qa
>>11
だから前スレでやれ
ついでに俺はスレ立てた本人だ
2018/09/22(土) 21:37:44.00ID:Ma0PioWH0
> ついでに俺はスレ立てた本人だ

1デフォルトの名無しさん (ワッチョイ 3efb-m2E0)2018/09/22(土) 11:53:21.38ID:BBiLRgnj0
13デフォルトの名無しさん (アウアウカー Sae9-m2E0)2018/09/22(土) 21:19:04.63ID:SEEeyc/q

ワッチョイ
アウアウカー

なるほどねw
2018/09/22(土) 22:01:52.49ID:XHaRNOKU0
何でも喧嘩越しだなんて…
お前ら人生もっと楽に生きろよ
2018/09/22(土) 22:04:10.95ID:SEEeyc/qa
>>14
スマホ回線だとスレ立て規制されてたからWi-Fi繋いだだけだぞ
恥ずかしい思いする前にワッチョイの右側読み取ろうな
2018/09/22(土) 22:16:05.03ID:n0R7Fe5t0
無敵だなw無敵という表現は正しくはないが
まあ、あんまカッカしないでw
2018/09/22(土) 22:21:58.24ID:j6So/S370
      シュッ  シュッ
        ∧∧ シュッ   シュッ
        (`・ω・) シュッ  シュッ みんな、ここは飲んで気を落ち着かせるんだ!!
        (つ と彡 / シュッ
         /// /
        /c□ /
      /旦  /
     //c□ ./
   /旦 Y  /
   | |   旦 |
   |旦  ガシャーン
     ガシャーン
   ガシャーン  ガシャーン
2018/09/22(土) 23:18:46.87ID:KDtJrl5K0
ワッチョイもついたようだし、スレ新しくなったので前スレのこれお願い

bashでさ、typesetで関数の中身を出力できるじゃん?
それをevalで評価したら同じ関数が出来上がるじゃん?
これってどれくらい信用できるんだろう?

作成した関数のコードそのままの形で出力されるなら
evalで評価して同じものができるだろうけど、
ぱっとみtypesetで出力するされたものをみると、
改行の位置とか変わって整形された状態になって
関数にはfunctionが頭に追加されてる。

元のコードをどれくらい書き換えるんだろうか?
これ以外になにか変わる事知ってたりする人いない?
20デフォルトの名無しさん (ワッチョイ bd03-qdKu)
垢版 |
2018/09/22(土) 23:40:33.97ID:T1K71jdo0
>>19
つまりおまえは定義した関数とそれをtypesetで表示させた物が別もんやと思とるんか?
そこまで疑っとって逆によくbash使えんなw
おまえの頭の中はどおなっとるんやw
2018/09/23(日) 00:19:41.09ID:gqT47rCG0
ワッチョイでスレを立てたのは前スレを荒らしに荒らしまくった多数回線で自演するRubyアンチのPyキチだよ
自分だけが自演できるワッチョイスレを立てて工作したいんだと思う
次世代スレもワッチョイで立てようとしたけどあっちは失敗したみたいだし
2018/09/23(日) 00:21:35.03ID:IvXdDnc90
前スレの終わらせ具合からそう見えないこともないなww
2018/09/23(日) 00:25:42.58ID:wRiEEsWva
スレ立てたのも前スレ終わらせたのも俺だがそれのこと言ってんのか?
rubyもpythonも語ったことなんてないが妄想すごいですね
2018/09/23(日) 00:40:41.02ID:IvXdDnc90
うん、妄想は尽きないw
ちょっと終わらせ方が強引だったからねえ、ヤツならやりそうだなと。反省してっwまた、すぐ怒ったり(?)しないでね
2018/09/23(日) 00:51:46.20ID:IvXdDnc90
発端となった>>7が全然続かないのな。もう続けてもええんやで
じゃなきゃ、前スレでやれでしかなかった、および、無理やり終わらせた意味がゼロだなw
26デフォルトの名無しさん (ワッチョイ c980-yqSl)
垢版 |
2018/09/23(日) 00:53:01.00ID:cRG95Xcq0
低学歴知恵遅れの戯言にだれも興味なんかない
まずその自覚がない
27デフォルトの名無しさん (ワッチョイ c980-yqSl)
垢版 |
2018/09/23(日) 00:54:17.26ID:cRG95Xcq0
まず相当頭悪いこと書いてる自覚がない
そこが問題だからな
2018/09/23(日) 00:56:29.70ID:IvXdDnc90
ワンパターンのフレーズを繰り返すしかできないのあったが、悔しくてそれでもしてしまう自称賢いはんかくであった
としか見えないなw
29デフォルトの名無しさん (ワッチョイ c980-yqSl)
垢版 |
2018/09/23(日) 00:57:32.98ID:cRG95Xcq0
>>12にも書いたとおり
USとRSのasciiデータを含むことができない
コレでおわりだからな
30デフォルトの名無しさん (ワッチョイ c980-yqSl)
垢版 |
2018/09/23(日) 00:58:37.38ID:cRG95Xcq0
頭悪いことを自覚できないかぎり
頭悪いのは治らない

コレは真理だからな
2018/09/23(日) 01:02:12.95ID:wRiEEsWva
なんでワッチョイつけた後になっても半角に構ってるんですかねぇ
とっととNGしてどうぞ
2018/09/23(日) 01:04:05.84ID:IvXdDnc90
>>29,30
あんた自身ではわざわざ終わってるのに蒸し返すんだな。俺の蒸し返し(?)の意味は違うぞ
おとなしく前スレでやればいいことだった、前スレを強制終了することもなかった
だからな?あんたの主張なんて関係ない興味ない(自称賢いを言いたいがためのなんてw)

>>31
んー、まあ、ノリでw
33デフォルトの名無しさん (ワッチョイ c980-yqSl)
垢版 |
2018/09/23(日) 01:04:07.40ID:cRG95Xcq0
まず勘違いしてるのは
オレが賢いとかいってるところ

オレが賢いのではなく
当事者が日常生活に支障をきたすであろうと考えられるぐらい頭悪いこと問題だからな

そういう問題だ
軽度の知的障害があると推認できる
2018/09/23(日) 01:05:09.76ID:IvXdDnc90
よく言うよ。不特定に向けてもそういうフレーズ使ってるくせに。ほんと自称賢いだな
2018/09/23(日) 01:34:23.77ID:D4/zD5nR0
淫夢語録を使うな
36デフォルトの名無しさん (ワッチョイ 6ee9-4aAB)
垢版 |
2018/09/23(日) 02:37:03.28ID:Te/My51X0
別人なんですアピール終わった?
ほんとうざいわコイツ
2018/09/23(日) 08:59:25.73ID:a7uxw1Gj0
前スレのPOSIX荒らしの頃から、雰囲気悪いなぁ
2018/09/23(日) 09:03:53.53ID:4WDm+Clw0
そんなに悔しかったんだ...
2018/09/23(日) 12:00:26.57ID:MAME2I+ya
大学生が課題貼り始めたあたりから何かがおかしくなっていったな
極めつけはCSVだったが
40デフォルトの名無しさん (ワッチョイ bd03-qdKu)
垢版 |
2018/09/23(日) 12:30:25.47ID:0vXeudiz0
>>39
おまえが出入りしだしたあたりからだいぶおかしいでwおまえのせいとは言わんけどw
2018/09/23(日) 12:51:24.23ID:MAME2I+ya
>>40
さてそれはいつ頃か正確に言ってくれませんかね?
ドンピシャしたらROMってあげよう単芝君
2018/09/23(日) 13:51:05.35ID:VGMMYKH/0
なんでそうすぐにムキになるんだか。>>39なんて俯瞰してもの言えないんじゃねと
2018/09/23(日) 15:46:02.02ID:D4/zD5nR0
でもASCII区切り文字を使ったいいアイデアが出たので俺は嬉しいよ
44デフォルトの名無しさん (ワッチョイ c980-yqSl)
垢版 |
2018/09/23(日) 18:04:09.53ID:cRG95Xcq0
エクセルの出力結果みればわかるとおり
もともとなにも問題ない

低学歴知恵遅れがその出力より劣化したアイデア()を
ドヤ顔してだしてるだけだからな

それはな世間一般ではアイデアとはいわない
それは頭悪い寝言という

わかった?
2018/09/23(日) 20:05:39.90ID:i9SY9vW90
とお前は言う
46デフォルトの名無しさん (ワッチョイ bd03-qdKu)
垢版 |
2018/09/23(日) 21:39:22.13ID:0vXeudiz0
>>41
ムキになっとるのは何か自覚でもあったんか?w
47デフォルトの名無しさん (ワッチョイ 2e98-coYL)
垢版 |
2018/09/24(月) 07:30:26.77ID:csv6kfNU0
CSV、CSVうるせーんだよ、このCSV野郎が!
2018/09/25(火) 00:49:55.83ID:lmrEE7TE0
Shell Scriptって国際化はできないの?
調べるとBashは$"text"→$"文"みたいなことができたらしいけどこれも今では使えないし(Bash 3.xで削除?)。
需要がないのかな やっぱり
2018/09/25(火) 01:56:25.59ID:BMMTvniR0
>>48
できるよ。gettext.shってのが用意されてる。
ライブラリになっていて、おそらくパスも通ってるはずだから
. gettext.shで読み込めるはず。

そしてeval_gettext関数を使って翻訳するわけだが、
http://www.nofuture.tv/diary/20130329.html の記事を見ると
> echo "$(eval_gettext "hello world")"
と書いてあるな?

eval_gettext "hello world"
だけじゃだめなんだろうか?
一般的には等価だし、これだけでもメッセージの抜き出しはできるはず

なにより"$(・・・)"を使うとforkが行われるから
WSLで遅くなることが懸念される

そのうち使うことになるとは思ってるが、まだ試してないのでよろしくw
50デフォルトの名無しさん (ワッチョイ 469f-coYL)
垢版 |
2018/09/25(火) 02:52:25.49ID:VjhU4mZC0
>>48
え?これできないの?
http://www.unixuser.org/~ysjj/bash_script_i18n.html

しかし Linux の bash の man ページには $"string" あるなあ。
https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html
2018/09/25(火) 05:08:08.34ID:BMMTvniR0
だからセキュリティの理由により非推奨になったって書いてあるやん
一つ上のレスぐらい読もうよ
2018/09/25(火) 05:09:28.74ID:S/r6pG9La
長いから読んでもらえないんじゃね
2018/09/25(火) 05:18:05.28ID:lmrEE7TE0
え,俺?
2018/09/25(火) 05:20:16.93ID:S/r6pG9La
なんか俺は勘違いしたかもしれん、
>>52は無視してくれ
2018/09/25(火) 07:05:22.02ID:BMMTvniR0
>>52
それで恥をかくのは読んでない人なわけで
自業自得だけどな
56デフォルトの名無しさん (ワッチョイ 469f-3QZN)
垢版 |
2018/09/25(火) 08:29:51.94ID:VjhU4mZC0
>>51
今見た。元々リロード忘れて一つ上が見えない状態で書いてたのと、見えた後でリンク先見てなかったのでセキュリティの都合で非推奨になった事に気づかなかった。

でも非推奨ってことは使えないこともないのかな?だからmanページには残ってるとか?使わん方が良いことには変わりはないだろうが。
2018/09/25(火) 09:03:56.75ID:BMMTvniR0
> この方法はセキュリティ上の問題(シフトJISや中国語のエンコーディングではダブルクォーテーションを無効にできてしまうなど。

というような、ASCIIと互換性がない文字コードによる問題だから
そういう文字コード自体を非推奨として対応から外せたら良いのに
Unicode以外の文字コードが絶滅するのはいつになるんだろうな
2018/09/25(火) 22:39:41.88ID:lmrEE7TE0
shebangって書かないほうがいいのかもな。
> If the first line of a file of shell commands starts with the characters "#!",
> the results are unspecified
---http://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.
---http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html#tag_16_111_08
だし。
2018/09/26(水) 00:23:55.64ID:+a+RcOTAM
それは誤読だろ。
execveとかにシェルスクリプト渡したらどうなるか知らん、
execlpとか使えってことでしょ。
実装としてどっちで#!を解釈するかはOSに任せられている。
2018/09/26(水) 01:08:43.37ID:yzZF1GUc0
shebangって書かないほうがいいんじゃないかって話は
どこかの誰かがまとめてただろ

書かなくて良いんじゃないかと思うが
書かないとshellcheckが警告出すんだよな。
パラメータじゃない方法でシェルを指定する方法があれば良いんだが
2018/09/26(水) 06:41:40.90ID:aDQj+U850
>>60
> shebangって書かないほうがいいんじゃないかって話はどこかの誰かがまとめてただろ

読んでみたい
2018/09/26(水) 07:00:32.41ID:p8TYnMT50
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
2018/09/26(水) 07:43:20.75ID:yzZF1GUc0
ったく、そっちじゃねーよ
https://togetter.com/li/1077808

簡単にまとめるとだな。Androidでは sh は /bin/sh に存在しない
/system/bin/sh だから、どちらでも通じるシバンは書けない

なら書かなくて良いのでは?
→ そのとおり。POSIXではシバンがなければshで起動されると明記されてる

(注意 ログインシェルとしてcshを使用してる場合、先頭一文字目が#
つまりコメント行だったらcshで起動されるので:コマンドなどで無効化する
cshはファイルの先頭が#でなければPOSIX shで起動する)
2018/09/26(水) 08:05:31.15ID:p8TYnMT50
ちなみに
bash$ cat ./sbtest.sh
ps -o comm= $$
bash$ ./sbtest.sh
bash
↑↑ Bashじゃねーか
っていう罠もある。
2018/09/26(水) 09:25:36.26ID:pB5sfbMh0
ちょっと質問です。
プログラムが終了していたら再起動し、20秒以上動いていたら強制終了させて再起動したい。
どう書けばいいですか?
66デフォルトの名無しさん (アウアウカー Sae9-rLjT)
垢版 |
2018/09/26(水) 09:56:06.94ID:QtvShas/a
>>65
そうだなあ。Linuxとかならkillでシグナル番号0を送ると指定のプロセスの生死を確認できるのでそれ利用して作るかな。
しかしその場合は動いているプロセスのPIDがわからないとダメだ。これがわからない状態でやらねばならない場合はpsの出力にgrepして探すかな。
2018/09/26(水) 10:01:22.38ID:FJCeOZRMr
> プログラムが終了していたら再起動し、

親シェルスクリプト(プログラム)作ってループ起動
例えばcronの5分間隔とかにすると隙間が開く可能性がある

> 20秒以上動いていたら強制終了させて再起動したい。

監視シェルスクリプト(プログラム)作る
起動させた時間はpsコマンドで分かる
今の時刻はdateコマンドで分かる
強制終了はkillコマンドでできる
監視の間隔(チェックを何分おきにやるか)は自分で決める
例えば1分間隔で監視したら最悪60秒以上動く場合がある

waitしないループは結構CPUに負荷をかけるから注意
2018/09/26(水) 11:15:01.91ID:yzZF1GUc0
こんな感じかねぇ


プログラム名からプロセスIDを取得して変数に入れる
while :; do
 psコマンドでプロセスID変数の起動時間取得
 if 取得できたら; then
  if 20秒以上経過していたら; then
   kill プロセスID
  fi
 else # 取得できなかったら
  プログラム起動 &
  新たなプロセスIDを変数に入れる
 fi
 sleep 1
done
2018/09/26(水) 15:07:59.55ID:yzZF1GUc0
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する必要なかったんや
2018/09/26(水) 15:10:23.80ID:yzZF1GUc0
長文乙w つーわけで、サブシェルの中から変数を返す方法 汎用版

i=0
eval "$(cat /etc/hosts | { while read line; do
 i=$((i+1))
done
set
})"
echo $i # 俺の環境では11だった

set呼ぶだけで、簡単に変数返せるぞ
2018/09/26(水) 15:11:28.48ID:yzZF1GUc0
ちなみにbashとかだとデフォルトでは関数まで返しちゃうので注意な
2018/09/26(水) 22:48:58.32ID:p8TYnMT50
シェルスクリプトじゃないんだけど
Makefileのファイル名(例えばGNUMakefileだったりmakefileだったりするよね)
を取得したりってできる?
つまり
$ cat ./Makefile
all:
>---echo $0
$ make
Makefile
みたいな。もちろんMakefileはshが解釈しないんで, $0を使うことはできないけど。
2018/09/26(水) 23:44:41.88ID:p8TYnMT50
追記
GNU makeなら$(MAKEFILE_LIST)が使えるらしいがFreeBSDでも使いたいんだよね……
2018/09/27(木) 00:12:48.73ID:indBRC1Z0
MAKEFILE_LIST
https://www.freebsd.org/cgi/man.cgi?query=make&;apropos=0&sektion=0&manpath=FreeBSD+6.2-RELEASE&format=html
2018/09/27(木) 00:23:32.14ID:IUmy3t5S0
all:
@echo $(lastword $(MAKEFILE_LIST))

とか。
2018/09/27(木) 00:24:08.12ID:IUmy3t5S0
おっと、TAB が使えないんだったな
2018/09/27(木) 00:36:01.18ID:indBRC1Z0
ああ、>>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
今度は試してみたが確かにっぽい
2018/09/27(木) 02:38:06.19ID:RGPgoULv0
>>70
なんでcatがいるの?
catなくせば苦労しないんじゃないの?
2018/09/27(木) 02:48:37.10ID:Fk1HpByz0
>>78
catはただの一例にすぎん。そこは本質ではない。

サブシェルの中の変数を、サブシェルの呼び出し元に
戻す方法の話をしてる
2018/09/27(木) 03:09:09.89ID:Fk1HpByz0
もう少し見やすく、汎用的な書き方をするとこんな感じかな
サブシェル(change_vars)内で追加や変更した変数を
すべてサブシェルの親に返す方法

# もちろん例
change_vars() { i=123; }
eval "$(somecommand | { change_vars; set; })"
echo $i


実際には変更してないものすべてを再代入してるわけだが
それを行った所で問題はない。

ただしreadonlyを使ってると代入できなくてエラーになる。
これはなにかいい回避策はないだろうか
2018/09/27(木) 03:23:00.68ID:Fk1HpByz0
readonlyになってる変数一覧はreadonly -pで取得できる
その結果をパースしてごにゃごにゃやればできるんだろうけど、

readonly -pの結果が、
bashだと declare -r a="1"
dashだと readonly a='1'
と異なるのでパースが面倒くさい上に、
変数名がわかったからといってどうするのだ?問題がある

サブシェル内でもreadonlyだからunsetできない。
setをパースして消すのは改行文字とかの対応で面倒
エラーを無視しようにもうまくいかない

詰んだw
2018/09/27(木) 03:37:41.74ID:GWQb325r0
"Field with Space" "Second Field" ...
みたいなフィールの連続に対して一番初めのフィールドを取得したいんだけど
なんかいい方法ない? ただしフィールドのなかに特殊な文字は含まれないし、「"」記号もフィールを区別する目的以外には使われてない。
これコマンドに渡す引数の形と似てるから$1とか上手く利用したらいい感じの処理ができそうなんだけど
思い付かん……。
2018/09/27(木) 03:38:09.61ID:GWQb325r0
なぜかフィールドが二箇所でフィールになってるww
2018/09/27(木) 03:50:48.26ID:Fk1HpByz0
ちゃんとフールって書けよ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文字ずつパースして処理するとか
2018/09/27(木) 04:38:59.49ID:GWQb325r0
あーやっぱり変数に代入する感じか。
(データが安全なのは保証されてるんだけど 長いんだよね)
でもありがとう。とりあえずそれで行く。
2018/09/27(木) 04:43:30.53ID:Fk1HpByz0
変数というか、$1, $2, ... だけど
変数($1等含む)に入れないでどうやれとw
標準入力?
2018/09/27(木) 05:30:19.44ID:GWQb325r0
いや 結局変数に入れることと一緒なんだけど
$ echo '"Field with Space" "Second Field"' | { eval set -- "$(cat -)"; echo $1; }
みたいにしてみた。というのは実際のデータは標準出力から流れてくるから
できるだけパイプで処理したいなというのがあった。

いずれにせよeval setなんて思い付きもしなかったんで むちゃくちゃ感謝してる。
難癖を付けてる訳ではないよ。いやマジで。
2018/09/27(木) 07:41:11.09ID:wRik+4En0
>>87
別に気分悪くしたとかじゃなくて、
なにか処理するなら結局変数に入れるよなーってだけだよ
標準入力からでもreadで変数に入れるわけだし

最近eval多用してる。もちろんそれがどうしても必要だからだけど
特に速度が遅くなるわけでもないし色々と便利
2018/09/27(木) 09:31:12.30ID:0Kr1SoI20
丁寧な回答をもらっておいて「でも」「とりあえず」は失礼だろう
「お前の回答はイマイチだが時間もないし採用してやるか」という感じかな?
2018/09/27(木) 09:36:53.29ID:wRik+4En0
今日の荒らしは>>89
2018/09/27(木) 10:20:00.38ID:pwwRK9qRa
荒らし認定兄貴今日もお疲れ様です
2018/09/27(木) 11:06:37.78ID:RGPgoULv0
正論を書くとあらし認定されるんですね
93デフォルトの名無しさん (オッペケ Sr4b-+FqY)
垢版 |
2018/09/27(木) 12:20:46.63ID:99b9Jx0Mr
大体失礼なのはこの手の答えたがりw
94デフォルトの名無しさん (アウアウカー Saab-XaUO)
垢版 |
2018/09/27(木) 13:17:03.86ID:U92lHhY6a
>>70
それ set じゃなくて最後に echo i=$i だけで良いのでは?
2018/09/27(木) 14:01:53.41ID:wRik+4En0
>>94
だから汎用的な解だってばw
変数が複数あっても対応できるし
変数の中にエスケープが必要な文字があっても対応できる

あ、これに関して良いアイデアが浮かんできた。気がするw
2018/09/27(木) 14:05:58.33ID:wRik+4En0
こういう問題について考えていると、bashの拡張ってよく考えられてるなって思うよ
ちゃんと足りなくて必要な機能を追加してくれてる

https://qiita.com/t_nakayama0714/items/80b4c94de43643f4be51#prefix-%E5%A4%89%E6%95%B0%E5%90%8D%E4%B8%80%E8%A6%A7
2018/09/27(木) 17:43:23.75ID:GWQb325r0
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#compact
こういうのとかもすっげえ便利だよね。
$ VAR=val; echo ${VAR@A}
VAR='val'
でも新しい機能なのか,日本語版のマニュアルに掲載されてない。

(まあ俺はPOSIXに準拠したほうがいいと思ってるので,こういう機能は
それこそ一時的な使い捨てスクリプトにしか使わんけど)
98デフォルトの名無しさん (ワッチョイ bf9f-MYrK)
垢版 |
2018/09/28(金) 02:21:47.32ID:5yuIehG00
>>97
それCentOS7に入ってるbashではエラーになる。
新しい機能だな。
2018/09/28(金) 10:45:59.06ID:TLhVFQk50
ファイルのメディアタイプを取得する汎用な方法ってあるかな。
自作してもいいんだけどできれば既存のものを利用したい。
file(1)コマンドの-iオプションがまず思い付いたんだけど,これは
GNU/Linux(http://man7.org/linux/man-pages/man1/file.1.html
FreeBSD(https://www.freebsd.org/cgi/man.cgi?query=file&;sektion=1)
ではメディアタイプで出力するとあるのに対し
本家POSIX(http://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あたりでさ。
2018/09/28(金) 13:07:01.59ID:bPXaydqo0
>>99
メディアタイプの種類自体は標準化されていたとしても、
あるファイルがどのメディアタイプかってのは決まらないでしょ?

拡張子cgiのスクリプトファイルだって、ソースコード配布サイトなら
テキストファイル扱いにしたいだろうし
2018/09/29(土) 13:10:10.20ID:d3Gl2lPg0
特別な意味をもたせた終了コードをなんにしようかな?って考えてるんだけど
既存で使われてる終了コードとなるべくかぶらせたくない。
どんなのがあるか知らない?

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
http://kaworu.jpn.org/doc/FreeBSD/jman/man3/sysexits.3.php
http://tldp.org/LDP/abs/html/exitcodes.html

一番最後のリンクでsysexitsの作者は64〜113をユーザー用に使うことを提案してるみたいだけど
定義済みを除けば残りは79〜113かな
102デフォルトの名無しさん (ワッチョイ 5780-q1nr)
垢版 |
2018/09/29(土) 13:18:50.90ID:IuTgmxg/0
オツムに欠陥があるヤツでなければ
普通に別の環境変数にいれる
2018/09/29(土) 14:08:42.53ID:PPHj/b7C0
>>101
ていうか寧ろそのなかのどれかでいいんじゃないの?

それともその定義に収まらないエラーなの?
鼻からドラゴンが出ました!exit 80 とか。
2018/09/29(土) 15:12:55.62ID:d3Gl2lPg0
>>103
そう言われるかなとは思ったw

「俺の作ったプログラム」 ==> 「俺の作ったフィルタ」 ==> 「任意のプログラム」

という呼び出しの流れで

「俺の作ったプログラム」 で「任意のプログラム」 の終了コードを知りたいが、
「俺の作ったフィルタ」 独自の終了コードだけは特別扱いしたいということ

「任意のプログラム」のエラーは想定外のエラーで
「俺の作ったフィルタ」のエラーは想定されたエラーで
どちらもエラーではあるんだけど「俺の作ったプログラム」で表示するメッセージが違う
それぐらいなので、かぶってしまっても大きな問題は発生しないんだけどね
2018/09/29(土) 17:52:02.97ID:PPHj/b7C0
>>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
2018/09/29(土) 17:54:32.38ID:PPHj/b7C0
ああ,なんか説明不足で投稿しちゃった。
つまりさ,一応標準で定められたエラー番号はあるものの,
各種アプリケーションが従っている訳でもなく
Debian系のaptコマンドのような超大手のアプリケーションでさえ標準を無視してるんだから,
> 定義済みを除けば残りは79〜113かな
↑こういうのは考えないほうがいいんじゃない? ってこと。
2018/09/29(土) 18:22:23.04ID:d3Gl2lPg0
>>105-106
どこかのなにかにかぶってしまうのは防ぎようがないけど
よく使われるコマンドがこんな終了コードを使っていたっていう事例を知りたいのよ

fsckとかどう見てもエラーじゃねーだろコレっていうのが
エラーあつかいになってて以前はハマったことあるしw

https://linuxjm.osdn.jp/html/e2fsprogs/man8/fsck.8.html
> 1 - ファイルシステムのエラーが修正された
2018/09/29(土) 18:23:25.37ID:d3Gl2lPg0
標準に準拠したいとかそういう話ではなく
単にぶつかりたくないだけ
2018/09/29(土) 18:24:45.45ID:d3Gl2lPg0
> exit 100を返すというトンデモ仕様[Debian 2015]なので,もうどうしようもないんじゃねw

実を言うと今100を使おうとしていたw
やはり裏の裏の裏の裏ぐらいを読まないとダメだなw
2018/09/29(土) 18:40:55.97ID:PPHj/b7C0
非0の返り値だけどコマンドは成功しているっていう例として有名なのはdiff(1)とかかな。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/diff.html#tag_20_34_14
>1
>  Differences were found.
2018/09/29(土) 18:46:56.62ID:8M0IW2fy0
シグナルでも使ってみたらどうだろうか。
あるいは別にパイプを用意するとか。
112デフォルトの名無しさん (ワッチョイ bf9f-MYrK)
垢版 |
2018/09/30(日) 02:44:50.58ID:KPqVv5wd0
絶対にぶつからないようにするには別の方法でエラーを伝えるようにするぐらいしか方法ないんじゃないか?
同じ値になる可能性のあるものをどちらから発生したかわからない状態で同じ所から得るなんてやはり無理があるだろう。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況