シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
シェルスクリプト総合 その32
https://mevius.5ch.net/test/read.cgi/tech/1571929725/
探検
シェルスクリプト総合 その33
■ このスレッドは過去ログ倉庫に格納されています
2020/03/23(月) 01:12:30.31ID:TYte82vJ
600デフォルトの名無しさん
2020/07/19(日) 08:53:42.63ID:b8gde26L お前いつも壁と話してんな
601デフォルトの名無しさん
2020/07/19(日) 10:23:03.44ID:HNDAT4gV 壁だと思ってるのはお前だけで、実は人間なんだぜ(ホラー風)
602デフォルトの名無しさん
2020/07/19(日) 11:15:59.84ID:W3hSYpRn ぬりかべ「かべっ!?」
603デフォルトの名無しさん
2020/07/27(月) 19:01:06.79ID:prTniRCc manコマンドはPOSIXに取り入れられそうなのに
その表示に関わるroffコマンドは影も形もないって、
なんつーか意味あんのかそれって思う。
その表示に関わるroffコマンドは影も形もないって、
なんつーか意味あんのかそれって思う。
604デフォルトの名無しさん
2020/07/27(月) 20:34:03.79ID:Sw4i8xv6605デフォルトの名無しさん
2020/07/27(月) 20:48:14.37ID:9y96d1KX manをPOSIXに取り入れるぐらいなら
HTMLビューワーをPOSIXに取り入れたほうが良い
JavaScriptとCSSに対応させる必要はないからさ
HTMLビューワーをPOSIXに取り入れたほうが良い
JavaScriptとCSSに対応させる必要はないからさ
606デフォルトの名無しさん
2020/07/27(月) 20:50:03.70ID:9y96d1KX curlをPOSIXに入れればいいのに
フル機能じゃなくていいけどREST API叩けるぐらい
フル機能じゃなくていいけどREST API叩けるぐらい
607デフォルトの名無しさん
2020/07/27(月) 21:12:03.12ID:vTLRE8Va >>603
おお、するどい。
でもmanが入ってないというのはどう言う意味? POSIXとSUSの意味の違いにこだわる?
で実際manの記述を見ると文章の整形とかそれをどう作るとかは書いてないので、
そういうレベルのものは規定しないという態度なのかも。
あと事実上GNU roffが標準だと思うが、さすがにそれを規格には入れられないのかも。
かといって今更大昔のroffに制限するのもなあと。
しかし最近GNUで検索するとKingの方がヒットしやすくてうざいw
おお、するどい。
でもmanが入ってないというのはどう言う意味? POSIXとSUSの意味の違いにこだわる?
で実際manの記述を見ると文章の整形とかそれをどう作るとかは書いてないので、
そういうレベルのものは規定しないという態度なのかも。
あと事実上GNU roffが標準だと思うが、さすがにそれを規格には入れられないのかも。
かといって今更大昔のroffに制限するのもなあと。
しかし最近GNUで検索するとKingの方がヒットしやすくてうざいw
608デフォルトの名無しさん
2020/07/27(月) 21:16:04.45ID:vTLRE8Va というか、King Gnuと言ったらRMSしかありえないだろw
609デフォルトの名無しさん
2020/07/28(火) 08:42:48.22ID:UlETHBDV こんなのか?
https://www.e-hon.ne.jp/bec/SA/Detail?refShinCode=0100000000000030681001&Action_id=121&Sza_id=F3
まだ役に立ってるよ。俺が持ってるのは 20.3 だけど。
https://www.e-hon.ne.jp/bec/SA/Detail?refShinCode=0100000000000030681001&Action_id=121&Sza_id=F3
まだ役に立ってるよ。俺が持ってるのは 20.3 だけど。
610デフォルトの名無しさん
2020/07/28(火) 13:13:59.11ID:R16GmJU5 質問。
次のような行からいずれかのvalueをきれいに削除するにはどうすれば?
name=value0,value1,value2,value3
たとえば次のコマンドだと、value1を削除できるものの、先頭か末尾か連続かのカンマが残ってしまう。。。
sed 's/^(name=.*)value1(.*)$/¥1¥2/'
残ったカンマを後で処理したらいいんだけど、そもそも一発でうまくやることができるんでは?という気がどうしても。
次のような行からいずれかのvalueをきれいに削除するにはどうすれば?
name=value0,value1,value2,value3
たとえば次のコマンドだと、value1を削除できるものの、先頭か末尾か連続かのカンマが残ってしまう。。。
sed 's/^(name=.*)value1(.*)$/¥1¥2/'
残ったカンマを後で処理したらいいんだけど、そもそも一発でうまくやることができるんでは?という気がどうしても。
611デフォルトの名無しさん
2020/07/28(火) 13:23:54.46ID:Mb4DOiRz ^(name=.*)bvalue1,?(.*)$
こうかな
こうかな
612デフォルトの名無しさん
2020/07/28(火) 13:24:17.04ID:Mb4DOiRz 文字化けてるとこは円記号な
613デフォルトの名無しさん
2020/07/28(火) 13:53:56.25ID:DVrEteyf King Gnu?
どっかで聞いたことあるようなないような▪▪▪
どっかで聞いたことあるようなないような▪▪▪
614デフォルトの名無しさん
2020/07/28(火) 14:07:36.32ID:R16GmJU5615デフォルトの名無しさん
2020/07/28(火) 14:08:46.03ID:3p32kQjL 残らないが?
616デフォルトの名無しさん
2020/07/28(火) 14:25:35.27ID:R16GmJU5 残るが。
value3直前のカンマが¥1に含まれるので。
value3直前のカンマが¥1に含まれるので。
617デフォルトの名無しさん
2020/07/28(火) 23:58:59.24ID:2KWkEgO3 >>610
>name=value0,value1,value2,value3
頭を柔らかくして、
最初に、この末尾に、カンマを追加すれば、処理しやすい形式になる
name=value0,value1,value2,value3,
>name=value0,value1,value2,value3
頭を柔らかくして、
最初に、この末尾に、カンマを追加すれば、処理しやすい形式になる
name=value0,value1,value2,value3,
618デフォルトの名無しさん
2020/07/29(水) 00:10:05.86ID:bLm2KFbe sed縛りなの?
後方参照する必要ないんじゃない?
value[0-2] については冗長だけど、以下の形式なら全部同じようにできるかと。
'?'の正規表現って、sedだとGNU sed とかだとつかえるのかな?
'?'はウチでは使えない。
echo 'name=value0,value1,value2,value3' | sed -e 's/value0,*//' -e 's/,$//'
echo 'name=value0,value1,value2,value3' | sed -e 's/value1,*//' -e 's/,$//'
echo 'name=value0,value1,value2,value3' | sed -e 's/value2,*//' -e 's/,$//'
echo 'name=value0,value1,value2,value3' | sed -e 's/value3,*//' -e 's/,$//'
後方参照する必要ないんじゃない?
value[0-2] については冗長だけど、以下の形式なら全部同じようにできるかと。
'?'の正規表現って、sedだとGNU sed とかだとつかえるのかな?
'?'はウチでは使えない。
echo 'name=value0,value1,value2,value3' | sed -e 's/value0,*//' -e 's/,$//'
echo 'name=value0,value1,value2,value3' | sed -e 's/value1,*//' -e 's/,$//'
echo 'name=value0,value1,value2,value3' | sed -e 's/value2,*//' -e 's/,$//'
echo 'name=value0,value1,value2,value3' | sed -e 's/value3,*//' -e 's/,$//'
619デフォルトの名無しさん
2020/07/29(水) 03:25:12.86ID:ZD2Ud5DP >>617
Perlとかならそうするが、sedだとなかなか?
sedはあんまり使わないので、そうしたくてもよくわからない。。。
>>618
sed縛りではないけど、Linux最小インストールでも対応したいので、sedくらいしか?
ほかに使えるならそれも可。
後方参照してるのは、「name=」で始まる行だけに限定したいから。
それ以外の行はそのままで。
「?」が使えない正規表現があるの?
POSIXに含まれてなかったっけ?
ちなみに現在はこうしてたっけかな?
細かいところはちょっと違うかも。
sed -r 's/^(name=.*)value1,?(.*)$/¥1¥2/;s/^(name=.*),+$/¥1/' -i file.txt
なんかくどくて、もっとさっぱり書けるやろと。。。
Perlとかならそうするが、sedだとなかなか?
sedはあんまり使わないので、そうしたくてもよくわからない。。。
>>618
sed縛りではないけど、Linux最小インストールでも対応したいので、sedくらいしか?
ほかに使えるならそれも可。
後方参照してるのは、「name=」で始まる行だけに限定したいから。
それ以外の行はそのままで。
「?」が使えない正規表現があるの?
POSIXに含まれてなかったっけ?
ちなみに現在はこうしてたっけかな?
細かいところはちょっと違うかも。
sed -r 's/^(name=.*)value1,?(.*)$/¥1¥2/;s/^(name=.*),+$/¥1/' -i file.txt
なんかくどくて、もっとさっぱり書けるやろと。。。
620デフォルトの名無しさん
2020/07/29(水) 05:18:27.85ID:W2ZwK0DF Ruby で作った
text = <<"EOT"
a
name=value0,value1,value2,value3
x
EOT
word = "value2,"
text.each_line do | line | # 1行ずつ処理する
# 先頭が、name= 以外は処理しない
next unless line.start_with? "name="
line.chomp! # 末尾の改行を削除する
line += "," # 処理しやすいように一旦、末尾にカンマを付ける
line.slice! word # 取り除く
line.slice! -1 # 末尾のカンマを取り除く
puts line #=> name=value0,value1,value3
end
text = <<"EOT"
a
name=value0,value1,value2,value3
x
EOT
word = "value2,"
text.each_line do | line | # 1行ずつ処理する
# 先頭が、name= 以外は処理しない
next unless line.start_with? "name="
line.chomp! # 末尾の改行を削除する
line += "," # 処理しやすいように一旦、末尾にカンマを付ける
line.slice! word # 取り除く
line.slice! -1 # 末尾のカンマを取り除く
puts line #=> name=value0,value1,value3
end
621デフォルトの名無しさん
2020/07/29(水) 06:28:49.20ID:Fq72tfsf sedの正規表現で最短一致は使えないって地味に罠だよな
[^]で工夫すれば行けるらしいが
[^]で工夫すれば行けるらしいが
622デフォルトの名無しさん
2020/07/29(水) 07:17:15.52ID:SoSaYlfN for((aa=-1;aa<4;aa++)); do echo name=value0,value1,value2,value3 |sed -e"/^name=/{s/$/,/; s/value${aa},//; s/,$//;}"; done
623618
2020/07/29(水) 11:42:17.47ID:bLm2KFbe >>622
完全に同意。個人的には {} 使わないで -e で並べたい派だけど。
*を使うより厳密に置換できてよいと思う。
619には以下の書き方のほうが分かりやすそう。
sed -e '/^name=/{s/$/,/; s/value0,//; s/,$//;}'
>>619
sedの正規表現では '?' 使えないはず。
GNU sed でもオプション使わないと通らないのが確認できた。
できれば -E を使ってほしいかな。個人的には。
-E, -r, --regexp-extended
use extended regular expressions in the script
(for portability use POSIX -E).
完全に同意。個人的には {} 使わないで -e で並べたい派だけど。
*を使うより厳密に置換できてよいと思う。
619には以下の書き方のほうが分かりやすそう。
sed -e '/^name=/{s/$/,/; s/value0,//; s/,$//;}'
>>619
sedの正規表現では '?' 使えないはず。
GNU sed でもオプション使わないと通らないのが確認できた。
できれば -E を使ってほしいかな。個人的には。
-E, -r, --regexp-extended
use extended regular expressions in the script
(for portability use POSIX -E).
624デフォルトの名無しさん
2020/07/29(水) 11:58:07.49ID:10XNhQ52 そうやって、外部コマンドをあれこれ駆使して
どうにかして簡単に書ける方法はないか?に
無駄な時間使ってるのを見るとアホやなぁって思う
一般的なやり方でできないなら諦めろよ
そのコマンドを使うのが間違ってるんだ
どうにかして簡単に書ける方法はないか?に
無駄な時間使ってるのを見るとアホやなぁって思う
一般的なやり方でできないなら諦めろよ
そのコマンドを使うのが間違ってるんだ
625デフォルトの名無しさん
2020/07/29(水) 12:32:30.11ID:ZD2Ud5DP626デフォルトの名無しさん
2020/07/29(水) 12:44:55.15ID:ZD2Ud5DP627デフォルトの名無しさん
2020/07/29(水) 13:19:38.86ID:E/WNSRes データがカンマを含む場合はどうしますか?
name1=v0,"v,,1",v2,,,vvv,unko,
name2=,sss,"hdj,du,n",,ss,,,,kkkk
name1=v0,"v,,1",v2,,,vvv,unko,
name2=,sss,"hdj,du,n",,ss,,,,kkkk
628デフォルトの名無しさん
2020/07/29(水) 15:37:47.77ID:iTLEUVw7 特定の行で区切った塊ごとで処理したいんだけどいい方法ない?
例えばこんなのだったら====で区切って
abc
def
==== 1
ghi
jkl
==== 2
mno
pqr
abc〜def、ghi〜jkl、mno〜pqrという3つの塊をそれぞれ処理したい。
それと ghi〜jklという塊を処理している時は1ですよ。という数字も知りたい
(最初の塊の時は数字なし)
例えばこんなのだったら====で区切って
abc
def
==== 1
ghi
jkl
==== 2
mno
pqr
abc〜def、ghi〜jkl、mno〜pqrという3つの塊をそれぞれ処理したい。
それと ghi〜jklという塊を処理している時は1ですよ。という数字も知りたい
(最初の塊の時は数字なし)
629デフォルトの名無しさん
2020/07/30(木) 06:16:08.96ID:ixil7w/z >>628
cat |sed -ne "/^===/! {H;}; $ b ll; /^=/ {:ll; s/=//g; x; s/\n/ /g; p;}" << EOL
abc
def
==== 1
ghi
jkl
==== 2
mno
pqr
EOL
abc def
1 ghi jkl
2 mno pqr
cat |sed -ne "/^===/! {H;}; $ b ll; /^=/ {:ll; s/=//g; x; s/\n/ /g; p;}" << EOL
abc
def
==== 1
ghi
jkl
==== 2
mno
pqr
EOL
abc def
1 ghi jkl
2 mno pqr
630デフォルトの名無しさん
2020/07/30(木) 06:42:42.05ID:oWxKF5YB631デフォルトの名無しさん
2020/07/30(木) 06:43:43.55ID:oWxKF5YB あと塊から改行を取り除いてはいけません
632デフォルトの名無しさん
2020/07/30(木) 14:54:43.85ID:Ws4Sjpc9 $!をリセットする方法はないですかね?
空とかunsetとか0とか
空とかunsetとか0とか
633デフォルトの名無しさん
2020/07/30(木) 15:15:25.11ID:l+t/gnGC Perl 使うと楽だが、シェルスクリプトで、か・・・
634デフォルトの名無しさん
2020/07/31(金) 00:34:30.45ID:h2BvMEZJ Ruby なら、
def f( num, line )
puts num, line
end
# num は、inject の蓄積変数。0 は初期値
File.foreach( "input.txt" ).inject( 0 ) do |num, line|
if line.start_with? "==== " # 先頭が、これなら
line.chomp! # 末尾の改行を削除する
num = line[ 5..-1 ].to_i # 数字の部分を取り出して、整数にする
next num
end
f( num, line )
num
end
出力
0
abc
0
def
1
ghi
1
jkl
2
mno
2
pqr
def f( num, line )
puts num, line
end
# num は、inject の蓄積変数。0 は初期値
File.foreach( "input.txt" ).inject( 0 ) do |num, line|
if line.start_with? "==== " # 先頭が、これなら
line.chomp! # 末尾の改行を削除する
num = line[ 5..-1 ].to_i # 数字の部分を取り出して、整数にする
next num
end
f( num, line )
num
end
出力
0
abc
0
def
1
ghi
1
jkl
2
mno
2
pqr
635デフォルトの名無しさん
2020/07/31(金) 01:26:11.97ID:1vLgXRtq >>630
Bashなら、プロセス置換(process substitution)でできるのでは。
<(echo;最初のデリミタ行までを抽出するコマンドライン)
<(echo 1;最初から次のデリミタ行までを抽出するコマンドライン)
<(echo 2;最後のデリミタ行からを抽出するコマンドライン)
としたら、先頭行が番号、それ以降がテキスト行として読み込める。
個人的には、さすがここまでのレベルならPerlとかでやったほうが。
Bashなら、プロセス置換(process substitution)でできるのでは。
<(echo;最初のデリミタ行までを抽出するコマンドライン)
<(echo 1;最初から次のデリミタ行までを抽出するコマンドライン)
<(echo 2;最後のデリミタ行からを抽出するコマンドライン)
としたら、先頭行が番号、それ以降がテキスト行として読み込める。
個人的には、さすがここまでのレベルならPerlとかでやったほうが。
636デフォルトの名無しさん
2020/07/31(金) 19:26:43.51ID:qTuk7lt4 bashの#!でのオプションについて質問。
先頭行を次のようにすると、「invalid option name」エラーになります。
#!/usr/bin/bash -o pipefail
...
しかし、コマンドラインに同じように書くとエラーになりません。
/usr/bin/bash -o pipefail -c '...'
どうして?
-eならどっちも問題ないので、#!行のオプションの解釈になにか秘密があるんだろうけど。
先頭行を次のようにすると、「invalid option name」エラーになります。
#!/usr/bin/bash -o pipefail
...
しかし、コマンドラインに同じように書くとエラーになりません。
/usr/bin/bash -o pipefail -c '...'
どうして?
-eならどっちも問題ないので、#!行のオプションの解釈になにか秘密があるんだろうけど。
637デフォルトの名無しさん
2020/07/31(金) 20:01:20.64ID:j/9/9lyu >>636
MacOSやFreeBSDだと上手くいく。
原因はLinuxのexecl()関数が
「/usr/bin/bash」と「-o pipefail」という
二つの引数を実行しているせい。
とうぜん「o pipefail」というオプションはないので,怒られる。
MacOSやFreeBSDだと上手くいく。
原因はLinuxのexecl()関数が
「/usr/bin/bash」と「-o pipefail」という
二つの引数を実行しているせい。
とうぜん「o pipefail」というオプションはないので,怒られる。
638デフォルトの名無しさん
2020/07/31(金) 20:03:04.24ID:j/9/9lyu さらに言うと,
シバンはPOSIXが「実装ごとに挙動がバラバラなんで俺はこの動作を規定しません」
って公言するくらい,各種OSごとに扱われかたが違う。
今調べられないけど,古いAIXとかだと
「!/usr/bin/bash -o pipefail」とかいうコマンドを探しにいってエラー吐いてた記憶がある。
シバンはPOSIXが「実装ごとに挙動がバラバラなんで俺はこの動作を規定しません」
って公言するくらい,各種OSごとに扱われかたが違う。
今調べられないけど,古いAIXとかだと
「!/usr/bin/bash -o pipefail」とかいうコマンドを探しにいってエラー吐いてた記憶がある。
639デフォルトの名無しさん
2020/07/31(金) 20:39:05.80ID:k/mzlDiC >>636
/usr/bin/bash -o pipefail ではなく
/usr/bin/bash "-o pipefail" を実行している
まあ素直に
#!/bin/bash
set -o pipefail
って書けってことだな
/usr/bin/bash -o pipefail ではなく
/usr/bin/bash "-o pipefail" を実行している
まあ素直に
#!/bin/bash
set -o pipefail
って書けってことだな
640デフォルトの名無しさん
2020/07/31(金) 21:40:13.69ID:j/9/9lyu もう書いたんだが…
641デフォルトの名無しさん
2020/07/31(金) 21:44:42.11ID:qTuk7lt4642デフォルトの名無しさん
2020/07/31(金) 21:56:20.95ID:k/mzlDiC /usr/bin/bashにbashがあるとは限らない
というか普通無い
というか普通無い
643デフォルトの名無しさん
2020/07/31(金) 22:30:39.13ID:j/9/9lyu644デフォルトの名無しさん
2020/07/31(金) 22:35:57.38ID:h2BvMEZJ 普通は、/bin/bash
じゃないの?
じゃないの?
645デフォルトの名無しさん
2020/07/31(金) 22:55:43.76ID:qTuk7lt4646デフォルトの名無しさん
2020/07/31(金) 23:03:07.55ID:w9lTjcUH $ lsb_release -d
Description: Ubuntu 20.04.1 LTS
$ ls -1 /bin/bash
/bin/bash
$ ls -1 /usr/bin/bash
ls: cannot access '/usr/bin/bash': No such file or directory
Description: Ubuntu 20.04.1 LTS
$ ls -1 /bin/bash
/bin/bash
$ ls -1 /usr/bin/bash
ls: cannot access '/usr/bin/bash': No such file or directory
647デフォルトの名無しさん
2020/07/31(金) 23:31:35.93ID:BwwodwaD >>645
Linuxの場合/usr/binにbashがあるのは/bin -> /usr/binになっている環境ぐらい。それ以外はほぼ間違いなく/binにある。元々シングルユーザーモード用の/binになかったら、シングルユーザーモードでシェルが使えないでしょ。
最近は/binと/usr/binを統合する動きが進んでいるから将来はどっちでも良くなるかもしれないし、あるいは/binがなくなるかもしれないけど、今はまだ従来の環境も普通にあるから/bin/bashがいい。その為にシムリンクを張っているわけなので。
UbuntuやDebianは、今インストールすると統合されるけど、従来の環境からアップデートした場合は統合されない。
あとGentooとかは今クリーンインストールしても統合されない。
Linuxの場合/usr/binにbashがあるのは/bin -> /usr/binになっている環境ぐらい。それ以外はほぼ間違いなく/binにある。元々シングルユーザーモード用の/binになかったら、シングルユーザーモードでシェルが使えないでしょ。
最近は/binと/usr/binを統合する動きが進んでいるから将来はどっちでも良くなるかもしれないし、あるいは/binがなくなるかもしれないけど、今はまだ従来の環境も普通にあるから/bin/bashがいい。その為にシムリンクを張っているわけなので。
UbuntuやDebianは、今インストールすると統合されるけど、従来の環境からアップデートした場合は統合されない。
あとGentooとかは今クリーンインストールしても統合されない。
648デフォルトの名無しさん
2020/08/01(土) 01:21:21.09ID:6XTg5Iao >>647
シングルユーザー環境はまったく想定外なので。。。
ファイルパスをあわせても、実際の具体的な環境は把握できてないし、どうせ動作確認もしないから、きっぱりわりきることにしたのだ。
binの統合の話は、RHEL8のドキュメントで見た気がするけど、だったらもうとっととのっとこう、と思ったのもある。
うちのメインはCentOSだし、そうなってない環境を使うことになったら自分でシンボリックリンクを追加したらええんやろ、ということで。
シングルユーザー環境はまったく想定外なので。。。
ファイルパスをあわせても、実際の具体的な環境は把握できてないし、どうせ動作確認もしないから、きっぱりわりきることにしたのだ。
binの統合の話は、RHEL8のドキュメントで見た気がするけど、だったらもうとっととのっとこう、と思ったのもある。
うちのメインはCentOSだし、そうなってない環境を使うことになったら自分でシンボリックリンクを追加したらええんやろ、ということで。
649デフォルトの名無しさん
2020/08/01(土) 08:14:01.78ID:6JQgXAfu 又聞きで悪いが,Oracleかなにかだと,/usr/bin/にはGNU系の製品が入ってなかったとか。
/export/以下にあるとかなんとか。
/export/以下にあるとかなんとか。
650デフォルトの名無しさん
2020/08/01(土) 08:30:02.46ID:2HCIDb75 /opt/bin とかに入ってるのもあったなぁ
651649
2020/08/01(土) 10:05:25.94ID:6JQgXAfu >>650
あー。これで思い出した。
/opt/bin/だわ。
/export/は利用者のホームディレクトリとかがある所だわ。
Bashの場所とは関係ない話になるけど,
昔$HOME変数とか使わずに/home/***以下にあるやろって決め打ちしてたら
Solarisではまさかの/export/home/***にあるっていう罠に引っ掛かったw
あー。これで思い出した。
/opt/bin/だわ。
/export/は利用者のホームディレクトリとかがある所だわ。
Bashの場所とは関係ない話になるけど,
昔$HOME変数とか使わずに/home/***以下にあるやろって決め打ちしてたら
Solarisではまさかの/export/home/***にあるっていう罠に引っ掛かったw
652デフォルトの名無しさん
2020/08/01(土) 13:49:06.35ID:U7vGE7b3 何十年経ってもディレクトリが分類できる未来はないんやな
653デフォルトの名無しさん
2020/08/01(土) 17:25:34.94ID:WzMhf7ZH >>652
OS作る時にOSの仕様として組み込んでしまうぐらいしか方法無いと思う。ちょっとでも自由があると必ずそこから崩れる。
OS作る時にOSの仕様として組み込んでしまうぐらいしか方法無いと思う。ちょっとでも自由があると必ずそこから崩れる。
654デフォルトの名無しさん
2020/08/01(土) 23:28:16.58ID:huzWWnKB 10MBぐらいのテキストファイルでさ
指定したバイト目から〜バイトの範囲を取得っていうのを
やるととしたらどういう方法が一番高速だろうか?
bashismなし。外部コマンドは呼び出してもいいけど遅いな
指定したバイト目から〜バイトの範囲を取得っていうのを
やるととしたらどういう方法が一番高速だろうか?
bashismなし。外部コマンドは呼び出してもいいけど遅いな
655デフォルトの名無しさん
2020/08/02(日) 00:54:32.67ID:hIQzyyzC Perlでワンライナーが速そう。w
656デフォルトの名無しさん
2020/08/02(日) 00:55:21.79ID:KvZo8Zjs でもPerlを呼び出すコストがかかるでしょ?
657デフォルトの名無しさん
2020/08/02(日) 03:03:58.88ID:hIQzyyzC じゃあ、全文をPerlに書き直そう。w
いっそCで?
マジな話、ファイルを直に開いてseekできるPerlならトータル黒字なんでは。
知らんけど。
いっそCで?
マジな話、ファイルを直に開いてseekできるPerlならトータル黒字なんでは。
知らんけど。
658デフォルトの名無しさん
2020/08/02(日) 08:34:06.01ID:fjyVy3s+ dd, od, head/tail
コンパイル済みのCのコードのほうが速いやろ
コンパイル済みのCのコードのほうが速いやろ
659デフォルトの名無しさん
2020/08/02(日) 09:26:03.25ID:mglN/rTr >>654
dd一択。
dd一択。
660デフォルトの名無しさん
2020/08/02(日) 12:16:22.41ID:pZSLu0WP そもそも設定が/etc/に雑に放り込まれてる時点でな
個人設定だって~/直下だったり~/.dirだったり~/.config/.dirだったりてんでバラバラだし
個人設定だって~/直下だったり~/.dirだったり~/.config/.dirだったりてんでバラバラだし
661デフォルトの名無しさん
2020/08/02(日) 14:14:46.24ID:hIQzyyzC662デフォルトの名無しさん
2020/08/02(日) 14:18:23.50ID:hIQzyyzC いや、head $(())|tailとすればマシなのか。
元コメのPerl起動時間さえ気にする用途にはあわんかもだけど。
元コメのPerl起動時間さえ気にする用途にはあわんかもだけど。
663デフォルトの名無しさん
2020/08/02(日) 15:04:27.21ID:mglN/rTr664デフォルトの名無しさん
2020/08/02(日) 15:44:30.48ID:hIQzyyzC >>663
別人かもだけど、そういう気持ちは元コメから書いてあったから。。。
head/tailは、--bytesオプションがあるやろ?
算術式展開は、でもBash限定なんだっけ?
ただ、いずれにしてもddにしろheadにしろtailにしろ、スキップが読み捨てなのか直シークなのかで速度が違いそう?
別人かもだけど、そういう気持ちは元コメから書いてあったから。。。
head/tailは、--bytesオプションがあるやろ?
算術式展開は、でもBash限定なんだっけ?
ただ、いずれにしてもddにしろheadにしろtailにしろ、スキップが読み捨てなのか直シークなのかで速度が違いそう?
665デフォルトの名無しさん
2020/08/02(日) 19:23:27.16ID:mglN/rTr >>664
算術展開はPOSIXで定義されてるから
最近のPOSIX準拠を謳うシェルなら必ず使える。
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04
算術展開はPOSIXで定義されてるから
最近のPOSIX準拠を謳うシェルなら必ず使える。
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04
666デフォルトの名無しさん
2020/08/02(日) 19:30:06.31ID:TAOBMMvc >>661
ファイルの大きさを見て一番後ろを見に行くから遅いはずがない
ファイルの大きさを見て一番後ろを見に行くから遅いはずがない
667デフォルトの名無しさん
2020/08/02(日) 19:39:48.99ID:wSiq9/7A $ ls -1sh input.dat
10M input.dat
$ dd if=input.dat of=output.dat bs=1M skip=1 count=1
$ ls -1sh output.dat
1.0M output.dat
10M input.dat
$ dd if=input.dat of=output.dat bs=1M skip=1 count=1
$ ls -1sh output.dat
1.0M output.dat
668デフォルトの名無しさん
2020/08/02(日) 20:02:20.24ID:hIQzyyzC669デフォルトの名無しさん
2020/08/02(日) 20:07:58.65ID:hIQzyyzC670デフォルトの名無しさん
2020/08/02(日) 20:12:02.85ID:hIQzyyzC671デフォルトの名無しさん
2020/08/02(日) 20:12:54.07ID:mglN/rTr672デフォルトの名無しさん
2020/08/02(日) 22:39:25.35ID:mglN/rTr >>670
素因数分解して,最適な読み出しサイズとブロック単位を決定するのおもしろそう。
素因数分解して,最適な読み出しサイズとブロック単位を決定するのおもしろそう。
673デフォルトの名無しさん
2020/08/03(月) 07:46:56.04ID:U44E4Fsa すみません、
出来てもやるべきでないのは分かるんですけど、
日本語でシンボリックリンク張って日本語でコマンド呼び出しってできますっけ?
$ エコー ヤッホー
ヤッホー
$
みたいな。
出来てもやるべきでないのは分かるんですけど、
日本語でシンボリックリンク張って日本語でコマンド呼び出しってできますっけ?
$ エコー ヤッホー
ヤッホー
$
みたいな。
674デフォルトの名無しさん
2020/08/03(月) 08:04:35.59ID:mpHVQN+T >>673
自分でやってみたら?
自分でやってみたら?
675デフォルトの名無しさん
2020/08/04(火) 20:42:37.24ID:Bm48LwqI できると思うけどな
環境によりけりかな?
使ってる文字コードがシフトJISみたいなやつだとダメかも知れないが、それでも大丈夫なようには作れるからなんとも言えない
環境によりけりかな?
使ってる文字コードがシフトJISみたいなやつだとダメかも知れないが、それでも大丈夫なようには作れるからなんとも言えない
676デフォルトの名無しさん
2020/08/04(火) 21:14:57.71ID:SyQYqCbe そもそもLinux/UnixはShiftJISをサポートできない
OSの設計的に不可能
("無理やり"やってるのはあるが動作保証できない)
OSの設計的に不可能
("無理やり"やってるのはあるが動作保証できない)
677デフォルトの名無しさん
2020/08/04(火) 21:57:03.67ID:nAqHRtEu >>676
逆にWindowsって,「無理やり」じゃなくShift-JISに対応できてたん?
そっちの方が驚きなんだが。
俺には文脈不明の状態でエスケープ文字とバイト化文字の一部とを判別する
OSネイティブな方法が思い付かないw
逆にWindowsって,「無理やり」じゃなくShift-JISに対応できてたん?
そっちの方が驚きなんだが。
俺には文脈不明の状態でエスケープ文字とバイト化文字の一部とを判別する
OSネイティブな方法が思い付かないw
678デフォルトの名無しさん
2020/08/04(火) 22:20:38.92ID:SyQYqCbe >>677
Windows NTは最初のバージョン(1994年)から
Unicode(UTF-16)対応だからね
UTF-16は文字の一部にNULL文字が入るから
当時からC言語の標準ライブラリでは扱えないことがわかっていた
マルチバイト文字は最初から対策済みなわけよ
Windows NTは最初のバージョン(1994年)から
Unicode(UTF-16)対応だからね
UTF-16は文字の一部にNULL文字が入るから
当時からC言語の標準ライブラリでは扱えないことがわかっていた
マルチバイト文字は最初から対策済みなわけよ
679デフォルトの名無しさん
2020/08/04(火) 22:51:05.57ID:tCUx/sk1680デフォルトの名無しさん
2020/08/04(火) 23:01:03.79ID:SyQYqCbe681デフォルトの名無しさん
2020/08/04(火) 23:02:50.20ID:tCUx/sk1 >>678
同時に、OEM文字コードとしてシフトJISを採用したのだから、できない理由になってない。
ちなみに、UTF-16を採用したのは、当時は全多言語がUCS-2を前提にしてたからやろ。
振り返ると微妙な選択だったが、当時の外人にはわからんかったのはしゃあない。
同時に、OEM文字コードとしてシフトJISを採用したのだから、できない理由になってない。
ちなみに、UTF-16を採用したのは、当時は全多言語がUCS-2を前提にしてたからやろ。
振り返ると微妙な選択だったが、当時の外人にはわからんかったのはしゃあない。
682デフォルトの名無しさん
2020/08/04(火) 23:05:00.00ID:SyQYqCbe >>681
Windowsは初期バージョンから多言語対応として作られてるという話
Windowsは初期バージョンから多言語対応として作られてるという話
683デフォルトの名無しさん
2020/08/04(火) 23:06:56.83ID:Btmoo/Kt 普通にShift-JISなUNIXとかあったし。
UNIXの多くのシステムコールでは、char*型引数は単なるバイト列で、別に\とかが意見を持ったりしない(ただしファイル名の/を除く。他に例外があるかは知らない。)。
Shift-JISでは2バイト目に/もnulも来ないから普通は問題ない。
ユーザーランドは何とでもなる。
今時のlinuxなら
# localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
$ export LANG=ja_JP.sjis
で動く。
ja_JP.utf8とja_JP.eucJPどっちでも動くなら、localeに対応しているから、多分sjisでも動く。
普通にシェルとかも問題ない。
UNIXの多くのシステムコールでは、char*型引数は単なるバイト列で、別に\とかが意見を持ったりしない(ただしファイル名の/を除く。他に例外があるかは知らない。)。
Shift-JISでは2バイト目に/もnulも来ないから普通は問題ない。
ユーザーランドは何とでもなる。
今時のlinuxなら
# localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
$ export LANG=ja_JP.sjis
で動く。
ja_JP.utf8とja_JP.eucJPどっちでも動くなら、localeに対応しているから、多分sjisでも動く。
普通にシェルとかも問題ない。
684デフォルトの名無しさん
2020/08/04(火) 23:09:26.33ID:tCUx/sk1 >>680
じゃあ、C言語のどこにシフトJISを拒絶する要素が?
C言語が文字コードに求めてるのは終端が「¥0」であることだけだろ。
シフトJISもその条件に反しないが。
なお、エスケープが面倒というのは、できない理由にはならないので、念のため。
じゃあ、C言語のどこにシフトJISを拒絶する要素が?
C言語が文字コードに求めてるのは終端が「¥0」であることだけだろ。
シフトJISもその条件に反しないが。
なお、エスケープが面倒というのは、できない理由にはならないので、念のため。
685デフォルトの名無しさん
2020/08/04(火) 23:15:26.51ID:tCUx/sk1686デフォルトの名無しさん
2020/08/05(水) 00:11:31.18ID:NEgglKp4 $ echo $BASH_VERSION
5.0.17(1)-release
$ echo $LANG
ja_JP.UTF-8
$ touch "$(echo ソ表.txt| nkf -s)"
$ export LANG=ja_JP.sjis
$ ls -1 *.txt
'ソ表.txt'
$ ls -1 *.txt | od -tx1a
0000000 83 5c 95 5c 2e 74 78 74 0a
etx \ nak \ . t x t nl
5.0.17(1)-release
$ echo $LANG
ja_JP.UTF-8
$ touch "$(echo ソ表.txt| nkf -s)"
$ export LANG=ja_JP.sjis
$ ls -1 *.txt
'ソ表.txt'
$ ls -1 *.txt | od -tx1a
0000000 83 5c 95 5c 2e 74 78 74 0a
etx \ nak \ . t x t nl
687デフォルトの名無しさん
2020/08/05(水) 00:11:35.72ID:AdI/6NZo688デフォルトの名無しさん
2020/08/05(水) 00:46:48.96ID:RWwgydsE689デフォルトの名無しさん
2020/08/05(水) 01:06:50.99ID:RWwgydsE >>686
それは、lsとターミナルががんばったおかげじゃない?w
ダメなケースがあるんじゃないかと思うんだけど、みんなに期待してええんかな?
あ、シフトJIS対応についてのオレの認識は、カーネルには関係ないだろうしシェルは不可能ではないが茨の道やろなあ、くらい。
それは、lsとターミナルががんばったおかげじゃない?w
ダメなケースがあるんじゃないかと思うんだけど、みんなに期待してええんかな?
あ、シフトJIS対応についてのオレの認識は、カーネルには関係ないだろうしシェルは不可能ではないが茨の道やろなあ、くらい。
690デフォルトの名無しさん
2020/08/05(水) 01:46:22.40ID:vmNTB6tp 行末に、ダメ文字があれば、
\ で、改行がエスケープされるとか?
\ で、改行がエスケープされるとか?
691デフォルトの名無しさん
2020/08/05(水) 03:13:28.66ID:AdI/6NZo やれやれだなw
例えば文字を一文字ずつ見ていって
_をスペースに置き換える処理は
漢字を壊すんだよ
例えば文字を一文字ずつ見ていって
_をスペースに置き換える処理は
漢字を壊すんだよ
692デフォルトの名無しさん
2020/08/05(水) 06:17:52.92ID:eDoiMqdf それはやなカンジ
693デフォルトの名無しさん
2020/08/05(水) 06:34:24.95ID:gqsMBs9q bashでダメ文字列を試したら、
a)問題なし
コマンドラインでの入力編集、ヒストリー、コマンドに渡る引数、外部コマンド呼び出し、カレントディレクトリの扱い、行末の\及びダメ文字の扱い、変数の代入と使用、変数のlengthとsubstring、コマンド置換、リダイレクトのファイル名、echo及びprintf、シェル関数名 など大部分
b)一部問題あり
PS1の\wが文字化け($PWDを使うと化けない)
c)問題あり
・globで、5cを含むマルチバイト文字が2文字とカウントされる(「ソ」が?ではなく??で選ばれる。他のASCIIと被る文字は問題ない。)
・変数の置換
abc=オソソソソソソソとして、
${abc//オ/ロ}は動くけど${abc//ソ/ロ}は駄目
一方で${abc//オ/ソ}は問題ない
たしか置換前の方がglob扱いだったから、これは上のglobを直せば同時に直るかもしれない
・alias名
ちょっとした修正で全く問題なくなりそう
a)問題なし
コマンドラインでの入力編集、ヒストリー、コマンドに渡る引数、外部コマンド呼び出し、カレントディレクトリの扱い、行末の\及びダメ文字の扱い、変数の代入と使用、変数のlengthとsubstring、コマンド置換、リダイレクトのファイル名、echo及びprintf、シェル関数名 など大部分
b)一部問題あり
PS1の\wが文字化け($PWDを使うと化けない)
c)問題あり
・globで、5cを含むマルチバイト文字が2文字とカウントされる(「ソ」が?ではなく??で選ばれる。他のASCIIと被る文字は問題ない。)
・変数の置換
abc=オソソソソソソソとして、
${abc//オ/ロ}は動くけど${abc//ソ/ロ}は駄目
一方で${abc//オ/ソ}は問題ない
たしか置換前の方がglob扱いだったから、これは上のglobを直せば同時に直るかもしれない
・alias名
ちょっとした修正で全く問題なくなりそう
694デフォルトの名無しさん
2020/08/05(水) 08:19:35.02ID:AdI/6NZo × ちょっとした修正で全く問題なくなりそう
○ 多数のソフトを修正しなければならないから大問題
○ 多数のソフトを修正しなければならないから大問題
695デフォルトの名無しさん
2020/08/05(水) 08:21:45.48ID:AdI/6NZo SJISの問題は _ の話だけじゃないよ
ASCII文字のほぼ半分。制御文字と数字と一部の記号除いた
アルファベット文字に関する処理すべてが漢字の文字に影響する
例えばAを検索すると一部の漢字にマッチするし
Aを置換すると一部の漢字を壊す
ASCII文字のほぼ半分。制御文字と数字と一部の記号除いた
アルファベット文字に関する処理すべてが漢字の文字に影響する
例えばAを検索すると一部の漢字にマッチするし
Aを置換すると一部の漢字を壊す
696デフォルトの名無しさん
2020/08/05(水) 08:46:51.45ID:AdI/6NZo cat sjis.txt | tr [a-z] [A-Z] > sjis2.txt
ナニヌネノ -> オカガキギ に化ける
地震で津波が発生 -> 誰尻で津濡が発生 に化ける
ナニヌネノ -> オカガキギ に化ける
地震で津波が発生 -> 誰尻で津濡が発生 に化ける
697デフォルトの名無しさん
2020/08/05(水) 09:21:26.65ID:eyNhEtAe > 誰尻で津濡が発生
俺のフィンガーテクを受けたやつはみんなこうなる
俺のフィンガーテクを受けたやつはみんなこうなる
698デフォルトの名無しさん
2020/08/05(水) 09:42:07.23ID:EDez6Utv かつてEUC対応していたこととは次元が違うん?
699デフォルトの名無しさん
2020/08/05(水) 10:01:54.20ID:Mw508nfj というか「WindowsのShift-JISへの対策・対応状況」と
「Linux (Unix) のShift-JISへの対策・対応状況」とでさして違いがない。
「LinuxでShift-JISに対応しようとすると多数のソフトの修正が必要」というのであれば
同じ問題がWindowsでも起きてる。
実際ダメ文字っていう概念はLinuxに限った概念じゃないからね。
むしろWindowsでShift-JISに対応しておらずダメ文字が問題になった例の方が、
人口比的なものもあるだろうけど、より有名じゃない?
「Linux (Unix) のShift-JISへの対策・対応状況」とでさして違いがない。
「LinuxでShift-JISに対応しようとすると多数のソフトの修正が必要」というのであれば
同じ問題がWindowsでも起きてる。
実際ダメ文字っていう概念はLinuxに限った概念じゃないからね。
むしろWindowsでShift-JISに対応しておらずダメ文字が問題になった例の方が、
人口比的なものもあるだろうけど、より有名じゃない?
700デフォルトの名無しさん
2020/08/05(水) 10:08:58.04ID:RWwgydsE >>695
それはOSの問題ではない。
そんな処理をしたユーザーが問題。
たとえば、英字の大文字小文字変換としてコード値に0x20を加減したら、ASCIIならうまくいくが、UTF-8 ならうまくいかない。
現実のテキスト処理をするなら、文字コードの仕様にあわせることはあたりまえ。
シフトJISなら、バイトがマルチバイト文字の上位バイトか下位バイトかいずれでもないかは当然区別して処理しないと。
それはOSの問題ではない。
そんな処理をしたユーザーが問題。
たとえば、英字の大文字小文字変換としてコード値に0x20を加減したら、ASCIIならうまくいくが、UTF-8 ならうまくいかない。
現実のテキスト処理をするなら、文字コードの仕様にあわせることはあたりまえ。
シフトJISなら、バイトがマルチバイト文字の上位バイトか下位バイトかいずれでもないかは当然区別して処理しないと。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【赤坂ライブハウス刺傷】逃走していた自衛官の男(43)を殺人未遂の疑いで逮捕 警視庁 被害女性とは知人関係 [Ailuropoda melanoleuca★]
- 中国官製報道「日本経済はもう持たない」にネット民ツッコミ「ニュースだけ見てたら日本はもう百回くらい爆発してる」 [1ゲットロボ★]
- 植田日銀総裁 「円安進行が物価高を起こしている」 ★4 [お断り★]
- 【硬貨】500円だと思ったら「500ウォンが入っていた」価値は約10分の1 全国で飲食店などで“500ウォントラブル”相次いで報告 [ぐれ★]
- 「ふざけんな!」 国会議員給与、『月5万円増』報道にネット騒然 「国民が物価高で困っているのに」「定数削減とか言いながら…」★2 [♪♪♪★]
- 外国人観光客に「ランチタイム来店遠慮して」富士そば店舗の貼り紙が波紋、運営会社は撤去指示 [七波羅探題★]
