シェルスクリプト総合 ..
[2ch|▼Menu]
617:デフォルトの名無しさん
20/07/18 07:03:52.09 6UJBCs7F.net
Emacs

618:デフォルトの名無しさん
20/07/18 10:26:12 PyiwbgQS.net
Vim

619:デフォルトの名無しさん
20/07/18 10:38:54.42 W7WHirLG.net
vscode

620:デフォルトの名無しさん
20/07/18 11:38:05.10 PyiwbgQS.net
バカな投稿をすると釣られた人間が正しい知識を教えてくれるメソッド
よかったな,>>591

621:デフォルトの名無しさん
20/07/18 11:44:04 fwbEJCvA.net
つまりvscodeが正しいと?

622:デフォルトの名無しさん
20/07/18 12:39:31.97 PyiwbgQS.net
俺のスレ読んでないの?w

623:デフォルトの名無しさん
20/07/18 13:28:14.79 fwbEJCvA.net
お前のレス?釣られた人間が正しい知識を教えてくれるんでしょう?
それ以外になんかあるの?

624:デフォルトの名無しさん
20/07/18 13:48:08.58 W7WHirLG.net
エディタも使いこなせないならwinのメモ帳でも使いなよ。sjis対応だよ

625:デフォルトの名無しさん
20/07/19 08:53:42.63 b8gde26L.net
お前いつも壁と話してんな

626:デフォルトの名無しさん
20/07/19 10:23:03.44 HNDAT4gV.net
壁だと思ってるのはお前だけで、実は人間なんだぜ(ホラー風)

627:デフォルトの名無しさん
20/07/19 11:15:59.84 W3hSYpRn.net
ぬりかべ「かべっ!?」

628:デフォルトの名無しさん
20/07/27 19:01:06.79 prTniRCc.net
manコマンドはPOSIXに取り入れられそうなのに
その表示に関わるroffコマンドは影も形もないって、
なんつーか意味あんのかそれって思う。

629:デフォルトの名無しさん
20/07/27 20:34:03 Sw4i8xv6.net
>>603
roff 使わなくても cat1 とか cat8 に成形済みテキスト置いておくだけで man
は動くんだから、別に roff なくても良いといえばいいとか、そんな理屈なのかも。

630:デフォルトの名無しさん
20/07/27 20:48:14.37 9y96d1KX.net
manをPOSIXに取り入れるぐらいなら
HTMLビューワーをPOSIXに取り入れたほうが良い
JavaScriptとCSSに対応させる必要はないからさ

631:デフォルトの名無しさん
20/07/27 20:50:03.70 9y96d1KX.net
curlをPOSIXに入れればいいのに
フル機能じゃなくていいけどREST API叩けるぐらい

632:デフォルトの名無しさん
20/07/27 21:12:03.12 vTLRE8Va.net
>>603
おお、するどい。
でもmanが入ってないというのはどう言う意味? POSIXとSUSの意味の違いにこだわる?
で実際manの記述を見ると文章の整形とかそれをどう作るとかは書いてないので、
そういうレベルのものは規定しないという態度なのかも。
あと事実上GNU roffが標準だと思うが、さすがにそれを規格には入れられないのかも。
かといって今更大昔のroffに制限するのもなあと。
しかし最近GNUで検索するとKingの方がヒットしやすくてうざいw

633:デフォルトの名無しさん
20/07/27 21:16:04.4


634:5 ID:vTLRE8Va.net



635:デフォルトの名無しさん
20/07/28 08:42:48.22 UlETHBDV.net
こんなのか?
URLリンク(www.e-hon.ne.jp)
まだ役に立ってるよ。俺が持ってるのは 20.3 だけど。

636:デフォルトの名無しさん
20/07/28 13:13:59.11 R16GmJU5.net
質問。
次のような行からいずれかのvalueをきれいに削除するにはどうすれば?
name=value0,value1,value2,value3
たとえば次のコマンドだと、value1を削除できるものの、先頭か末尾か連続かのカンマが残ってしまう。。。
sed 's/^(name=.*)value1(.*)$/¥1¥2/'
残ったカンマを後で処理したらいいんだけど、そもそも一発でうまくやることができるんでは?という気がどうしても。

637:デフォルトの名無しさん
20/07/28 13:23:54.46 Mb4DOiRz.net
^(name=.*)bvalue1,?(.*)$
こうかな

638:デフォルトの名無しさん
20/07/28 13:24:17.04 Mb4DOiRz.net
文字化けてるとこは円記号な

639:デフォルトの名無しさん
20/07/28 13:53:56.25 DVrEteyf.net
King Gnu?
どっかで聞いたことあるようなないような▪▪▪

640:デフォルトの名無しさん
20/07/28 14:07:36.32 R16GmJU5.net
>>611
value3の場合、末尾にカンマが残るよね?
また、value0なら先頭に残る。
どれでも一発できれいに削除できないかな?

641:デフォルトの名無しさん
20/07/28 14:08:46.03 3p32kQjL.net
残らないが?

642:デフォルトの名無しさん
20/07/28 14:25:35.27 R16GmJU5.net
残るが。
value3直前のカンマが¥1に含まれるので。

