探検


【Bash】Windows Subsystem for Linux【WSL】8

■ このスレッドは過去ログ倉庫に格納されています
2020/05/29(金) 17:58:21.78ID:N31NEDSz
ついにWSL2が登場したぜー。こりゃ完全にLinuxだ。ヒャッハー!WSL最高!開発にLinuxは使わねぇー。Windowsで開発してLinuxは動かすだけや!

WSL2アーキテクチャ
https://www.atmarkit.co.jp/ait/articles/1906/14/news019.html

WSL 2では、仮想マシン環境が起動し、bashがコマンドを受け付けるまで2秒程度という速度で起動できる。
このため、コマンドプロンプトなどからwsl.exeなどを使ってbashコマンドを処理する時間は、
現在のWSL 1とほとんど変わらない。また、本物のLinux実行環境であるため、
これまで正しく動作できなかったアプリケーション、例えばコンテナシステム(Dockerなど)や
ユーザーファイルシステム(FUSEなど)も動作させることができる。その上で、現在のWSL 1と同等の機能と使い勝手を実現するという。

WSL 2はWSL 1を置き換えずに併存する
 WSL 2が登場したからといって、WSL 1は廃止になるわけではなく、引き続き利用可能である。

ファイル共有プロトコル「9P」でWSL 1との互換性を確保
 このように、WSL 2とWin32環境の間のファイル共有は、どちらも9Pを使うことになる。
 また、WSLからWin32プログラムを起動する「Win32相互運用性」では、最初にWSL側で、
実行ファイルを判別する必要がある。具体的には、実行ファイル先頭のマジックナンバー
(Win32ではMZ)を見て、LinuxのELF64か、Win32の実行ファイルなのかを判断する。

