シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
シェルスクリプト総合 その32
■ このスレッドは過去ログ倉庫に格納されています
2019/10/25(金) 00:08:45.53ID:6btPTvif
411デフォルトの名無しさん
2020/01/22(水) 07:22:53.82ID:uCiji4On GUI Terminalアプリは一般的にコマンドが実行し終えたらアプリも終える=ウィンドウも消えるという、まあそうなるか的な(まあshもそうだし)
gnome-terminalはオプションでウィンドウを残すようにできるが、なんかイマイチかな、出るべきものが出てないとか
gnome-terminal -- sh -c 'なんかコマンド;sh'
が確実に解りやすいかなあ
shで引き続きインタラクティブにするのには、--rcfile スクリプトファイル という変態的な方法で
gnome-terminal -- sh --rcfile スクリプトファイル
とかあったが、変態すぎてしないなw
gnome-terminalはオプションでウィンドウを残すようにできるが、なんかイマイチかな、出るべきものが出てないとか
gnome-terminal -- sh -c 'なんかコマンド;sh'
が確実に解りやすいかなあ
shで引き続きインタラクティブにするのには、--rcfile スクリプトファイル という変態的な方法で
gnome-terminal -- sh --rcfile スクリプトファイル
とかあったが、変態すぎてしないなw
412デフォルトの名無しさん
2020/01/22(水) 20:17:38.02ID:IMIM4EWG 返信ありがとうございます!
具体的にはFIFOを複数作成した後に、
ffplay (作成したfifo) というコマンドを
fifoの数だけ開きたいのですが、数が多くて一つ一つ開くのは大変なので、スクリプトで一気に開けないかと考えているところです。
具体的にはFIFOを複数作成した後に、
ffplay (作成したfifo) というコマンドを
fifoの数だけ開きたいのですが、数が多くて一つ一つ開くのは大変なので、スクリプトで一気に開けないかと考えているところです。
413デフォルトの名無しさん
2020/01/22(水) 20:31:41.36ID:aGAY9ZaD ffplayって自分で独自のウィンドウ開くんじゃないの?
全てバックグラウンドで起動する/動かせばいいんじゃないの?
ffplayが吐くログも同時に見たいとか??
全てバックグラウンドで起動する/動かせばいいんじゃないの?
ffplayが吐くログも同時に見たいとか??
414デフォルトの名無しさん
2020/01/22(水) 20:38:59.30ID:0dPQnm43415デフォルトの名無しさん
2020/01/22(水) 21:18:09.64ID:aGAY9ZaD for i in 1 2 3 4; do
gnome-terminal -- ffplay $i.fifo
done
で、再生中はTerminalウィンドウも健在でログも見えるんじゃないの。ffplayが終了したらTerminalウィンドウは閉じてしまう
gnome-terminal -- sh -c "ffplay $i.fifo;sh"
で、Terminalウィンドウも残ると思うけど。Terminalウィンドウでffplayを終了させようとctrl-cすると、後のsh起動まで行かないけど
gnome-terminal -- ffplay $i.fifo
done
で、再生中はTerminalウィンドウも健在でログも見えるんじゃないの。ffplayが終了したらTerminalウィンドウは閉じてしまう
gnome-terminal -- sh -c "ffplay $i.fifo;sh"
で、Terminalウィンドウも残ると思うけど。Terminalウィンドウでffplayを終了させようとctrl-cすると、後のsh起動まで行かないけど
416デフォルトの名無しさん
2020/01/22(水) 21:37:15.05ID:0dPQnm43417デフォルトの名無しさん
2020/01/25(土) 17:35:52.15ID:2I6NhO3j index=2,INFO1="abc",INFO2="ab,c"
↑こういう風に
「カンマ区切りで値が並んでて、区切り文字ではないカンマは引用符で囲まれてる」
みたいなデータに対して、
シェルスクリプトでINFO2やらindexやらの値を取得したいんだけどどういう方法がいいですかね。
IFSをカンマにする方法では引用符で囲まれてるカンマも区切りと見做されちゃうし…
シェルって""←の中を特別に扱う筈だから、evalとか使えば効率的に処理できそうなんだけど、
思い付かん…
↑こういう風に
「カンマ区切りで値が並んでて、区切り文字ではないカンマは引用符で囲まれてる」
みたいなデータに対して、
シェルスクリプトでINFO2やらindexやらの値を取得したいんだけどどういう方法がいいですかね。
IFSをカンマにする方法では引用符で囲まれてるカンマも区切りと見做されちゃうし…
シェルって""←の中を特別に扱う筈だから、evalとか使えば効率的に処理できそうなんだけど、
思い付かん…
418デフォルトの名無しさん
2020/01/25(土) 19:29:47.91ID:nGGHbHoP なんか前も似たような話があった気がするな
でもカンマ区切りでダブルクォートの中にカンマが含まれてるのかー
ってかCSV形式だなw
CSV関連のコマンドと連携させれば簡単に作れるけど
俺は使いたくないなー。というすると自分でパースするしか無いかなー
自分が必要なら最悪パースするけど、簡単な方法ないかなーw
でもカンマ区切りでダブルクォートの中にカンマが含まれてるのかー
ってかCSV形式だなw
CSV関連のコマンドと連携させれば簡単に作れるけど
俺は使いたくないなー。というすると自分でパースするしか無いかなー
自分が必要なら最悪パースするけど、簡単な方法ないかなーw
419デフォルトの名無しさん
2020/01/25(土) 19:31:22.74ID:nGGHbHoP あ、IFSをカンマにしてから、evalに渡せばできるんじゃね?
420デフォルトの名無しさん
2020/01/25(土) 19:32:25.51ID:nGGHbHoP あ、evalじゃだめか。setがいるか
421デフォルトの名無しさん
2020/01/25(土) 19:44:38.62ID:nGGHbHoP setはいらんかったw
あとはスペースが入ってるときかー、どうやって対処するかな?
あとはスペースが入ってるときかー、どうやって対処するかな?
422デフォルトの名無しさん
2020/01/25(土) 20:29:47.31ID:2I6NhO3j423デフォルトの名無しさん
2020/01/25(土) 20:29:55.33ID:S3XsKqnt プログラミング言語でやったことあるけど
もともとあるデータに手を加えられないなら
カンマを違う区切り文字に置き換えたかな
行解析ロジック入れたりもした
最近作ったシェルスクリプトだと
読み込むファイルをちゃんと設計して
そんなデータは行末に来るようにした
そしてwhile readで処理できるようにしてる
もともとあるデータに手を加えられないなら
カンマを違う区切り文字に置き換えたかな
行解析ロジック入れたりもした
最近作ったシェルスクリプトだと
読み込むファイルをちゃんと設計して
そんなデータは行末に来るようにした
そしてwhile readで処理できるようにしてる
424デフォルトの名無しさん
2020/01/25(土) 20:48:15.05ID:2I6NhO3j 超具体的に言うと(てかここまで直接に状況を晒すとクレクレみたくなるなw)
“playlist.m3u8”っていうファイルだとして
↑こういう形式の行が沢山あるんだけど、
ここのRESOLUTIONの値と対応するMOVIE-URIの値をずらずら欲しい。
IFSを変える方法だとやっぱり引用符に関係なく「,」で区切られちゃうのよね
while read l; do
IFS=','; for s in "$l"; do
echo "$s"
done
done < ./playlist.m3u8
“playlist.m3u8”っていうファイルだとして
↑こういう形式の行が沢山あるんだけど、
ここのRESOLUTIONの値と対応するMOVIE-URIの値をずらずら欲しい。
IFSを変える方法だとやっぱり引用符に関係なく「,」で区切られちゃうのよね
while read l; do
IFS=','; for s in "$l"; do
echo "$s"
done
done < ./playlist.m3u8
425デフォルトの名無しさん
2020/01/25(土) 20:49:51.89ID:2I6NhO3j426デフォルトの名無しさん
2020/01/25(土) 21:15:13.22ID:nGGHbHoP 面倒になったー
index=2,INFO1="abc",INFO2="ab,c"
を
index=2 INFO1="abc" INFO2="ab c"
に変換すれば
evalできるよ!
あとは頑張ってー
index=2,INFO1="abc",INFO2="ab,c"
を
index=2 INFO1="abc" INFO2="ab c"
に変換すれば
evalできるよ!
あとは頑張ってー
427デフォルトの名無しさん
2020/01/25(土) 22:38:09.23ID:2I6NhO3j428デフォルトの名無しさん
2020/01/25(土) 22:39:10.68ID:nGGHbHoP >>427
戻せばいいよー
戻せばいいよー
429デフォルトの名無しさん
2020/01/25(土) 22:40:41.08ID:nGGHbHoP んー?戻すとなったらset使ったほうがいいんか?
eval set -- index=2 INFO1="abc" INFO2="ab c"
$1, $2,・・・代入されるからに処理しやすい
eval set -- index=2 INFO1="abc" INFO2="ab c"
$1, $2,・・・代入されるからに処理しやすい
430デフォルトの名無しさん
2020/01/25(土) 22:41:54.41ID:nGGHbHoP > AWKやらでガシガシ解析するしかないw
シェルスクリプトでも普通にやればいいんだけどねー
一文字ずつ処理する方法さえ調べれば、
あとは簡単な普通のパーサー
シェルスクリプトでも普通にやればいいんだけどねー
一文字ずつ処理する方法さえ調べれば、
あとは簡単な普通のパーサー
431デフォルトの名無しさん
2020/01/25(土) 22:43:30.45ID:nGGHbHoP こういうのってawkで高度(?)な機能と発想の転換で使ってこなすより
1文字ずつ処理したほうが楽でわかりやすいよな
1文字ずつ処理したほうが楽でわかりやすいよな
432デフォルトの名無しさん
2020/01/26(日) 01:20:08.20ID:GaEtLwpN GNU awk なら FPAT が使える
echo 'index=2,INFO1="abc",INFO2="ab,c"' |
gawk -vFPAT='[^=,"]+=("[^"]*"|[^,]*)' '{print gensub(FPAT, "\\1", "g")}'
=> 2,"abc","ab,c"
echo 'index=2,INFO1="abc",INFO2="ab,c"' |
gawk -vFPAT='[^=,"]+=("[^"]*"|[^,]*)' '{print gensub(FPAT, "\\1", "g")}'
=> 2,"abc","ab,c"
433デフォルトの名無しさん
2020/01/26(日) 01:26:07.97ID:gf7z5zyj >>432
そういうやつね、高度な機能っていうのは
大体動くんだろうけど、仕組みを把握するのがだるいんだよね
仕組みっていうかどこまで動いて、どこが動かないのかの把握
大体動く精神なんだろうけど、それ使う側がそれで
納得できる前提だから、知らない人が使う場合困るんだよな
いざ問題が起きたら、対応が逆に大変になる
そういうやつね、高度な機能っていうのは
大体動くんだろうけど、仕組みを把握するのがだるいんだよね
仕組みっていうかどこまで動いて、どこが動かないのかの把握
大体動く精神なんだろうけど、それ使う側がそれで
納得できる前提だから、知らない人が使う場合困るんだよな
いざ問題が起きたら、対応が逆に大変になる
434デフォルトの名無しさん
2020/01/26(日) 01:31:16.29ID:GaEtLwpN いやぁ、こっちからみると eval や set を使う方がツラいわ…
435デフォルトの名無しさん
2020/01/26(日) 01:38:47.61ID:3NTRDHS2 evalやsetは普通にシェルが文法を解釈するのと
同じ動きをするだけなんだからシンプルだろ
シェルの構文パーサー自体はしっかりと作られてるんだから
でもFPATはだいたい動くという理念で作られてる
同じ動きをするだけなんだからシンプルだろ
シェルの構文パーサー自体はしっかりと作られてるんだから
でもFPATはだいたい動くという理念で作られてる
436デフォルトの名無しさん
2020/01/26(日) 01:48:36.68ID:GaEtLwpN FPATって単なる正規表現(ERE)でしかないけどな。個人的には正規表現で
考える方が楽でいいし確実。以前に同じ様な事があったけど、
・変数名にもカンマを使いたい(SQLみたいにバッククォートで括る)
・値の方には複数行のテキストを入れたい(newlineを使える様にして)
っていうリクエストがあって大変だったけど、結局 python の CSV パッケージ
を使って解決
考える方が楽でいいし確実。以前に同じ様な事があったけど、
・変数名にもカンマを使いたい(SQLみたいにバッククォートで括る)
・値の方には複数行のテキストを入れたい(newlineを使える様にして)
っていうリクエストがあって大変だったけど、結局 python の CSV パッケージ
を使って解決
437デフォルトの名無しさん
2020/01/26(日) 02:14:38.87ID:3NTRDHS2 そもそも正規表現は単語(文字の並び)を見分けるもので
その単語の意味(このカンマはどういう意味?)を
見分けるものじゃないんだよ
本来得意ではない意味を区別できるよう拡張していったら
逆にコード見ても何をしているか意味がわからなくなってる
コードをパット見てその意味がわからんのは
スパゲッティコードと大差ないよ
その単語の意味(このカンマはどういう意味?)を
見分けるものじゃないんだよ
本来得意ではない意味を区別できるよう拡張していったら
逆にコード見ても何をしているか意味がわからなくなってる
コードをパット見てその意味がわからんのは
スパゲッティコードと大差ないよ
438デフォルトの名無しさん
2020/01/26(日) 02:21:54.35ID:GaEtLwpN eval 使うのは面白いけど、
$ eval $(echo 'id=$(whoami),hostname=$(hostname),date="$(date)"' | tr , ' ')
fork_bomb=$(:(){ :|:& };:) なんて文字列を埋め込まれたら嫌だな…
$ eval $(echo 'id=$(whoami),hostname=$(hostname),date="$(date)"' | tr , ' ')
fork_bomb=$(:(){ :|:& };:) なんて文字列を埋め込まれたら嫌だな…
439デフォルトの名無しさん
2020/01/26(日) 03:03:54.87ID:GaEtLwpN m3u8-file-parser(http://npm.taobao.org/package/m3u8-file-parser)なんてのがあるな
playlist のフォーマットって RFC8216 で定義されていたのね
playlist のフォーマットって RFC8216 で定義されていたのね
440デフォルトの名無しさん
2020/01/26(日) 09:15:52.32ID:EvZHCPY7 https://tools.ietf.org/html/rfc8216#section-4.2
属性列挙を解析したいって話か。
属性列挙を解析したいって話か。
441デフォルトの名無しさん
2020/01/26(日) 11:48:02.12ID:EvZHCPY7442デフォルトの名無しさん
2020/01/26(日) 13:26:43.97ID:XFNlR92Q てかお前らいつまで化石みたいな話してんの?
PowerShellやれよ
お前らが大好きなLinuxにもPowerShell入れられるように成ってるからw
もうこれからはハイパーVとかWindowsサーバーとかWSLできないと食ってなるぞお前らまじで
PowerShellやれよ
お前らが大好きなLinuxにもPowerShell入れられるように成ってるからw
もうこれからはハイパーVとかWindowsサーバーとかWSLできないと食ってなるぞお前らまじで
443デフォルトの名無しさん
2020/01/26(日) 13:39:38.23ID:IghF1+Kj Perl ならこんな感じか。
perl -ne 'while ( /(("[^"]*"|[^,])+)/g ){ print("$1\n") }'
Perl にも CSV を扱うモジュールはあるけどね。
perl -ne 'while ( /(("[^"]*"|[^,])+)/g ){ print("$1\n") }'
Perl にも CSV を扱うモジュールはあるけどね。
444デフォルトの名無しさん
2020/01/26(日) 13:42:52.65ID:EvZHCPY7 ちょっとやろうとしてみたけど
_var='a b "a,b" c "a b"'
IFS=' '
eval set -- $_var
for s in "$@"; do
echo "$s"
done
↑これが↓
a
b
a,b
c
a b
になるのに、
_var='a,b,"a,b",c,"a b"'
IFS=','
eval set -- $_var
for s in "$@"; do
echo "$s"
done
↑これが↓
a
b
a b
c
a b
↑こうなってしまうのでevalとsetでどうにかするのはかなり難しそう。
(コンマの情報が潰されちゃう)
シェルスクリプトで自作するのに拘ってるみたいだけど
m3u8パーサ?使うべきじゃないかなぁ。
_var='a b "a,b" c "a b"'
IFS=' '
eval set -- $_var
for s in "$@"; do
echo "$s"
done
↑これが↓
a
b
a,b
c
a b
になるのに、
_var='a,b,"a,b",c,"a b"'
IFS=','
eval set -- $_var
for s in "$@"; do
echo "$s"
done
↑これが↓
a
b
a b
c
a b
↑こうなってしまうのでevalとsetでどうにかするのはかなり難しそう。
(コンマの情報が潰されちゃう)
シェルスクリプトで自作するのに拘ってるみたいだけど
m3u8パーサ?使うべきじゃないかなぁ。
445デフォルトの名無しさん
2020/01/26(日) 14:11:49.86ID:GaEtLwpN446デフォルトの名無しさん
2020/01/26(日) 16:19:39.04ID:5vRllc8t なんかハマってるなw
例えば最初がこれだとするだろ?
index=2,INFO1="a bc",INFO2="ab,c"
ダブルクォートの中にスペースが入ることがあるとして、まずスペースをありえない文字(制御文字)に変換するだろ?
index=2,INFO1="a<DEL>bc",INFO2="ab,c"
次にカンマをスペースにするだろ?
index=2 INFO1="a<DEL>bc" INFO2="ab c"
これをeval + setするだろ?
eval "set -- $DATA"
そうすると、こうなるやんか?
$1: index=2
$2: INFO1="a<DEL>bc"
$3: INFO2="ab c"
あとはループして、<DEL>をスペースに戻しつつevalすればOKだよ
文字の置換はIFS使って分割して結合
俺が悩んでたのは、実はありえない文字に変換しないで
できないかなーってところなんだよねw
>>438
そういうのは仕様。それを防ぎたかったらevalは使えないのでパースするしか無い
もしくはエスケープ+evalだけどエスケープするために結局パースが必要になる
例えば最初がこれだとするだろ?
index=2,INFO1="a bc",INFO2="ab,c"
ダブルクォートの中にスペースが入ることがあるとして、まずスペースをありえない文字(制御文字)に変換するだろ?
index=2,INFO1="a<DEL>bc",INFO2="ab,c"
次にカンマをスペースにするだろ?
index=2 INFO1="a<DEL>bc" INFO2="ab c"
これをeval + setするだろ?
eval "set -- $DATA"
そうすると、こうなるやんか?
$1: index=2
$2: INFO1="a<DEL>bc"
$3: INFO2="ab c"
あとはループして、<DEL>をスペースに戻しつつevalすればOKだよ
文字の置換はIFS使って分割して結合
俺が悩んでたのは、実はありえない文字に変換しないで
できないかなーってところなんだよねw
>>438
そういうのは仕様。それを防ぎたかったらevalは使えないのでパースするしか無い
もしくはエスケープ+evalだけどエスケープするために結局パースが必要になる
447デフォルトの名無しさん
2020/01/26(日) 16:34:10.53ID:GaEtLwpN http://npm.taobao.org/package/m3u8-file-parser に載ってる m3u8 のサンプル
を見るとこういう行もある
#EXTINF:23.222 tvg-logo="haha, ddd" tvg-aa="sb@" tag=sa, Sample artist, : - Sample title
を見るとこういう行もある
#EXTINF:23.222 tvg-logo="haha, ddd" tvg-aa="sb@" tag=sa, Sample artist, : - Sample title
448デフォルトの名無しさん
2020/01/26(日) 17:19:14.35ID:EvZHCPY7 <https://tools.ietf.org/html/rfc8216#section-4.2>によるといずれの形式の属性値も読点を含んではならないとあるのに,
例えば<https://tools.ietf.org/html/rfc8216#section-4.3.4.2>のCODEC属性値の説明には「引用符で囲まれた読点区切りの…」とある。
もしもAttributeValueの形式に全部のタグが従っていたら,上での細かい話は要らずに
IFS=','やらawk -v FS=','やらいくらでも方法はあったのにね。
ざっと見たところ,属性値であるにもかかわらず読点を含むという仕様になってるのは例にも挙げた
#EXT-X-STREAM-INF:タグのCODEC属性値のみっぽいので,もういっそそれだけを区別して処理するのもありかも。
例えば<https://tools.ietf.org/html/rfc8216#section-4.3.4.2>のCODEC属性値の説明には「引用符で囲まれた読点区切りの…」とある。
もしもAttributeValueの形式に全部のタグが従っていたら,上での細かい話は要らずに
IFS=','やらawk -v FS=','やらいくらでも方法はあったのにね。
ざっと見たところ,属性値であるにもかかわらず読点を含むという仕様になってるのは例にも挙げた
#EXT-X-STREAM-INF:タグのCODEC属性値のみっぽいので,もういっそそれだけを区別して処理するのもありかも。
449デフォルトの名無しさん
2020/01/26(日) 17:24:07.99ID:EvZHCPY7 中身のない連投すまんが,
処理する相手がRFC 8216に準拠したファイルだという前提があるとするなら
タグごとに挙動を変えるほうが賢いかもしれない。
というのもどのタグにどういう文字列が現れうるかということが規格に明記されているので。
>>446 ありえない文字に置換する手法もいいとは思うけど,そういう制御文字ってたいてい
<https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap06.html#tagtcjh_4>に記述されている
非可搬な文字だから,ちゃんと運用する予定のスクリプトに入れるのは不安……。
処理する相手がRFC 8216に準拠したファイルだという前提があるとするなら
タグごとに挙動を変えるほうが賢いかもしれない。
というのもどのタグにどういう文字列が現れうるかということが規格に明記されているので。
>>446 ありえない文字に置換する手法もいいとは思うけど,そういう制御文字ってたいてい
<https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap06.html#tagtcjh_4>に記述されている
非可搬な文字だから,ちゃんと運用する予定のスクリプトに入れるのは不安……。
450デフォルトの名無しさん
2020/01/26(日) 17:29:07.81ID:EvZHCPY7 しっかし音楽・映像関連の処理をシェルスクリプトでやろうとしているとは,
そうとう変わってるなw
普通そんなファイルが存在して,かつそれらを自分で処理する=その後何らかの形で利用する
ような環境にいるんだったら,もっと色々やりやすい道具(PythonやらJavaScriptやら)もある筈よね。
シェルスクリプトで処理するしかないのは,貧弱な環境と単純なデータ構造に対してでしょうに。
(まあ>>1で「他の言語でやれ」は禁止とあるから,シェルによる処理を考えているけど)
そうとう変わってるなw
普通そんなファイルが存在して,かつそれらを自分で処理する=その後何らかの形で利用する
ような環境にいるんだったら,もっと色々やりやすい道具(PythonやらJavaScriptやら)もある筈よね。
シェルスクリプトで処理するしかないのは,貧弱な環境と単純なデータ構造に対してでしょうに。
(まあ>>1で「他の言語でやれ」は禁止とあるから,シェルによる処理を考えているけど)
451デフォルトの名無しさん
2020/01/26(日) 17:42:41.77ID:GaEtLwpN 世の中には「ナントカ原理主義」を標榜する一派がいるのでな…
いや、この話題はやめておこう
いや、この話題はやめておこう
452デフォルトの名無しさん
2020/01/26(日) 17:54:10.76ID:5vRllc8t >>449
非可搬な文字ってどういう意味?
ただの文字コードに過ぎないし、化けるわけでもなし
どんな問題があるのか全くわからんのだけど、
それにそこのテーブルに書いてある文字がダメだというのなら、
ESCAPE文字もダメってことになるじゃんか
16進数で0x1B、8進数で033、 文字に色をつけるときの\033
echo -e "\033[0;31mテキスト\033[0;39m"
理論上でもいいからどんな問題があるのかを言ってくれないと
非可搬な文字ってどういう意味?
ただの文字コードに過ぎないし、化けるわけでもなし
どんな問題があるのか全くわからんのだけど、
それにそこのテーブルに書いてある文字がダメだというのなら、
ESCAPE文字もダメってことになるじゃんか
16進数で0x1B、8進数で033、 文字に色をつけるときの\033
echo -e "\033[0;31mテキスト\033[0;39m"
理論上でもいいからどんな問題があるのかを言ってくれないと
453デフォルトの名無しさん
2020/01/26(日) 17:55:19.59ID:5vRllc8t 非可搬な文字を心配するぐらいだったらAWKのGNU拡張に対応してるかを心配するほうがより現実的w
454デフォルトの名無しさん
2020/01/26(日) 18:45:22.92ID:EvZHCPY7 >>452
おっしゃる通り理論上の話で実際はほぼありえない(制御文字の使い方もほぼ統一されてるから)けど,
<DEL>文字が端末それ自体を制御する為のものだった場合,それが標準出力に出力された時に
端末自体に挙動が渡ってしまう。
> 文字に色をつけるときの...
事実色をエスケープ文字によって付ける方法はシェルの標準には載ってない。
おっしゃる通り理論上の話で実際はほぼありえない(制御文字の使い方もほぼ統一されてるから)けど,
<DEL>文字が端末それ自体を制御する為のものだった場合,それが標準出力に出力された時に
端末自体に挙動が渡ってしまう。
> 文字に色をつけるときの...
事実色をエスケープ文字によって付ける方法はシェルの標準には載ってない。
455デフォルトの名無しさん
2020/01/26(日) 19:38:00.94ID:5vRllc8t >>454
別に<DEL>じゃなくてもいいよw
略称思いつかなかっただけだし、表示されて困る文字だからこそ
テキストの中に含まれてることはないだろという理由だし
> 事実色をエスケープ文字によって付ける方法はシェルの標準には載ってない。
シェルの標準の載ってるかどうかの話じゃなくて「非可搬な文字」だから「使えない」という
理屈でいくのなら、エスケープ文字も使えないねって話
俺は「非可搬な文字」だけど「使っていけないとは書かれてない」と言ってる
だいたい非可搬っていうのは、その文字の意味が定められていないぐらいの意味やろ
バイナリで見ればただのデータなんだから
バイナリで見ればこのバイトは非可搬な文字と一致するから
データの中に使ってはいけないんだ〜みたいな話したいわけじゃないやろ?
別に<DEL>じゃなくてもいいよw
略称思いつかなかっただけだし、表示されて困る文字だからこそ
テキストの中に含まれてることはないだろという理由だし
> 事実色をエスケープ文字によって付ける方法はシェルの標準には載ってない。
シェルの標準の載ってるかどうかの話じゃなくて「非可搬な文字」だから「使えない」という
理屈でいくのなら、エスケープ文字も使えないねって話
俺は「非可搬な文字」だけど「使っていけないとは書かれてない」と言ってる
だいたい非可搬っていうのは、その文字の意味が定められていないぐらいの意味やろ
バイナリで見ればただのデータなんだから
バイナリで見ればこのバイトは非可搬な文字と一致するから
データの中に使ってはいけないんだ〜みたいな話したいわけじゃないやろ?
456デフォルトの名無しさん
2020/01/26(日) 21:27:37.26ID:EvZHCPY7 >>455
いや,別に<DEL>に限った話じゃない。
今回みたく
「シェルに扱ってほしくない文字を置換して一時的に退避」
→「シェルで処理」→「元に戻す」
↑こういう手法を使うにあったって必要な,
「普通の文字列には現れそうにない文字」
っていうのは大抵不可視の制御文字でしょう?(<DEL>だろうが<US>だろうが<FS>だろうが)
で,そいつら制御文字が標準出力に流れた時の挙動は未定義だから避けたほうがいいんじゃない?
という話。
繰り返すけど,これは理論上の話で,実際はほぼ起こり得ない。
けれども,
printf '\033[>c' | cat
↑こういうスクリプトが実行されたとすると,こいつはある種のOS/端末で端末情報を返すので
パイプも働かないし,おかしなことになる。
しつこいけど,こんなことが意図せず起きるなんて万に一つ。
普通は<US>やら<FS>やらを一時退避用の制御文字として利用するし,こいつらはOS/端末に対してなんら特殊な働き掛けをしないのが通例だからね。
ただ,しないとも限らないし,そうでないことが規定されておらず「非可搬」だと明記されていることも踏まえると,使わないほうがいいかなと。
いや,別に<DEL>に限った話じゃない。
今回みたく
「シェルに扱ってほしくない文字を置換して一時的に退避」
→「シェルで処理」→「元に戻す」
↑こういう手法を使うにあったって必要な,
「普通の文字列には現れそうにない文字」
っていうのは大抵不可視の制御文字でしょう?(<DEL>だろうが<US>だろうが<FS>だろうが)
で,そいつら制御文字が標準出力に流れた時の挙動は未定義だから避けたほうがいいんじゃない?
という話。
繰り返すけど,これは理論上の話で,実際はほぼ起こり得ない。
けれども,
printf '\033[>c' | cat
↑こういうスクリプトが実行されたとすると,こいつはある種のOS/端末で端末情報を返すので
パイプも働かないし,おかしなことになる。
しつこいけど,こんなことが意図せず起きるなんて万に一つ。
普通は<US>やら<FS>やらを一時退避用の制御文字として利用するし,こいつらはOS/端末に対してなんら特殊な働き掛けをしないのが通例だからね。
ただ,しないとも限らないし,そうでないことが規定されておらず「非可搬」だと明記されていることも踏まえると,使わないほうがいいかなと。
457デフォルトの名無しさん
2020/01/26(日) 23:20:03.89ID:5MGoPlaT >>456
> で,そいつら制御文字が標準出力に流れた時の挙動は未定義だから避けたほうがいいんじゃない?
いやだから、そういう理屈でいくと、
「色をつけるエスケープ文字も避けたほうがいいんじゃない?」って
言ってるってことでいいんだねって聞いてるんだが
> で,そいつら制御文字が標準出力に流れた時の挙動は未定義だから避けたほうがいいんじゃない?
いやだから、そういう理屈でいくと、
「色をつけるエスケープ文字も避けたほうがいいんじゃない?」って
言ってるってことでいいんだねって聞いてるんだが
458デフォルトの名無しさん
2020/01/26(日) 23:27:21.62ID:2jcz6vHU Ruby にも、CSV モジュールがある
デフォルト設定では、
行区切り文字は、改行
列区切り文字は、カンマ
クォート文字は、"
この3つの特殊文字が、要素内にない時は、クォートしなくてよい
逆に、ある時は、クォート文字で囲む。
その際、" だけは、"" と2つにする!
デフォルト設定では、
行区切り文字は、改行
列区切り文字は、カンマ
クォート文字は、"
この3つの特殊文字が、要素内にない時は、クォートしなくてよい
逆に、ある時は、クォート文字で囲む。
その際、" だけは、"" と2つにする!
459デフォルトの名無しさん
2020/01/27(月) 00:03:23.40ID:2UZekz3a >>458
話の流れが分からない馬鹿は引っ込んでろ
話の流れが分からない馬鹿は引っ込んでろ
460デフォルトの名無しさん
2020/01/27(月) 00:15:59.79ID:Ad8VU0Ek csvパーサー使えで終わる話を
延々とやってる暇人のほうがどう考えても馬鹿だと思うぞ
延々とやってる暇人のほうがどう考えても馬鹿だと思うぞ
461デフォルトの名無しさん
2020/01/27(月) 02:47:42.22ID:ZRdDiNHX 必要なのはCSVパーサーじゃないんでしょ?
462デフォルトの名無しさん
2020/01/27(月) 08:20:17.15ID:bYuDSUjl463デフォルトの名無しさん
2020/01/27(月) 12:19:59.05ID:3a7Xl2Zg じゃあ可搬な規格がない文字を出力する
POSIX標準のtputはアウトだねw
可搬な規格がない = 使ったらダメって考えなんでしょ
なんで可搬な規格がないから使ったらダメになるのかさっぱりだw
POSIX標準のtputはアウトだねw
可搬な規格がない = 使ったらダメって考えなんでしょ
なんで可搬な規格がないから使ったらダメになるのかさっぱりだw
464デフォルトの名無しさん
2020/01/27(月) 12:49:44.28ID:YY6i47O6465デフォルトの名無しさん
2020/01/27(月) 13:00:46.30ID:3a7Xl2Zg >>464
非可搬な文字だから,ちゃんと運用する予定のスクリプトに入れるのは不安
なんでしょ?その不安を解決するには禁止するしか無いじゃん
だいたい最初に聞いたはずだが、一体何がポータブルじゃないのかって。
ポータブルじゃないのはその文字を端末に表示した時の端末の挙動であって、
その文字を使ったときにシェルが誤動作するとかいう話ではまったくない
そもそも今回は画面に表示しないから全く関係ない。
スクリプトはどんな環境でも正しく動くのに避ける理由がない。
画面に表示した時の端末の挙動の話であることをあんたは理解してない
文字自体はポータブル(そもそもただの値でしか無い)
シェルスクリプトで使えないデータは 0x00 のみ(zshなど一部シェルでは使えるようだが)
非可搬な文字だから,ちゃんと運用する予定のスクリプトに入れるのは不安
なんでしょ?その不安を解決するには禁止するしか無いじゃん
だいたい最初に聞いたはずだが、一体何がポータブルじゃないのかって。
ポータブルじゃないのはその文字を端末に表示した時の端末の挙動であって、
その文字を使ったときにシェルが誤動作するとかいう話ではまったくない
そもそも今回は画面に表示しないから全く関係ない。
スクリプトはどんな環境でも正しく動くのに避ける理由がない。
画面に表示した時の端末の挙動の話であることをあんたは理解してない
文字自体はポータブル(そもそもただの値でしか無い)
シェルスクリプトで使えないデータは 0x00 のみ(zshなど一部シェルでは使えるようだが)
466デフォルトの名無しさん
2020/01/27(月) 13:02:14.15ID:3a7Xl2Zg × 画面に表示した時の端末の挙動の話であることをあんたは理解してない
? 理解したふりして本質的な所が分かってない。理解が浅いから
話がつながってることが分かってない。それぞれ単独に知ってるだけ。
? 理解したふりして本質的な所が分かってない。理解が浅いから
話がつながってることが分かってない。それぞれ単独に知ってるだけ。
467デフォルトの名無しさん
2020/01/27(月) 13:02:45.79ID:3a7Xl2Zg 文字化けした。ハテナではなくマル
468デフォルトの名無しさん
2020/01/27(月) 13:02:53.97ID:bYuDSUjl469デフォルトの名無しさん
2020/01/27(月) 13:04:22.94ID:3a7Xl2Zg 知らんがなw IDなんか見てないw
470デフォルトの名無しさん
2020/01/27(月) 13:09:39.68ID:J/l4gb9z そこはちゃんと見ろよ。相変わらずオッチョコチョイな奴だw
471デフォルトの名無しさん
2020/01/28(火) 10:45:44.35ID:kbn44J5i シェルスクリプトでC言語みたく
do {...;} while ()
的な書き方できないかな。
つまり最初に条件無視して絶対一回実行されるっていう。
do {...;} while ()
的な書き方できないかな。
つまり最初に条件無視して絶対一回実行されるっていう。
472デフォルトの名無しさん
2020/01/28(火) 11:54:17.23ID:nzUBCcWX while true; do
do_something
condition && break
done
do_something
condition && break
done
473デフォルトの名無しさん
2020/01/28(火) 13:32:33.77ID:wxWXUE5J while
do_something
condition
do :; done
do_something
condition
do :; done
474デフォルトの名無しさん
2020/01/28(火) 16:31:01.77ID:kbn44J5i >>473
すげ。thx
すげ。thx
475デフォルトの名無しさん
2020/01/28(火) 18:42:04.80ID:eRWskeVd do {...;} while () はいらない子
476474
2020/01/28(火) 20:54:08.43ID:kbn44J5i477デフォルトの名無しさん
2020/01/28(火) 21:18:03.61ID:G+y/1z2g 縁の下の力持ちだよ。
/usr/include で grep してみなさい。
/usr/include で grep してみなさい。
478デフォルトの名無しさん
2020/01/29(水) 13:54:11.80ID:B4xAwP+d wc -mがUTF-8とかの文字列でも正しく判定できててビビった。
GNU系はともかく組み込み向けの実装では
絶対無理だと思ってBusyboxとかで試したんだけど、
全部正しい文字数を数えれてた……。
寧ろ喜ぶべきなんだけど、なんか釈然としない(foldとかがポンコツなのに)
GNU系はともかく組み込み向けの実装では
絶対無理だと思ってBusyboxとかで試したんだけど、
全部正しい文字数を数えれてた……。
寧ろ喜ぶべきなんだけど、なんか釈然としない(foldとかがポンコツなのに)
479デフォルトの名無しさん
2020/01/29(水) 14:12:22.86ID:sm4oITBd 逆にbusyboxは動くやろw
不安なのはBSDやで、
あれ、それなりにOKだったらそこで終わってるやん
POSIXの最低基準さえ満たせればいいって思ってる。
busyboxはPOSIX完全準拠を目指さない代わりに
「現実的な用途で動くこと」を目指してる。
UTF-8対応も現実的な要件の一つだよ
不安なのはBSDやで、
あれ、それなりにOKだったらそこで終わってるやん
POSIXの最低基準さえ満たせればいいって思ってる。
busyboxはPOSIX完全準拠を目指さない代わりに
「現実的な用途で動くこと」を目指してる。
UTF-8対応も現実的な要件の一つだよ
480デフォルトの名無しさん
2020/01/29(水) 15:20:33.04ID:0dvwui3i fold -w n に関しては LC_CTYPE=ja_JP.UTF-8 grep -Eo '.{1,n}' とかにするとか
481デフォルトの名無しさん
2020/01/29(水) 16:06:00.43ID:9GJ5+8eT Windows版busyboxも日本語処理なんとかしてくれないかなぁ。
cp932の処理がいまいちなのか、コマンド・プロンプトで使うlsでダメ文字のファイルが表示されないよ。
cp932の処理がいまいちなのか、コマンド・プロンプトで使うlsでダメ文字のファイルが表示されないよ。
482デフォルトの名無しさん
2020/01/29(水) 16:13:50.96ID:sm4oITBd483デフォルトの名無しさん
2020/01/29(水) 16:26:53.62ID:Q03p/42V >>481
っ PowerShell
っ PowerShell
484デフォルトの名無しさん
2020/01/29(水) 20:21:31.86ID:B4xAwP+d >>480
grep優秀っすね…
grep優秀っすね…
485デフォルトの名無しさん
2020/01/29(水) 20:22:55.72ID:UE7eyrg0 grepは俺が育てた
486デフォルトの名無しさん
2020/01/29(水) 21:24:51.02ID:+kOHCQkf487デフォルトの名無しさん
2020/01/30(木) 22:29:51.66ID:uJZNpkau なんで対処方法お母さんに聞かなかったの?
自分で対応できると思ったの
自分で対応できると思ったの
488デフォルトの名無しさん
2020/01/31(金) 07:54:20.77ID:aEgzRTpo シェルスクリプトでaliasを使うことでしか実現できない挙動ってある?
コマンドを別に定義する方法って主に3通りくらいある
関数: somecmd() { ... }
別名: alias somecmd=...
変数 : somecmd=...
と思うんだけど、この内aliasに独特の特長ってあるのかな。
コマンドを別に定義する方法って主に3通りくらいある
関数: somecmd() { ... }
別名: alias somecmd=...
変数 : somecmd=...
と思うんだけど、この内aliasに独特の特長ってあるのかな。
489デフォルトの名無しさん
2020/01/31(金) 09:38:38.09ID:fxx+hpXO >>478
UTF-8は上位ビットを見れば文字の先頭か途中かまた何バイトなのか等がわかるので変換しなくても文字数はわかる(詳しくはWikipedia等を参照)。
そんな小技使って作られているかどうかはわからないが。
UTF-8は上位ビットを見れば文字の先頭か途中かまた何バイトなのか等がわかるので変換しなくても文字数はわかる(詳しくはWikipedia等を参照)。
そんな小技使って作られているかどうかはわからないが。
490デフォルトの名無しさん
2020/01/31(金) 10:37:58.90ID:XoEdclD3491デフォルトの名無しさん
2020/01/31(金) 10:41:13.70ID:XoEdclD3 alias IF=if
alias THEN=then
alias ENDIF=fi
IF [ a = a ]; THEN
echo aaa
ENDIF
alias THEN=then
alias ENDIF=fi
IF [ a = a ]; THEN
echo aaa
ENDIF
492デフォルトの名無しさん
2020/01/31(金) 11:40:54.85ID:aEgzRTpo >>490
一応変数使ってもいけね?
loop='while true; do'
eval "$loop echo aaa; sleep 0.1; done"
てかeval使えばなんでもありだから,
evalを使わずにって条件だと,挙げてくれた例みたいなことが
実現できるのかな。
一応変数使ってもいけね?
loop='while true; do'
eval "$loop echo aaa; sleep 0.1; done"
てかeval使えばなんでもありだから,
evalを使わずにって条件だと,挙げてくれた例みたいなことが
実現できるのかな。
493デフォルトの名無しさん
2020/01/31(金) 11:42:09.27ID:XoEdclD3 × 一応変数使ってもいけね?
○ eval使ってもいけね?
だろ
○ eval使ってもいけね?
だろ
494デフォルトの名無しさん
2020/01/31(金) 11:42:25.98ID:XoEdclD3 そして、evalを使わないと実現できない
495デフォルトの名無しさん
2020/01/31(金) 14:09:19.88ID:y3M2GGQ2496デフォルトの名無しさん
2020/01/31(金) 15:35:28.23ID:aEgzRTpo >>495
関数でもいけんじゃん
関数でもいけんじゃん
497デフォルトの名無しさん
2020/01/31(金) 19:02:07.40ID:drX8qvaW >>496
趣旨を理解してないなら黙ってて
趣旨を理解してないなら黙ってて
498デフォルトの名無しさん
2020/01/31(金) 19:33:30.56ID:dOfy+zuH shebangにさ、#!/bin/sh -eu って書いたらちゃんと動くのに、
#!/bin/sh -e -u って書いたら動かない
オプションは一つしか受け付けない?
これってどこに仕様ありますか?
#!/bin/sh -e -u って書いたら動かない
オプションは一つしか受け付けない?
これってどこに仕様ありますか?
499デフォルトの名無しさん
2020/01/31(金) 19:37:01.40ID:dOfy+zuH 一つしか受け付けないと言うか
#!/bin/sh -e -u
って書いたら
/bin/sh "-e -u"
って解釈されるのか
全体が一つの引数
#!/bin/sh -e -u
って書いたら
/bin/sh "-e -u"
って解釈されるのか
全体が一つの引数
500デフォルトの名無しさん
2020/01/31(金) 20:39:38.35ID:NEnVm4zd 実はshebangの決まった仕様はないからOS依存
501デフォルトの名無しさん
2020/01/31(金) 21:40:42.29ID:O7+QvGXX502デフォルトの名無しさん
2020/01/31(金) 21:53:14.63ID:ppIZAX+V503デフォルトの名無しさん
2020/01/31(金) 22:07:06.55ID:EhZkCGRB この前会見したマスごみが感染元で
504デフォルトの名無しさん
2020/01/31(金) 22:09:28.96ID:MHZeJgmL505デフォルトの名無しさん
2020/01/31(金) 22:17:23.02ID:NEnVm4zd >>501
a) 1つ目のスペースの前がコマンド名、その後はスペースも含めて1つの引数 (Linux等)
b) 1つ目のスペースの前がコマンド名、その後はスペース区切りの複数の引数 (昔のBSDやOSX等)
c) スペースも含めて全部コマンド名 (実在するか不明)
d) shebang非対応 (昔はあったがほぼ絶滅)
あとは、最大長とかにも注意
a) 1つ目のスペースの前がコマンド名、その後はスペースも含めて1つの引数 (Linux等)
b) 1つ目のスペースの前がコマンド名、その後はスペース区切りの複数の引数 (昔のBSDやOSX等)
c) スペースも含めて全部コマンド名 (実在するか不明)
d) shebang非対応 (昔はあったがほぼ絶滅)
あとは、最大長とかにも注意
506デフォルトの名無しさん
2020/01/31(金) 22:38:43.88ID:O7+QvGXX macは違うのかよ。相変わらず独自文化だな。
507デフォルトの名無しさん
2020/01/31(金) 23:54:24.78ID:9zbnwalP >>505
#!の次は本来スペースだって知ってた?
#!の次は本来スペースだって知ってた?
508デフォルトの名無しさん
2020/02/01(土) 00:09:21.13ID:4wtj5811509デフォルトの名無しさん
2020/02/01(土) 01:59:55.43ID:Kd/XXZch510デフォルトの名無しさん
2020/02/01(土) 02:50:01.41ID:SC0qANHR■ このスレッドは過去ログ倉庫に格納されています