643:デフォルトの名無しさん
20/07/28 23:58:59.24 2KWkEgO3.net
>>610
>name=value0,value1,value2,value3
頭を柔らかくして、
最初に、この末尾に、カンマを追加すれば、処理しやすい形式になる
name=value0,value1,value2,value3,

644:デフォルトの名無しさん
20/07/29 00:10:05.86 bLm2KFbe.net
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/,$//'

645:デフォルトの名無しさん
20/07/29 03:25:12 ZD2Ud5DP.net
>>617
Perlとかならそうするが、sedだとなかなか?
sedはあんまり使わないので、そうしたくてもよくわからない。。。

>>618
sed縛りではないけど、Linux最小インストールでも対応したいので、sedくらいしか?
ほかに使えるならそれも可。

後方参照してるのは、「name=」で始まる行だけに限定したいから。
それ以外の行はそのままで。

「?」が使えない正規表現があるの?
POSIXに含まれてなかったっけ?

ちなみに現在はこうしてたっけかな?
細かいところはちょっと違うかも。
sed -r 's/^(name=.*)value1,?(.*)$/¥1¥2/;s/^(name=.*),+$/¥1/' -i file.txt

なんかくどくて、もっとさっぱり書けるやろと。。。

646:デフォルトの名無しさん
20/07/29 05:18:27.85 W2ZwK0DF.net
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

647:デフォルトの名無しさん
20/07/29 06:28:49.20 Fq72t


648:fsf.net



649:デフォルトの名無しさん
20/07/29 07:17:15.52 SoSaYlfN.net
for((aa=-1;aa<4;aa++)); do echo name=value0,value1,value2,value3 |sed -e"/^name=/{s/$/,/; s/value${aa},//; s/,$//;}"; done

650:618
20/07/29 11:42:17.47 bLm2KFbe.net
>>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).

651:デフォルトの名無しさん
20/07/29 11:58:07 10XNhQ52.net
そうやって、外部コマンドをあれこれ駆使して
どうにかして簡単に書ける方法はないか?に
無駄な時間使ってるのを見るとアホやなぁって思う
一般的なやり方でできないなら諦めろよ
そのコマンドを使うのが間違ってるんだ

652:デフォルトの名無しさん
20/07/29 12:32:30.11 ZD2Ud5DP.net
>>622
なるほど。
sコマンドで全行置換することしか頭になかった。。。
パターンマッチで行を特定してから、複数の置換を{}でまとめて行えばいいのか。
なんかsedの要領がわかった気がするぞ。
どうもありがとう。
>>620
Rubyなら、split()とjoin()を使ったらもっとさっぱりにできそう。

653:デフォルトの名無しさん
20/07/29 12:44:55.15 ZD2Ud5DP.net
>>623
いや、>>622でちゃんとわかったで?
# ちょっとかんがえたけど。
正規表現の「?」は確認するとたしかにダメだった。
-Eは、「¥bvalue」としたい都合でつけてたから、あんまり意識してなかった。
と思ったら、こっちは-Eがなくてもよかったのか。
なんかもうメチャクチャだなー。w

654:デフォルトの名無しさん
20/07/29 13:19:38.86 E/WNSRes.net
データがカンマを含む場合はどうしますか?
name1=v0,"v,,1",v2,,,vvv,unko,
name2=,sss,"hdj,du,n",,ss,,,,kkkk

655:デフォルトの名無しさん
20/07/29 15:37:47.77 iTLEUVw7.net
特定の行で区切った塊ごとで処理したいんだけどいい方法ない?
例えばこんなのだったら====で区切って
abc
def
==== 1
ghi
jkl
==== 2
mno
pqr

abc〜def、ghi〜jkl、mno〜pqrという3つの塊をそれぞれ処理したい。
それと ghi〜jklという塊を処理している時は1ですよ。という数字も知りたい
(最初の塊の時は数字なし)

656:デフォルトの名無しさん
20/07/30 06:16:08.96 ixil7w/z.net
>>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

657:デフォルトの名無しさん
20/07/30 06:42:42.05 oWxKF5YB.net
>>629
条件を忘れましたが、画面に出力するのではなく
任意の処理をしたいのです。
つまり
foo() {
# $1 = 番号
# $2 = 塊
}
のようなことがしたいのです。

658:デフォルトの名無しさん
20/07/30 06:43:43.55 oWxKF5YB.net
あと塊から改行を取り除いてはいけません

659:デフォルトの名無しさん
20/07/30 14:54:43 Ws4Sjpc9.net
$!をリセットす


660:る方法はないですかね? 空とかunsetとか0とか



661:デフォルトの名無しさん
20/07/30 15:15:25.11 l+t/gnGC.net
Perl 使うと楽だが、シェルスクリプトで、か・・・

662:デフォルトの名無しさん
20/07/31 00:34:30.45 h2BvMEZJ.net
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

663:デフォルトの名無しさん
20/07/31 01:26:11.97 1vLgXRtq.net
>>630
Bashなら、プロセス置換(process substitution)でできるのでは。
<(echo;最初のデリミタ行までを抽出するコマンドライン)
<(echo 1;最初から次のデリミタ行までを抽出するコマンドライン)
<(echo 2;最後のデリミタ行からを抽出するコマンドライン)
としたら、先頭行が番号、それ以降がテキスト行として読み込める。
個人的には、さすがここまでのレベルならPerlとかでやったほうが。