【Bash】Windows Subsystem for Linux【WSL】7
https://mao.5ch.net/test/read.cgi/linux/1579395785/
276login:Penguin
垢版 |
2020/07/10(金) 15:52:46.98ID:juHBeHXl
>>275
同意。
適当にシェルスクリプトで作って、シェルスクリプトだと面倒な所はperlとかで。パフォーマンスとか考える必要がない場合なら十分だと思ってる。
2020/07/10(金) 16:26:39.41ID:+mRN7Lhh
バイナリー扱うんじゃなければ、awkで十分
2020/07/10(金) 16:33:46.57ID:TH1a5vMX
シェルスクリプトでしのごうとする癖を改めて、最初からPython,Perl,Rubyで書く習慣をつけたほうがいい。
2020/07/10(金) 17:46:23.11ID:MFJxS89C
>>278
何で?
280login:Penguin
垢版 |
2020/07/10(金) 17:55:31.86ID:TH1a5vMX
>>279
シェルスクリプトよりも機能追加しやすい。
シェルスクリプトよりもコンパイル言語(C、Java、C#等)に移植しやすい。
2020/07/10(金) 18:05:32.05ID:+mRN7Lhh
WSH
2020/07/10(金) 18:29:09.52ID:/zgyc019
そんなことするなら、GoとかRustの方がいいんじゃね?
2020/07/10(金) 18:47:19.69ID:3qY5cuD2
>>278
質問に答えよ

シェルスクリプトからPython,Perl,Rubyへ移植するのは簡単か否か


簡単ならシェルスクリプトで書けばいいし
難しいならなんでそんな難しいことするんだよって話になる
2020/07/10(金) 19:15:17.17ID:nsbhQHFP
>>281
JScriptで書いたものがNode.jsでそのまま(ないし少しの修正)動かせるなら、
WSHを使うのも吝かではない
2020/07/10(金) 19:32:29.58ID:MFJxS89C
シェルスクリプトは機能追加しにくいってのは意味不明だけど、何を使って実装するかは、対象によって変えるのが普通で、シェルで作った物をコンパイル言語で書き換えることになったりしないよ
2020/07/10(金) 22:38:51.18ID:Vn3GUL1J
>>280
先人の知恵を使う方が速いし楽だ。先ずはcoreutilsとsed,awkで。それでできなかったら、pythonでもjuliaでも好きなの使えばよろし
2020/07/11(土) 01:11:43.13ID:CJsJjspQ
シェルスクリプトの複雑怪奇なワンライナーとかじゃなくて
2〜3個コマンドつなげただけの単純なワンライナーでも
それを他の言語にするとバグあるんじゃねーかこれ?レベルの
テストが必要なコードになるからね

シェルスクリプトで書くと後で他の言語に書き直したくなるっていうのは
そもそも最初にシェルスクリプトを選んだのが間違いってだけ
2020/07/11(土) 17:27:01.11ID:nH0xaI8V
LLで書くまでもないと思ってシェルスクリプトで書いてもあとからやっぱりLLにしておけばよかったてのはよくある
2020/07/11(土) 17:29:06.03ID:ss8oSOoU
そういうのはそもそもシェルスクリプトで書くべきではなかっただけ
なぜ用途で使う言語を選ぶことができないのか?
2020/07/11(土) 17:38:07.09ID:k15GPxxj
つ「馬鹿の一つ覚え」
2020/07/11(土) 17:38:47.21ID:k15GPxxj
つ「一知半解」
2020/07/11(土) 17:48:25.48ID:vh5QM+xj
結局どっちで書くべきだったのかは実際書いてみないとわからない時もある
一見コマンドの組み合わせで何とかなりそうに見えたからシェルスクリプトで組んでみたものの思いの外処理が複雑でawk,sedでは辛かったり

(以前そういう処理書いてたときは複雑な部分だけpythonで書いて
シェルスクリプト内でpythonをパイプで挟んだ)
2020/07/11(土) 18:32:50.26ID:ss8oSOoU
> の思いの外処理が複雑でawk,sedでは辛かったり

?

awkは行と列単位の処理
sedは行単位の置換

変にGNUの拡張使うのがいかんのやろ
できるからやるんじゃなくて、それぞれのコマンドに適した問題を
そのコマンドでやればいいだけだよ。適してるかなんてすぐわかるじゃん。
問題が適していないとわかった時点で、別の方法を使えばいい。

それにさ、awkやsedでつらいっていうけど、それシェルスクリプトじゃないから。
awkがつらい、sedがつらい。ならあんたが言うように
awkやsedの部分だけをpythonに置き換えればいいだけ

それはawkやsedを置き換えてるのであって、シェルスクリプトを置き換えてはいない
2020/07/11(土) 18:38:28.69ID:k15GPxxj
<<を使えば良いのに
2020/07/11(土) 20:30:10.89ID:6BqHmbZe
sedが辛ければ、普通はperlを使うだろ
2020/07/11(土) 21:55:52.15ID:R/CfnAdC
素直に最初からperlで組んどけばよかったんじゃ
2020/07/11(土) 22:31:18.49ID:ss8oSOoU
つまりsedじゃなくてperlを使うという話で
シェルスクリプトとは関係ないわけだ
2020/07/11(土) 22:37:00.28ID:R/CfnAdC
perlがこの先生きのこるうえでシェルスクリプトっぽく見えるperlの言語仕様が長所になるかもね。
2020/07/11(土) 22:42:26.16ID:ss8oSOoU
Perlで foo | bar | baz と同じことをするものを作る場合どうするの?
2020/07/11(土) 22:48:27.46ID:Q8Accifd
echo HOGE | perl -pe "s/O/A/"
とやればOをAに置換できる
2020/07/11(土) 23:10:23.61ID:R/CfnAdC
>>299

単に実行するだけなら
system("foo | bar | baz");
ただしsystem()は標準出力される文字列を再利用やリダイレクトできない。

出力結果を変数$hogeに格納するなら
my $hoge = `foo | bar | baz`;


出力を一行ずつ処理したいなどの要求があるなら、素直にパイプ処理のコードを書く必要がある。
302login:Penguin
垢版 |
2020/07/11(土) 23:46:31.52ID:xOIYo2js
>>300
"文字列"ではなく"文字"の一対一の置換、及び削除は tr コマンドを使うか、Perlを使いたいのなら
s 演算子ではなく tr 演算子を使えば、(原理的に)速い。
2020/07/12(日) 00:03:51.97ID:8IVU8OYq
この板に来る奴の多くはシェルスクリプトしか(それも少しだけしか)できなくて他に選択の余地ない奴が多いだろ
2020/07/12(日) 00:05:51.50ID:7U4pPq4C
>>302
それはsedやawkじゃあかんのか?
2020/07/12(日) 00:05:55.44ID:X6+2ZbgQ
>>303
そういうやつがわざわざここに来るとは思えんけどなぁ...
2020/07/12(日) 00:17:51.66ID:s6Bmu8gK
>>304
基本的にはsedではperlで使う(といっても、もう一般的な)正規表現の記法が使えない
\w、\dあたりは使えたほうが便利
2020/07/12(日) 00:29:09.06ID:8IVU8OYq
>>305
この板に来る奴の多くは一般的なプログラムをつくらないだろ
(作るのは簡単なシェルスクリプト)
そんな奴は、Ruby、Python、Perlのような言語を学ぶなんてしない
2020/07/12(日) 00:34:27.31ID:s6Bmu8gK
簡単だからこそ、用途に応じて使い分けるということは理解できないかな?
309login:Penguin
垢版 |
2020/07/12(日) 00:34:34.83ID:5U5bHZ+6
fzf などのインクリメンタルサーチで選択した文字列をそのまま端末の出力バッファに送り込みたい場合、bash環境ではPerlが使われる。
以下に端末の出力バッファに文字列を送る例を示す。0x5412は、bash環境におけるTIOCSTIの実値。

$ perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ "echo hello\necho world\necho foobar" };'
310309
垢版 |
2020/07/12(日) 00:41:10.00ID:5U5bHZ+6
訂正。
0x5412は、Linux環境におけるTIOCSTIの実値。
311login:Penguin
垢版 |
2020/07/12(日) 02:29:56.32ID:DN64b1Du
決まった処理させるのにコマンド羅列で済むから最初はbatにするんだけど
扱う対象が増えたりで少し便利にしたいと思ったら途端に面倒になるので
Perlに組み込むなんてことは普通によくある
312login:Penguin
垢版 |
2020/07/12(日) 12:08:18.23ID:b0mOmfy0
Ubuntuの初心者ですが
皆さんはデスクトップは何を使用しているのでしょうか
良かったらお勧めのデスクトップを教えてください
2020/07/12(日) 12:12:35.50ID:lPaBZYh6
Xfce4 というか Xubuntu
インストール後 Japanese team の追加パッケージをインストール
http://ubuntulinux.jp/japanese
2020/07/12(日) 12:14:03.59ID:lPaBZYh6
書き込んでから気づいたがWSLスレだった。すまん
2020/07/12(日) 12:14:32.11ID:I0Hzl5QJ
可読性の高い、Ruby が確実。
漏れは、パッケージの更新も、Ruby スクリプトでやってる

