【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/
253login:Penguin
垢版 |
2020/07/09(木) 11:57:09.19ID:VUYm/kqB
bashとzshでさえ引数展開で違うところがあって困ることがある。
シェルスクリプトで頑張るをあきらめてPython使うのが無難だとは思う。
PerlもGit for Windowsに標準で付属されているので悪くない選択肢だけど、
プログラミング言語初心者に保守してもらうのを想定するならPythonかねぇ。
2020/07/09(木) 12:17:15.21ID:57QfF9jh
シェルスクリプトはshで動作するコマンドのみで書くべき、というのは大前提だが
Linuxが蔓延して、shの実体なんてどうせbashなんだからスクリプトなんてもうbash基準でいいじゃん…てなってしまったのが現実ではある
…が、zsh依存とか自前でゴチャゴチャ書くだけなら勝手にすればいいが、外に出したら叩かれるわ。悩む要素ないだろ
2020/07/09(木) 12:31:16.90ID:sqQbyxkS
>>252
シェルスクリプトは引数展開の仕様がバッチファイルよりもわかりやすい

バッチファイルで空白が入るパスを扱おうと思ったら
とんでもないコードが必要になる

>>253
Pythonに限らないがシェルスクリプト以外だと
コマンドの入力を受け取るのが大変
シェルスクリプトだとプロセスを複製して
パイプの入力と出力を並列で動かすことが出来るが
Pythonなどでは難しい

>>254
> Linuxが蔓延して、shの実体なんてどうせbashなんだから
UbuntuとDebianでLinuxのシェアの半分以上を締めてる
つまりshの実態はbashではない
256login:Penguin
垢版 |
2020/07/09(木) 12:49:35.14ID:M1UcQIHC
釣り大会でもやってんのか
2020/07/09(木) 12:51:18.49ID:HI45RHdB
先生、獲物が絶滅危惧種のようです
2020/07/09(木) 13:04:15.97ID:Za/n0UAl
ここでいうshは、Bourne Shellのことなんだろ。
bashはオープンソースな上位互換シェル
2020/07/09(木) 13:11:53.18ID:VUYm/kqB
釣りなら fish でしょ。
2020/07/09(木) 13:14:35.13ID:0y13rq6p
>>259
うまいねえ〜
2020/07/09(木) 13:21:36.52ID:Za/n0UAl
fish とは上手いけど、本当は dash だろ。
2020/07/09(木) 13:22:21.12ID:y78RNX7h
長いことzsh使ってきたけどfishの素晴らしさを知って完全に乗り換えたわ。
bashはスクリプト用にしか使わない。
2020/07/09(木) 13:48:52.67ID:6K8YgOI6
dashを知らない人がいるのかw
今どき/bin/shがbashって頭わいとんのかw
2020/07/09(木) 13:49:36.59ID:6K8YgOI6
>>258
Bourne Shellなんてもう生き残ってないよ
Solaris8?ぐらいが最後やろ
265login:Penguin
垢版 |
2020/07/09(木) 14:18:05.47ID:FBsc4kM4
dash dash dash
fish and bash
266login:Penguin
垢版 |
2020/07/09(木) 14:18:44.15ID:FBsc4kM4
そんときーおーれがー
Super Heroさ
2020/07/09(木) 14:19:19.60ID:6K8YgOI6
略してSH
H ero
268login:Penguin
垢版 |
2020/07/09(木) 15:02:10.10ID:FBsc4kM4
H x EROS
2020/07/09(木) 17:46:33.54ID:y78RNX7h
オープニングの最後に出てくるドクロみてえな奇怪な物体にいつもビビってたわ
2020/07/10(金) 00:21:32.27ID:HRVLTHUg
Linuxが蔓延して、shの実体はPOSIX準拠に近いdashになってしまったな
bashこれからどうなるの?
2020/07/10(金) 01:50:07.40ID:4LyImNtn
>>255
subprocess使え
シェルスクリプトに比べれば面倒だけど難しいと言う程ではない
2020/07/10(金) 03:23:43.67ID:NmUqS/NF
>>269
俺もミイラの頭蓋骨だと思ってたw
2020/07/10(金) 07:01:21.17ID:2zlh8yTt
シェルスクリプトの代わりは、可読性が高い、Ruby
2020/07/10(金) 08:54:29.50ID:3qY5cuD2
>>271
難しいかどうかの話はしてないよ

シェルスクリプトには「得意なこと」があって
その「得意なこと」は他の言語よりもシンプルに書ける
という事実があるってことだよ

シェルスクリプトは低機能な言語じゃなくて
特定の用途に特化した言語だってこと
その特定の用途を他の言語でやると面倒になる

だからシェルスクリプトの代わりになる言語なんて無いよ
2020/07/10(金) 15:33:12.81ID:IfTnLADh
腰を据えてやりたいときは、今はほとんどpythonだけど、
ちょっとしたことをしたいときに、いちいちモジュールのインポートをしなければならないのは面倒くさい
普段使ってるコマンドをそのまま呼び出せるのは、シェルで解釈する系のスクリプト(バッチファイル含む)のいいところ
ワンライナーの簡単なperlは、呼び出されるコマンドの一つになってる

まぁ、おそらくこのスレの住人はだいたい同じように考えてるとは思うけど
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
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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