664:デフォルトの名無しさん
20/07/31 19:26:43.51 qTuk7lt4.net
bashの#!でのオプションについて質問。
先頭行を次のようにすると、「invalid option name」エラーになります。
#!/usr/bin/bash -o pipefail
...
しかし、コマンドラインに同じように書くとエラーになりません。
/usr/bin/bash -o pipefail -c '...'
どうして?
-eならどっちも問題ないので、#!行のオプションの解釈になにか秘密があるんだろうけど。

665:デフォルトの名無しさん
20/07/31 20:01:20.64 j/9/9lyu.net
>>636
MacOSやFreeBSDだと上手くいく。
原因はLinuxのexecl()関数が
「/usr/bin/bash」と「-o pipefail」という
二つの引数を実行しているせい。
とうぜん「o pipefail」というオプションはないので,怒られる。

666:デフォルトの名無しさん
20/07/31 20:03:04.24 j/9/9lyu.net
さらに言うと,
シバンはPOSIXが「実装ごとに挙動がバラバラなんで俺はこの動作を規定しません」
って公言するくらい,各種OSごとに扱われかたが違う。
今調べられないけど,古いAIXとかだと
「!/usr/bin/bash -o pipefail」とかいうコマンドを探しにいってエラー吐いてた記憶がある。

667:デフォルトの名無しさん
20/07/31 20:39:05.80 k/mzlDiC.net
>>636
/usr/bin/bash -o pipefail ではなく
/usr/bin/bash "-o pipefail" を実行している
まあ素直に
#!/bin/bash
set -o pipefail
って書けってことだな

668:デフォルトの名無しさん
20/07/31 21:40:13 j/9/9lyu.net
もう書いたんだが…

669:デフォルトの名無しさん
20/07/31 21:44:42 qTuk7lt4.net
>>637
>>639
どうもありがとう。
要するにLinuxの不具合みたいなもんだけど、しかし「仕様」ってことか。。。

AIXかは知らないけど、シバンのトラブルはたしかに昔、Perlのドキュメントかなにかで見た気もする。
今でもあるとは。

ちなみに最終的にはこうしといた。
#!/usr/bin/bash -euC
set -o pipefail
...

670:デフォルトの名無しさん
20/07/31 21:56:20.95 k/mzlDiC.net
/usr/bin/bashにbashがあるとは限らない
というか普通無い

671:デフォルトの名無しさん
20/07/31 22:30:39.13 j/9/9lyu.net
>>642
Bashの位置に依存しない為には
#!/usr/bin/env bash
↑こうする。
しかし,envが/usr/bin/envにあるかどうかも分からない(以後無限ループ)

672:デフォルトの名無しさん
20/07/31 22:35:57.38 h2BvMEZJ.net
普通は、/bin/bash
じゃないの?

673:デフォルトの名無しさん
20/07/31 22:55:43.76 qTuk7lt4.net
>>642
ないのは見たことがない。
たとえばどんな環境?
>>644
HFSかRHELのドキュメントかなにかで、/binはシングルユーザー用、/usr/binはマルチユーザー用となってたような。
さらに環境によっては/bin→


674:/usr/binのシンボリックリンクでさえあるようなので、わりきって区別せずに/usr/binだけを使うことに決めた。



675:デフォルトの名無しさん
20/07/31 23:03:07.55 w9lTjcUH.net
$ 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

676:デフォルトの名無しさん
20/07/31 23:31:35.93 BwwodwaD.net
>>645
Linuxの場合/usr/binにbashがあるのは/bin -> /usr/binになっている環境ぐらい。それ以外はほぼ間違いなく/binにある。元々シングルユーザーモード用の/binになかったら、シングルユーザーモードでシェルが使えないでしょ。
最近は/binと/usr/binを統合する動きが進んでいるから将来はどっちでも良くなるかもしれないし、あるいは/binがなくなるかもしれないけど、今はまだ従来の環境も普通にあるから/bin/bashがいい。その為にシムリンクを張っているわけなので。
UbuntuやDebianは、今インストールすると統合されるけど、従来の環境からアップデートした場合は統合されない。
あとGentooとかは今クリーンインストールしても統合されない。

677:デフォルトの名無しさん
20/08/01 01:21:21.09 6XTg5Iao.net
>>647
シングルユーザー環境はまったく想定外なので。。。
ファイルパスをあわせても、実際の具体的な環境は把握できてないし、どうせ動作確認もしないから、きっぱりわりきることにしたのだ。
binの統合の話は、RHEL8のドキュメントで見た気がするけど、だったらもうとっととのっとこう、と思ったのもある。
うちのメインはCentOSだし、そうなってない環境を使うことになったら自分でシンボリックリンクを追加したらええんやろ、ということで。

678:デフォルトの名無しさん
20/08/01 08:14:01 6JQgXAfu.net
又聞きで悪いが,Oracleかなにかだと,/usr/bin/にはGNU系の製品が入ってなかったとか。
/export/以下にあるとかなんとか。

679:デフォルトの名無しさん
20/08/01 08:30:02.46 2HCIDb75.net
/opt/bin とかに入ってるのもあったなぁ