#!/usr/bin/env ruby

# sudo のパスワードを自動入力する
puts `echo パスワード | sudo -S apt-get update`

puts `sudo apt-get upgrade -yV`
316login:Penguin
垢版 |
2020/07/12(日) 13:13:20.26ID:5U5bHZ+6
パスワードをファイルにベタ書きしたらだめでしょ。
visudo でパスワードなし実行するユーザとコマンドを設定したほうがい。
2020/07/12(日) 13:45:35.95ID:IgrSJcin
パッケージの更新とかならMakefileがお手軽じゃない?
2020/07/12(日) 14:16:56.67ID:7I/a/XJM
>>304
AWKには"文字"の置換はない("文字列"の置換はある)。Sedは内部に tr コマンドがない代わりに y コマ
ンドで"文字"の置換を行え、原理的に速いが、trコマンドやPerlの tr 演算子のように、文字の範囲指定
([0-9]で数字を構成する文字全て、等)ができないので、使い勝手で劣る。
2020/07/12(日) 15:27:21.95ID:gM0oNR+O
>>315
パスワードをそのままスクリプトに書くのがまずやばいし
そういう簡単な実行頻度の高いやつは
Ctrl+R で履歴検索からでええのでは、、
2020/07/13(月) 03:50:31.62ID:z3yut/lS
>>301
それperlからシェル呼んでるだけだろ
2020/07/13(月) 05:28:24.03ID:Mfeh6D4T
コマンドを関数と同じように使える言語があってもいいと思うんですけどね
それがシェルなんだろうけど、言語なんでインタラクティブシェル機能ははなくていいw
なぜかみんなPOSIXシェルの代替を目指す。
そんなん無理だろうに
2020/07/13(月) 07:11:54.65ID:6r2RwdRo
シェルを介さずに外部コマンド呼ぶ方法なんてperlにもpythonにも普通にあるだろ
2020/07/13(月) 07:28:25.76ID:Mfeh6D4T
シェルを介さずに外部コマンド呼ぶことはできるが
パイプのように出力側と入力側でブロックせずに並列で処理を実行できる機能がない
2020/07/13(月) 07:31:30.16ID:6r2RwdRo
>>323
>>パイプのように出力側と入力側でブロックせずに並列で処理を実行できる機能がない
どういう意味?
2020/07/13(月) 07:50:17.85ID:Mfeh6D4T
>>324
これを実行してみればわかる

for i in $(seq 100); do sleep 1; echo $i; done | grep -E "3|5|8"
2020/07/13(月) 07:53:44.80ID:6r2RwdRo
>>325
子プロセス作ればいいだけじゃん
2020/07/13(月) 10:22:54.04ID:Mfeh6D4T
>>326
子プロセスを作るだけというのなら
実際に子プロセスを作るだけで動くコードを書いてみましょう。
子プロセスを作るのは難しいという話ではないですよね?w
2020/07/13(月) 11:32:58.52ID:6r2RwdRo
素直に分からないから教えてくださいってお願いできないものかね
プロセス間通信でググってよく調べとけよ

open my $pipe, '|-', 'grep -E "3|4|5"';
for (0..100) {
sleep 1;
print $pipe "$_\n";
}
2020/07/13(月) 11:37:46.70ID:c0s7GQYU
>>328
ドザが喜びそうな言い方だな
2020/07/13(月) 11:52:55.30ID:O359orXv
>>328
バファリングされてんじゃね?
2020/07/13(月) 11:59:06.94ID:6r2RwdRo
ああ、そうだね

open my $pipe, '|-', 'grep -E "3|4|5"';
select $pipe;
$| = 1;
for (0..100) {
sleep 1;
print $pipe "$_\n";
}
2020/07/13(月) 12:13:56.54ID:SYLILHd2
Perlは並列処理とパイプの相性悪い。別スレッドのパイプハンドルをブロックしてしまう。
CPANライブラリの Parallel::ForkManager を使うとかひと工夫が必要。
なんにせよ「Perlがこの先生きのこるには」スレになりつつあるので話題を変えたほうがいい。
2020/07/13(月) 12:26:12.36ID:O359orXv
>>332
なあ
お前意味わかっていってる?
2020/07/13(月) 12:53:17.72ID:Mfeh6D4T
ほらね(笑)
このようにシェルスクリプトならバグの余地がないぐらいなのに
>>328のように長くなった上にバグを混入させている。
335login:Penguin
垢版 |
2020/07/13(月) 13:01:39.44ID:SYLILHd2
>>334
シェルスクリプトはバグをOS固有の仕様として甘受するほかないことが多いので、プログラマにできる改善の余地が少ない。
336login:Penguin
垢版 |
2020/07/13(月) 13:10:22.35ID:SYLILHd2
sleep コマンドが満足に動かないWSL版 Ubuntu 20.04 LTS に依存したシェルスクリプトを書くのは大変だろう。
結局、PerlなりPytonなりの言語で書くことになる。
2020/07/13(月) 13:21:22.33ID:Mfeh6D4T
>>336
お前バカなのか?PerlやPytonでもsleepの問題は何も解決しとらんだろ
なーんもしらん証拠
2020/07/13(月) 13:29:03.97ID:lXc1fPXa
WSL 2 使えばいいだけ
339login:Penguin
垢版 |
2020/07/13(月) 13:30:56.53ID:SYLILHd2
>>337
Perlのsleep()関数も影響受けることは、もちろん知っているよ。>>138,140 を書いたの私だし。