680:649
20/08/01 10:05:25.94 6JQgXAfu.net
>>650
あー。これで思い出した。
/opt/bin/だわ。
/export/は利用者のホームディレクトリとかがある所だわ。
Bashの場所とは関係ない話になるけど,
昔$HOME変数とか使わずに/home/***以下にあるやろって決め打ちしてたら
Solarisではまさかの/export/home/***にあるっていう罠に引っ掛かったw

681:デフォルトの名無しさん
20/08/01 13:49:06.35 U7vGE7b3.net
何十年経ってもディレクトリが分類できる未来はないんやな

682:デフォルトの名無しさん
20/08/01 17:25:34.94 WzMhf7ZH.net
>>652
OS作る時にOSの仕様として組み込んでしまうぐらいしか方法無いと思う。ちょっとでも自由があると必ずそこから崩れる。

683:デフォルトの名無しさん
20/08/01 23:28:16.58 huzWWnKB.net
10MBぐらいのテキストファイルでさ
指定したバイト目から〜バイトの範囲を取得っていうのを
やるととしたらどういう方法が一番高速だろうか?
bashismなし。外部コマンドは呼び出してもいいけど遅いな

684:デフォルトの名無しさん
20/08/02 00:54:32 hIQzyyzC.net
Perlでワンライナーが速そう。w

685:デフォルトの名無しさん
20/08/02 00:55:21 KvZo8Zjs.net
でもPerlを呼び出すコストがかかるでしょ?

686:デフォルトの名無しさん
20/08/02 03:03:58.88 hIQzyyzC.net
じゃあ、全文をPerlに書き直そう。w
いっそCで?
マジな話、ファイルを直に開いてseekできるPerlならトータル黒字なんでは。
知らんけど。

687:デフォルトの名無しさん
20/08/02 08:34:06.01 fjyVy3s+.net
dd, o


688:d, head/tail コンパイル済みのCのコードのほうが速いやろ



689:デフォルトの名無しさん
20/08/02 09:26:03.25 mglN/rTr.net
>>654
dd一択。

690:デフォルトの名無しさん
20/08/02 12:16:22.41 pZSLu0WP.net
そもそも設定が/etc/に雑に放り込まれてる時点でな
個人設定だって~/直下だったり~/.dirだったり~/.config/.dirだったりてんでバラバラだし

691:デフォルトの名無しさん
20/08/02 14:14:46.24 hIQzyyzC.net
>>658
tail|headは遅いやろ。
とくに大ファイルの前の方を抽出する場合には。
tailは後の不要な部分も全部読んでまうので、ファイルが大きいとかなり遅い。

692:デフォルトの名無しさん
20/08/02 14:18:23.50 hIQzyyzC.net
いや、head $(())|tailとすればマシなのか。
元コメのPerl起動時間さえ気にする用途にはあわんかもだけど。

693:デフォルトの名無しさん
20/08/02 15:04:27.21 mglN/rTr.net
>>662
たぶんPerlの呼出しコストにいちゃもん付けてる>>656
>>654とは別人。
あとheadやtailだと「バイト」単位では切出せない。
ところで head $(()) っていう技巧おもしろいね。初見だわ

694:デフォルトの名無しさん
20/08/02 15:44:30.48 hIQzyyzC.net
>>663
別人かもだけど、そういう気持ちは元コメから書いてあったから。。。
head/tailは、--bytesオプションがあるやろ?
算術式展開は、でもBash限定なんだっけ?
ただ、いずれにしてもddにしろheadにしろtailにしろ、スキップが読み捨てなのか直シークなのかで速度が違いそう?

695:デフォルトの名無しさん
20/08/02 19:23:27.16 mglN/rTr.net
>>664
算術展開はPOSIXで定義されてるから
最近のPOSIX準拠を謳うシェルなら必ず使える。
URLリンク(pubs.opengroup.org)

696:デフォルトの名無しさん
20/08/02 19:30:06.31 TAOBMMvc.net
>>661
ファイルの大きさを見て一番後ろを見に行くから遅いはずがない

697:デフォルトの名無しさん
20/08/02 19:39:48.99 wSiq9/7A.net
$ 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

698:デフォルトの名無しさん
20/08/02 20:02:20.24 hIQzyyzC.net
>>665
$(())は初見やったんちゃうの?w
Bash限定のマイナー機能やったか!と思ったのに。。。
# Bashしか使わんから、互換性は意識してないからなー。

699:デフォルトの名無しさん
20/08/02 20:07:58 hIQzyyzC.net
>>666
書いてることはちゃんと理解した?
パイプ前のtailが、パイプ後のheadで捨てられるところも無駄に読み込んでまうやろ?
おまけに、/dev/randomみたいなのからだと終わらないし。

700:デフォルトの名無しさん
20/08/02 20:12:02.85 hIQzyyzC.net
>>667
読み始めの位置と読み出すサイズはブロック単位限定?
互いに素だとブロック単位を1にする?
なんか遅そう?
# 元コメ者よりもうるさくしてるな。。。

701:デフォルトの名無しさん
20/08/02 20:12:54.07 mglN/rTr.net
>>668
いや,実は算術演算の中身を書かない技巧があるのかと思ったんだわ。
そしたらどうやらそういう意図のコードじゃないらしいと後で分かって,
恥かしい勘違いだったんで黙ってたw

702:デフォルトの名無しさん
20/08/02 22:39:25.35 mglN/rTr.net
>>670
素因数分解して,最適な読み出しサイズとブロック単位を決定するのおもしろそう。

703:デフォルトの名無しさん
20/08/03 07:46:56.04 U44E4Fsa.net
すみません、
出来てもやるべきでないのは分かるんですけど、
日本語でシンボリックリンク張って日本語でコマンド呼び出しってできますっけ?
$ エコー ヤッホー
ヤッホー
$



704:ンたいな。



705:デフォルトの名無しさん
20/08/03 08:04:35 mpHVQN+T.net
>>673
自分でやってみたら?

706:デフォルトの名無しさん
20/08/04 20:42:37.24 Bm48LwqI.net
できると思うけどな
環境によりけりかな?
使ってる文字コードがシフトJISみたいなやつだとダメかも知れないが、それでも大丈夫なようには作れるからなんとも言えない

707:デフォルトの名無しさん
20/08/04 21:14:57 SyQYqCbe.net
そもそもLinux/UnixはShiftJISをサポートできない
OSの設計的に不可能

("無理やり"やってるのはあるが動作保証できない)

708:デフォルトの名無しさん
20/08/04 21:57:03.67 nAqHRtEu.net
>>676
逆にWindowsって,「無理やり」じゃなくShift-JISに対応できてたん?
そっちの方が驚きなんだが。
俺には文脈不明の状態でエスケープ文字とバイト化文字の一部とを判別する
OSネイティブな方法が思い付かないw

709:デフォルトの名無しさん
20/08/04 22:20:38.92 SyQYqCbe.net
>>677
Windows NTは最初のバージョン(1994年)から
Unicode(UTF-16)対応だからね
UTF-16は文字の一部にNULL文字が入るから
当時からC言語の標準ライブラリでは扱えないことがわかっていた
マルチバイト文字は最初から対策済みなわけよ

710:デフォルトの名無しさん
20/08/04 22:51:05.57 tCUx/sk1.net
>>676
設計のどこにダメな要素が?
シェルにはあるだろうが、カーネルにあるか?
「¥0」「/」が混じるとさすがに困るだろうが、それ以外ならどうにかできるやろ。

711:デフォルトの名無しさん
20/08/04 23:01:03.79 SyQYqCbe.net
>>679
Linux/UnixはC言語で作られてる
C言語の仕様に引っ張られてる

712:デフォルトの名無しさん
20/08/04 23:02:50.20 tCUx/sk1.net
>>678
同時に、OEM文字コードとしてシフトJISを採用したのだから、できない理由になってない。
ちなみに、UTF-16を採用したのは、当時は全多言語がUCS-2を前提にしてたからやろ。
振り返ると微妙な選択だったが、当時の外人にはわからんかったのはしゃあない。

713:デフォルトの名無しさん
20/08/04 23:05:00.00 SyQYqCbe.net
>>681
Windowsは初期バージョンから多言語対応として作られてるという話

714:デフォルトの名無しさん
20/08/04 23:06:56.83 Btmoo/Kt.net
普通に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でも動く。
普通にシェルとかも問題ない。

715:デフォルトの名無しさん
20/08/04 23:09:26.33 tCUx/sk1.net
>>680
じゃあ、C言語のどこにシフトJISを拒絶する要素が?
C言語が文字コードに求めてるのは終端が「¥0」であることだけだろ。
シフトJISもその条件に反しないが。
なお、エスケープが面倒というのは、できない理由にはならないので、念のため。

716:デフォルトの名無しさん
20/08/04 23:15:26 tCUx/sk1.net
>>683
いやいや、そこまで問題なくはないやろ。w

たとえば、「ソ」「表」がパスに含まれたら、シェルそのままだと文字化けしたりするのでは。
localeはそこまで面倒見なさそう。

717:デフォルトの名無しさん
20/08/05 00:11:31.18 NEgglKp4.net
$ 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

718:デフォルトの名無しさん
20/08/05 00:11:35.72 AdI/6NZo.net
>>684
どこがってソースコードにprintf("foo\tbar");って書いてあったら
\tはタブになることぐらい知ってるやろ?

719:デフォルトの名無しさん
20/08/05 00:46:48 RWwgydsE.net
>>687
もう一回書いてあげるで?

エスケープが面倒というのは、できない理由にはならないので、念のため。

720:デフォルトの名無しさん
20/08/05 01:06:50 RWwgydsE.net
>>686
それは、lsとターミナルががんばったおかげじゃない?w
ダメなケースがあるんじゃないかと思うんだけど、みんなに期待してええんかな?

あ、シフトJIS対応についてのオレの認識は、カーネルには関係ないだろうしシェルは不可能ではないが茨の道やろなあ、くらい。

721:デフォルトの名無しさん
20/08/05 01:46:22.40 vmNTB6tp.net
行末に、ダメ文字があれば、
\ で、改行がエスケープされるとか?

722:デフォルトの名無しさん
20/08/05 03:13:28.66 AdI/6NZo.net
やれやれだなw
例えば文字を一文字ずつ見ていって
_をスペースに置き換える処理は
漢字を壊すんだよ

723:デフォルトの名無しさん
20/08/05 06:17:52.92 eDoiMqdf.net
それはやなカンジ

724:デフォルトの名無しさん
20/08/05 06:34:24 gqsMBs9q.net
bashでダメ文字列を試したら、

a)問題なし
コマンドラインでの入力編集、ヒストリー、コマンドに渡る引数、外部コマンド呼び出し、カレントディレクトリの扱い、行末の\及びダメ文字の扱い、変数の代入と使用、変数のlengthとsubstring、コマンド置換、リダイレクトのファイル名、echo及びprintf、シェル関数名 など大部分

b)一部問題あり
PS1の\wが文字化け($PWDを使うと化けない)

c)問題あり
・globで、5cを含むマルチバイト文字が2文字とカウントされる(「ソ」が?ではなく??で選ばれる。他のASCIIと被る文字は問題ない。)
・変数の置換
abc=オソソソソソソソとして、
${abc//オ/ロ}は動くけど${abc//ソ/ロ}は駄目
一方で${abc//オ/ソ}は問題ない
たしか置換前の方がglob扱いだったから、これは上のglobを直せば同時に直るかもしれない
・alias名

ちょっとした修正で全く問題なくなりそう

725:デフォルトの名無しさん
20/08/05 08:19:35.02 AdI/6NZo.net
× ちょっとした修正で全く問題なくなりそう
○ 多数のソフトを修正しなければならないから大問題

726:デフォルトの名無しさん
20/08/05 08:21:45.48 AdI/6NZo.net
SJISの問題は _ の話だけじゃないよ
ASCII文字のほぼ半分。制御文字と数字と一部の記号除いた
アルファベット文字に関する処理すべてが漢字の文字に影響する
例えばAを検索すると一部の漢字にマッチするし
Aを置換すると一部の漢字を壊す

727:デフォルトの名無しさん
20/08/05 08:46:51 AdI/6NZo.net
cat sjis.txt | tr [a-z] [A-Z] > sjis2.txt

ナニヌネノ -> オカガキギ に化ける
地震で津波が発生 -> 誰尻で津濡が発生 に化ける

728:デフォルトの名無しさん
20/08/05 09:21:26 eyNhEtAe.net
> 誰尻で津濡が発生

俺のフィンガーテクを受けたやつはみんなこうなる

729:デフォルトの名無しさん
20/08/05 09:42:07.23 EDez6Utv.net
かつてEUC対応していたこととは次元が違うん?

730:デフォルトの名無しさん
20/08/05 10:01:54.20 Mw508nfj.net
というか「WindowsのShift-JISへの対策・対応状況」と
「Linux (Unix) のShift-JISへの対策・対応状況」とでさして違いがない。
「LinuxでShift-JISに対応しようとすると多数のソフトの修正が必要」というのであれば
同じ問題がWindowsでも起きてる。
実際ダメ文字っていう概念はLinuxに限った概念じゃないからね。
むしろWindowsでShift-JISに対応しておらずダメ文字が問題になった例の方が、
人口比的なものもあるだろうけど、より有名じゃない?

731:デフォルトの名無しさん
20/08/05 10:08:58.04 RWwgydsE.net
>>695
それはOSの問題ではない。
そんな処理をしたユーザーが問題。
たとえば、英字の大文字小文字変換としてコード値に0x20を加減したら、ASCIIならうまくいくが、UTF-8 ならうまくいかない。
現実のテキスト処理をするなら、文字コードの仕様にあわせることはあたりまえ。
シフトJISなら、バイトがマルチバイト文字の上位バイトか下位バイトかいずれでもないかは当然区別して処理しないと。

732:デフォルトの名無しさん
20/08/05 10:15:34.47 AdI/6NZo.net
>>698
EUCは2バイト文字の右半分がASCII文字になることはない
>>699
ぜんぜん違う
Windows NTは内部文字コードをUTF-16で処理している
カーネルとドライバは当然のことながら、Windows APIも
ANSIバージョンであってもUTF-16に変換して処理している
そりゃアプリは当然対応しなければいけないが
OSそのものは最初から多言語対応になっている
Linux/UnixはOS自体がC言語で作られ、内部文字コードは
1バイトのASCII文字互換であることを前提で作られてる
影響範囲が大きすぎる

733:デフォルトの名無しさん
20/08/05 10:16:23.73 AdI/6NZo.net
>>700
> そんな処理をしたユーザーが問題。
そんな処理がOSのあちこちに含まれてる
例えば起動時に実行するシェルスクリプトとかな

734:デフォルトの名無しさん
20/08/05 10:19:36.65 AdI/6NZo.net
>>700
> たとえば、英字の大文字小文字変換としてコード値に0x20を加減したら、ASCIIならうまくいくが、UTF-8 ならうまくいかない。
アホなの?
UTF-8であっても「英字の大文字小文字変換」で「ASCIIの英字大文字」を渡したらうまくいく
お前が言ってるのは「英字の大文字小文字変換」で「ASCIIの英字大文字以外(例えばASCIIの数字)」を
渡したらうまくいかないと言ってるのと同じことだぞ

735:デフォルトの名無しさん
20/08/05 10:26:28.53 RWwgydsE.net
まとめ。
>>673
ファイル名に日本語を使っても?
>>675
ええんちゃう?
シフトJISはツラそうだがかんばればなんとか?
>>676
「Linux/UnixはShiftJISをサポートできない」!!!
以降
「OS」の認識がゆるそうな>>676に対する指摘。
シフトJISなLinux環境はあまり現代的じゃないし、わりとどうでもいいはずなんだけど。w

736:デフォルトの名無しさん
20/08/05 10:27:55.11 RWwgydsE.net
>>703
アホなの?
シフトJISに置き換えたらそのままだろうがよ!

737:デフォルトの名無しさん
20/08/05 10:43:41 AdI/6NZo.net
>>705
だからお前が持ち出した「英字の大文字小文字変換」という例は
UTF-8でもSJISでも共に「英字の大文字」にしか対応しておらず
「英字の大文字以外」の動作は "未定義" のコードだろ
未定義なんだからうまくいかなくても想定通りの動作だ

俺が出した tr [a-z] [A-Z] というコードは
「英字の小文字を大文字に変換し"それ以外はそのまま"」というコードなんだよ
UTF-8の文字列を渡した場合は、正しく動くが
SJISの文字列を渡した場合は、正しく動かないんだよ

SJISのために余計な処理が必要になる
Linux/UnixでSJISに対応しようとしたら
このような余計な処理がたくさん必要になるという話をしてる

738:デフォルトの名無しさん
20/08/05 10:46:33 AdI/6NZo.net
>>705
言い返したかったら

英字の大文字小文字変換としてコード値に0x20を加減するコード
かつ、それ以外の文字は変換しないコードにしてみ?

そしたらそれは、UTF-8なら正しく動作し、
SJISだと漢字を壊すコードになるから
(SJISのための処理を追加しない限り)

739:デフォルトの名無しさん
20/08/05 11:07:15 RWwgydsE.net
>>706
話が通じてないな。
そのへんは、UNIX/Linuxの問題ではない。

もう相手にしない。

740:デフォルトの名無しさん
20/08/05 11:10:30.69 OjEDy2ZO.net
>>699 >>701
XPが出始めの頃、エクスプローラでShift-JISのダメ文字が問題となって、
それに対応するパッチもあったと記憶している。

741:デフォルトの名無しさん
20/08/05 11:18:48.18 cfMvwLfN.net
>>706
言い返したかったら
英字の大文字小文字変換としてコード値に0x20を加減するコード
かつ、それ以外の文字は変換しないコードにしてみ?
これすらできないもんなお前はw
>>709
俺は記憶していない
もしそんなのがあればWindows 2000でも問題になってるはずだが?

742:デフォルトの名無しさん
20/08/05 11:19:10.36 cfMvwLfN.net
>>706じゃなくて>>708あて

743:デフォルトの名無しさん
20/08/05 12:38:59.89 Mw508nfj.net
>>709
そうそう。
それが修正されたことが「OSとしてのShift-JIS対応」


744:セと言うんなら, Linuxでも「OSとしてのShift-JIS対応」はされてる。 C言語であろうが何であろうが,ダメ文字に対処することは可能だからね。



745:デフォルトの名無しさん
20/08/05 12:42:59.18 guh8E5Hj.net
>>712
OSに関する点すべてを修正することが「OSとしてのSJIS対応」
局所的に一箇所だけ修正して、それ以外は修正されてないなら
それは「OSとしてのSJIS対応」ではない
完全対応かどうかって話をしてる

746:デフォルトの名無しさん
20/08/05 12:50:09.73 Mw508nfj.net
なんかもうあほらしくて議論する気がなくなってきたけど
WindowsのShift-JIS対応が「完全」なら,
どうしてWindows上でダメ文字対応する必要が(今だに)あるんですかね?
あ、「それはWindows上のwin32 APIで用意されているShift-JIS対応の機能を使ってないからだ!」
っていう反論はなしね。
それってあなたが「LinuxはOSとしてはヾhift-JIS対応していない」ことの理由に挙げている
「Linux上のglibcやlibiconvで用意されているShift-JIS対応の機能を使えば」っていう文脈と同じだもの。

747:デフォルトの名無しさん
20/08/05 12:53:10.21 lrr9/7h8.net
そろそろOSのスレに行ったら?
シェルスクリプト関連からなんてOSの内部なんて知らん、せいぜいAPIがOSな感じ
WindowsだってShift-JISとUnicodeとふた系統のAPIが用意され、Shift-JISのAPIを使ってたら=使われていた使われている同じ=シェルスクリプトのスレで違いを論じあってるのがおかしい

748:デフォルトの名無しさん
20/08/05 12:55:28.80 lrr9/7h8.net
>>714
アプリケーションコードレベルでなんかやってたらかな。まあやるだろうけど
OSの内部でUnicodeだからアプリケーションもUnicodeでというのは、まあやらんな、Shift-JIS APIを使ってるようなのは
シェルスクリプトで使うコマンドやシェルも同じことだな

749:デフォルトの名無しさん
20/08/05 12:57:27.49 guh8E5Hj.net
>>714
> どうしてWindows上でダメ文字対応する必要が(今だに)あるんですかね?
自分で「Windows上」って言ってるから、お前
OSの対応とOS上の対応は違うってわかっててわざと言ってるんだろ?
そいうあからさまな釣りにレスする価値ないね
でなおしてきな

750:デフォルトの名無しさん
20/08/05 13:04:26.79 lrr9/7h8.net
Shift-JISなんてLinuxなどでも今頃使わない廃れたコードに拘ってるのがおかしい
未だになんか(ちょっと)拘ってるOSがあるようだけど
どうせなら、Unicode(UTF-8)でのLinuxなどの問題を言えよw Shift-JISなんて誰も使わないのを論じるより益があるだろう、発端のも別にShift-JISと言っているわけではないようだし

751:デフォルトの名無しさん
20/08/05 13:16:42.98 guh8E5Hj.net
>>718
今はOSが対応してるかの話をしてるだけ
Windowsは内部コードがUTF-16でSJIS等はUTF-16に変換して処理される
WindowsのAPIのうち、ANSI対応のAPIがSJIS等に対応しているAPIで
このAPIの存在がまさにWindowsがSJIS等の対応しているという証明になってる
そしてOSに付属しているコマンドもしっかりSJIS等に対応してある
しかしLinux/UnixにはそういうったAPI(システムコール)が存在しない
だからOSではない部分で独自に対応しないといけない上に、
付属のコマンドは多くががSJISに対応していない

752:デフォルトの名無しさん
20/08/05 13:27:21.34 lrr9/7h8.net
>>719
Windows APIを使ったのを書いたことがないとしか思えない
Windows API には Shift-JISバージョンとUnicodeバージョンがある、Shift-JISバージョンを使っていたら内部でどうであれ同じ問題は起こり得る
同じように、Shift-JISに対応したLinuxなどではAPIで問題が起こることはないだろう、ロケールでShift-JIS設定できて問題ないんだろう実際に
何を論じてる、その違いでどう問題が起こると言っているのかさっぱりだな。てか、そんな問題は今時起こらない(UTF-8にしてるのが当たり前な)のでそんなの言っても意味ねえとしか思えんけど

753:デフォルトの名無しさん
20/08/05 13:32:00.64 guh8E5Hj.net
> Windows API には Shift-JISバージョンとUnicodeバージョンがある、
Shift-JISバージョンなどというものはない。
あるのはANSIバージョンだ。
そういう基本から、お前は理解していない。

754:デフォルトの名無しさん
20/08/05 13:32:21.13 guh8E5Hj.net
> 同じように、Shift-JISに対応したLinuxなどでは
存在しない

755:デフォルトの名無しさん
20/08/05 13:34:49 guh8E5Hj.net
Shift-JIS 対応 Linux でぐぐればでてくるだろ?

Linux の Shift JIS サポート
URLリンク(www.ossforum.jp)

> なぜ Linux で Shift JIS ロケールがサポートされない

> 現在、日本で利用されている多くの Linux ディストリビューションでも、Unicode 系の UTF-8 がデ
> フォルトとされ、Shift JIS ロケールが用意されているケースでも、利用は推奨されていない。ちなみ
> に、ユーザーのロケール設定は、Linux ターミナル画面で locale コマンドを打てば LANG=
> ja_JP.UTF8 のように表示されるので確認できる。
> Shift JIS 系ロケール(sjis、cp932、ibm943 など、Appendix 1 参照)は、次のような理由のために推
> 奨されていない;

> 1. Linuxの文字処理ライブラリ関数は、Unicode を扱うことを基本としているため、本ライブラリ
> 関数を使ってインプリメントされた Linux システムコマンドでは、ファイルデータの中の文字
> 処理や、ファイル名の処理で、Unicode は正しく扱えても、Shift JIS は扱えないことがある。

> 2. Shift JIS データの処理は、「特別」な扱いとなり、メールクライアント Thunderbird など、個々
> のミドルウェアに多大な開発負担を負わせている。

> 3. 特に、正統 Shift JIS ロケール sjis では、 0x5C=U+00A5 というマッピングのために、オープ
> ン系プログラム(C言語、Java など)の動作が保証されない。cp932 などでは問題ない。

756:デフォルトの名無しさん
20/08/05 13:37:54.50 lrr9/7h8.net
>>721
そのANSIとやらの内部でShift-JISに対応してんだがな=Shift-JISバージョン
純粋にANSIとUnicodeしかなかったら、Shift-JISを受け入れるAPIはなんなんだかな
マジでちょっとWebでちょっと見ての知ったかかよ
>>722
それが対応してんだな、対応してなかったら使えない漢字があることになるだろうに
だったらShift-JISなんてロケールできねえわな
マジ知ったかすぎ

757:デフォルトの名無しさん
20/08/05 13:42:18 guh8E5Hj.net
> そのANSIとやらの内部でShift-JISに対応してんだがな=Shift-JISバージョン

だから最初から俺が、SJISはWindows NTの内部文字コードであるUTF-16に変換しているから
WindowsはSJISに対応してると言ってるだろ。APIはOSの機能だ。

> だったらShift-JISなんてロケールできねえわな
今LinuxでSJISロケールに対応しているものは現存しない
あったら教えてくれや

昔、実験的に作られて実用的じゃなかったから
今LinuxでSJISロケールが存在ししてない。証拠の一つ。

Windowsが今も標準でSJISに対応してるのとは対象的だな


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

566日前に更新/283 KB
担当:undef