プラットホーム別の分岐処理を入れるとコードは複雑になる。
複雑になればなるほどシェルスクリプトで書くのがつらくなる。
2020/07/13(月) 13:39:29.96ID:6LtOc2Fx
>>316

visudo についてで、コマンドの話になってしまうのですが、
パスワードなしでsudoするための設定は以下であってますよね。
xxxxx ALL=(ALL)NOPASSWD: ALL
通常のdebian機だと上記が有効になるんですが、WSLだと
設定が有効にならず、パスワードを聞かれてしまいます。
伏せている xxxxx は whoami のユーザ名と一致しています。
環境はWSL2、debianです。
341login:Penguin
垢版 |
2020/07/13(月) 13:46:14.96ID:QD14mFiO
>>323
あっさり反論されてよっぽど悔しかったんだなw
2020/07/13(月) 13:53:59.97ID:sKerV5w0
ワロタwww
343login:Penguin
垢版 |
2020/07/13(月) 14:00:55.99ID:SYLILHd2
>>340
書き込んだ行位置を確認。上の行に書くと下の行の別の設定で上書きされる。
2020/07/13(月) 14:04:37.59ID:6LtOc2Fx
>>343

下の方に書いたら解決しました。ありがとうございました。
2020/07/14(火) 23:01:52.24ID:8CeFS5lD
ID:Mfeh6D4T
救いようのないアホだな
2020/07/15(水) 08:41:53.28ID:w6VTDgDv
WSL制限多すぎてCygwinに戻ってしまった
2020/07/15(水) 10:03:21.73ID:bieSEQXm
>>346
気になった制限ってどんなこと?
2020/07/15(水) 12:39:56.17ID:GxF6AX9F
>>347
cygwinだとuna meとするだけでCYGWIN_NT-10.0という文字から
cygwinだってことがわかるが、WSLだとuna meでLinuxだから
区別できない。una me -aとしなければ区別できない

エラーが出るからuna me にはスペース入れてる
2020/07/15(水) 12:42:32.40ID:hfkgP3hC
uname
2020/07/15(水) 12:49:12.82ID:7ZOMNuiz
うなめ
2020/07/15(水) 13:02:56.16ID:GxF6AX9F
unameがつかえないという制限は多い
2020/07/15(水) 13:09:47.04ID:0kmKI4mH
alias うなめ=うなめ -a
2020/07/15(水) 14:05:28.66ID:OH0iBf8u
alias うなめ=dd if=/dev/zero of=/dev/sda
2020/07/15(水) 14:11:07.28ID:bieSEQXm
unameでシステムが判定できない位のことがどんな問題なのか全くわからない
2020/07/15(水) 14:22:54.16ID:Bd4PyLqI
alias vim=sudo rm -rf /
alias vi=emacs
2020/07/15(水) 14:26:31.00ID:7ZOMNuiz
uname(1)がダメならuname(3)を使えばいいじゃない
2020/07/15(水) 16:31:39.68ID:hfkgP3hC
団子作るやつとプリキュアのドリンクの素みたいなのあったのに回数重ねるといつの間にかなくなってた
2020/07/15(水) 16:49:45.01ID:wP1uDQfE
WSL制限多すぎてってuname程度の話かよ
ってそもそもWSLはほぼLinuxなんだから
区別する必要もねーだろ
2020/07/15(水) 17:02:12.61ID:6VZ29KWv
やめたれw
360login:Penguin
垢版 |
2020/07/15(水) 18:49:32.00ID:K4InP199
cygwinやWSLからエクスプローラでディレクトリを開くときの変換処理とか割とある。
2020/07/15(水) 19:01:59.67ID:eva2SkBa
>>360
cygwinでも変換処理が必要なんだから
cygwinに戻す理由にはなりえませんね
2020/07/15(水) 19:10:13.97ID:icj+OFdz
>>360
cygstartとwslstartでいける
2020/07/15(水) 19:16:31.02ID:eva2SkBa
WSLわかってないくせに思い込みで語るのはやめてほしいな
WSLは機能的にはすべての面でCygwinを超えてるよ
Windows 10じゃないと使えないってことぐらいだろ
364login:Penguin
垢版 |
2020/07/15(水) 19:23:09.40ID:K4InP199
>>363
そうでもない。
Windows側からは、cygwinの実行バイナリを実行できるけど、WSLの実行バイナリを実行できないよ。
2020/07/15(水) 19:39:52.03ID:UQtSuDL+
>>363
Cygwinわかってないくせに思い込みで語るのはやめてほしいな
2020/07/15(水) 19:57:33.88ID:icj+OFdz
>>364
wslコマンド使えば実行できる
2020/07/15(水) 21:05:58.31ID:ck6wVJNQ
Windows コマンド ラインからの Linux ツールの実行
https://docs.microsoft.com/ja-jp/windows/wsl/interop#run-linux-tools-from-a-windows-command-line
2020/07/15(水) 22:07:19.28ID:ZelC3Lky
cygwinはストレージをブロックデバイスとして扱えるな
これくらい対応して欲しい
2020/07/15(水) 23:03:59.07ID:SAuketP2
とにかくWSLをディスれればそれでいい的に
引き合いに出してくるものの事もろくに理解していないような
変なのが棲み着いてるね
2020/07/15(水) 23:43:46.05ID:uAm38DrA
unameで調べないと
謎のカスタマイズされてるから互換性問題とかあるだろうし
ふつーのがそのまま動くVirtualBoxとかのほうがいいだろ
371login:Penguin
垢版 |
2020/07/16(木) 00:16:07.38ID:lFH6r/MO
そういやデーモン版のcode-serverって、WSL1で動くもんなの?
2020/07/16(木) 01:08:49.19ID:9pUuXg8/
>>364
wslコマンドで実行できてるやんw
2020/07/16(木) 05:23:32.12ID:v/LzdMO/
パン切り包丁で魚を卸そうとして、このパン切り包丁は駄目だとわざわざ言う様なものw
速やかに出刃を選べない輩が増えているんだな
2020/07/16(木) 06:38:37.13ID:OrJ2f96Z
CygwinはgnupackインクトールしてEmacsと一緒に使っていた。でも使っているとforkエラーが出るよになってrebaseとか言うのしなきゃだめで苦痛だった。WSLはそれがないだけで遥かにいい。あと断然早いし。
375login:Penguin
垢版 |
2020/07/17(金) 17:49:46.55ID:5pq6Brx1
Cライブラリのfgets(), fread() はなぜかマイクロソフトのコンパイラcl.exeで作ったバイナリよりもgccで作ったWSLバイナリのほうが速い。
■ このスレッドは過去ログ倉庫に格納されています

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