シェルスクリプト総合 その30at TECH
シェルスクリプト総合 その30 - 暇つぶし2ch1:デフォルトの名無しさん
19/07/01 23:04:27.02 /rKj5XUf.net
シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ:
シェルスクリプト総合 その29
スレリンク(tech板)

2:デフォルトの名無しさん
19/07/01 23:18:57.10 /rKj5XUf.net
お約束
・特記なき場合、Bourne Shell もしくは POSIX 準拠の sh 可換シェルが既定です
 つまりシバンは #!/bin/sh です。
 特定のシェル(bash, zsh, (m|pd)ksh, (d)ash, yash, posh, fish, (t)csh など)の専用機能に依存する場合は明示しましょう。
  macOS (10.14以前), GNU/Linux ユーザー(Debian, Ubuntu 系以外) は /bin/sh の実体が bash なので*特に*注意
   自覚なき bashism---シバンが #!/bin/sh なのに bash に依存する構文を使っていませんか?
   ただし Debian, Ubuntu などでは /bin/sh の実体は POSIX sh 互換の dash ですのであまり気にしないでも大丈夫です。
  FreeBSD ユーザーは /bin/sh の実体が ash なので注意。
  Solaris, OpenBSD ユーザーは /bin/sh の実体が ksh なので注意。
  macOS 10.15以降のユーザーは/bin/sh の実体が zsh なので注意。
  android ユーザーは /bin/sh の実体が mksh なので注意。
 csh/tcshでのシェルスクリプトは*まったく推奨しません*。
  (参考URL: URLリンク(www.speech-lab.org)
・POSIX に準拠しましょう
 有用なリンクは URLリンク(en.wikipedia.org) にまとめられています。
 最新の仕様はこちらへ: URLリンク(pubs.opengroup.org)


3:919799/   (左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます) ・Version 7 UNIX の sh(1) に一番近いのは OpenSolaris 由来の Heirloom sh、次点で Debian などに搭載されている Dash shell   Heirloom sh: http://heirloom.sourceforge.net/sh.html   Dash shell: http://gondor.apana.org.au/~herbert/dash/ ・UNIX にはシェルスクリプトに便利な小さなコマンドがいろいろあります  Man ページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。  apropos(1) ないしは man(1) の-kオプションでそれらしい単語による簡単な検索もできます。 ・ワイルドカードは正規表現ではありません。  正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆうな



4:デフォルトの名無しさん
19/07/01 23:19:51.24 /rKj5XUf.net
初心者へのアドバイス
・適した道具を判断するのも頭の重要な使い方。
 シェルスクリプトよりも Per lまたは Python の方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたら man(1) を引きましょう。
・思い通りに動かないときは、まずは sh(1) の -x オプションでトレースしましょう。
回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに「そういうのはPerl, Python使え」と回答するのはやめましょう。
 安易に Perl や Python に逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。

5:デフォルトの名無しさん
19/07/01 23:28:17.35 GotlxjDf.net
次スレ立てる時はこのリンクを追加しよう
Bourne shellの種類とか歴史とかシェルの挙動とかいろいろ詳しい
URLリンク(www.in-ulm.de)

6:(次スレテンプレコピペ用)
19/07/02 00:29:00.45 rBxHnYzF.net
お約束
・特記なき場合,Bourne ShellもしくはPOSIX準拠のsh互換(というより〝再現〟)シェルが質問・議論の前提です。
 つまりシェルスクリプトのシバンは#!/bin/shです。
 他のシェル(Bash, Zsh, Ksh, BusyBox sh, DASH, Yash, posh, fish, (t)csh)などの専用機能に依存する場合は,その旨を明示しましょう。
  macOS及びGNU/Linuxの利用者は/bin/shの実体がbashなので*特に*注意; 自覚なきbashism―シバンが#!/bin/shなのにBashに依存する構文を使っていませんか?
   ※ただしDebian, Ubuntuなどでは/bin/shの実体はPOSIX shにかなり近い(つまり独自の拡張がほとんどない)DASHですのであまり気にしないでも大丈夫です。
  FreeBSDの利用者は/bin/shの実体がashなので注意。
  Solaris及びOpenBSDの利用者は/bin/shの実体がKshなので注意。
 (t)cshでのシェルスクリプトは*まったく推奨しません*(参考: URLリンク(www.speech-lab.org))。
・POSIX (Portable Operating System Interface) に準拠しましょう。
 有用なリンクはURLリンク(en.wikipedia.org)末節などを参照。
 最新の仕様はこちらへ: URLリンク(pubs.opengroup.org)
  (左上の「Shell & Utilities」から各コマンドの仕様を閲覧できます。また,コマンドだけでなく,ファイルその他の仕様も閲覧できます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh,次点でDebianなどに搭載されているDASH。
  Heirloom sh: URLリンク(heirloom.sourceforge.net)
  Dash shell: URLリンク(gondor.apana.org.au)
・Bourne shellの種類・歴史やシェルの挙動とかいろいろ詳しいサイト: URLリンク(www.in-ulm.de)
・Unixにはシェルスクリプトに便利な小さなコマンド類がいろいろあります。
「並び換え (sort(1))」「検索 (grep(1))」等々。
 Manページや各種リンク(URLリンク(pubs.opengroup.org)など)を見ましょう。
 apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな

7:デフォルトの名無しさん
19/07/02 00:29:24.94 rBxHnYzF.net
↑一個のスレに収まるギリギリ……。

8:デフォルトの名無しさん
19/07/02 05:21:24.78 uO4UDEG+.net
なんかどうも理解してないようだから、続きのひとレス
動くかどうかの問題無いじゃないんだよ。cat 以後の cat の出力に対してのという表記に見えるのが好みじゃないってとこなんだよ。わかるかなあ?
例で cat | while でやることと、前処理と前処理の調整は別のもん。なのにってとこだよ。そこが無理してんなということだよ。わかるかなあ?まあ、わからんだろうけど
そういう「俺の好み」からはナイなということだよ。言ってもわからんだろうけど、いちおう最後にということで

9:デフォルトの名無しさん
19/07/02 05:29:38.90 Atdu9zIi.net
明確な理由がなくて、単に好みとだけ言ってたら
賛同を得られないのは当たり前。
bashはだめだよ。好みじゃないもの(笑)

10:デフォルトの名無しさん
19/07/02 05:31:07.65 Atdu9zIi.net
変数のスコープを考えろって話だ。
前処理だろうが、後処理だろうが、
変数を参照するならば、同じ階層(かそれ以下)でなければならない。
関数の外で、関数内の変数を参照しようっていうのがそもそも間違い。

11:デフォルトの名無しさん
19/07/02 05:34:16.34 Atdu9zIi.net
例えば、
hoge=0   # ← ==== ここで変数定義 ==== ・・・ (A)
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done < <(cat)
if [ hoge = 0 ]; then # ← ==== ここで使用してる ====・・・ (B)
前処理の調整
else
前処理の調整
fi

というコードの場合、少なくともAからBの間は
同一スコープ(=サブシェル ≒ 関数)内になければいけない
関数内で定義したローカル変数は、関数内でしか参照できないのと一緒。
これぐらいはすぐに理解しよう。

12:デフォルトの名無しさん
19/07/02 05:38:13.57 Atdu9zIi.net
関数の中で、前処理、後処理(前処理の調整)を
したくないっていうのなら、こうなる。
foo() {
 hoge=0
 while IFS= read -r line; do
  [ なにか ] && hoge=1
  ほかにいろいろ
 done
 [ hoge = 0 ]
}
前処理
if cat | foo; then
 前処理の調整
else
 前処理の調整
fi

これはもうシェルスクリプトがどうとかいうんじゃなくて、
個人のプログラミング技術レベルの問題
まともな設計能力があればできること
ワンライナーとかシェル芸とかばっかりやってると
こういうプログラミング能力が身につかないのかもなw

13:デフォルトの名無しさん
19/07/02 05:38:23.13 uO4UDEG+.net
別にそれでいいよ。別に俺はあなたにそう使うなとは言ってないし、bashのを使えとも言ってないけど?どう書くのかなあと聞いただけだよ、理解してお礼も言っているのにw
あなたが根本的に勘違いしているのは自分は正しい他は間違いってとこだね。賛同とかw別にあなたに賛同を求めてはいないよ?はなから。
>>9は無茶苦茶。なにかひどく後で出た巻数にすればいいに自信を持っているように見えるんだが、勝手にいろいろ妄想しすぎです
なんか異常に自分は正しいに拘るのね。わからん

14:デフォルトの名無しさん
19/07/02 05:40:12.69 rBxHnYzF.net
>>7
正直,お前の好みと可搬性だったら可搬性を優先するわ。

15:デフォルトの名無しさん
19/07/02 05:41:35.09 Atdu9zIi.net
>>12
お前なんの話してるの?
POSIX準拠だとサブシェル


16:の中で変数を書き換えられないって 言ってたから、正しいプログラミングをすれば、それは問題にならないって 実例を上げて説明したんだが? で、お礼も言わずに「俺の好みじゃない」と言ってるだけじゃん



17:デフォルトの名無しさん
19/07/02 05:41:58.38 uO4UDEG+.net
うわっ。なんか他の言語で当たり前の事をながーく書いてるねえ
他の言語と同じように書けるっぽいのがbashの方だと思うんだけどねえ
>>7で書いた通りのままだな。やっぱりわかってないようだし、コロコロ表記変わるよりは、bashのでのほうが変わらない普遍的だなというw結論で、俺は納得しておしまい

18:デフォルトの名無しさん
19/07/02 05:42:48.48 Atdu9zIi.net
>>15
中身のないレスするなよw

19:デフォルトの名無しさん
19/07/02 05:42:53.77 rBxHnYzF.net
[[ "$VAR" =~ '<regexp>' ]]

expr "$VAR" : '<regexp>'
for ((i=0;16>i;i++)) ; do
echo $i
done

i=0; while [ $i -lt 16 ]; do
echo $i
i=$((i+1)); done
ていうか >>11 あたりの「自分の好み」じゃなくて「POSIX規格」に基づいて考えを述べてくれる人に聞きたいんだけど
俺の↑この下段のシェルスクリプトって上段のシェルスクリプトと同じ動きをして,かつPOSIXに準拠してるよね。
何か問題があればツッコんで欲しい(自分では上手くいくと思っているので)。

20:デフォルトの名無しさん
19/07/02 05:42:58.59 uO4UDEG+.net
>>14
俺の最初のレスをよく読もうな。そしてお礼を言ったレスもよく読もうな

21:デフォルトの名無しさん
19/07/02 05:43:26.93 Atdu9zIi.net
やっぱりわかってない → 何がわかってないのか? → 何も言わずにまた逃げる
このパターンなんだよなw

22:デフォルトの名無しさん
19/07/02 05:43:51.62 Atdu9zIi.net
>>18
もってこいや

23:デフォルトの名無しさん
19/07/02 05:44:48.28 Atdu9zIi.net
>>17
サブシェルになると、変数が書き換えられなくて困る(?)とかいう話らしい
困らんのだがねw

24:デフォルトの名無しさん
19/07/02 05:45:16.64 uO4UDEG+.net
まあ...なんだな自分の世界で生きている人だな。そんなにレス書けているんだから読むくらいできるでしょwすげえな

25:デフォルトの名無しさん
19/07/02 05:48:48.18 p7jTc1Zw.net
bashで書いた好みのスクリプト見せてください!

26:デフォルトの名無しさん
19/07/02 05:49:21.91 uO4UDEG+.net
>>13
ちょっとショックと思ったら>>17で納得したwなんだかな

27:デフォルトの名無しさん
19/07/02 05:52:54.65 rBxHnYzF.net
あたりまえの事言われてるのにショック受けててかわいい

28:デフォルトの名無しさん
19/07/02 05:55:02.13 uO4UDEG+.net
ちょっとキモいっす。あなたにとってあたりまえでしょ>>17と勧めた人だもの

29:デフォルトの名無しさん
19/07/02 05:58:21.90 rBxHnYzF.net
>>21
なるほど……。
あんたもレスしてたけど
シェルスクリプトにおける変数のスコープってC言語やJavaScriptなんかとほぼ変わらない規則だよね。
「POSIXに準拠したシェルスクリプトは『普遍的』じゃない」っていう主張と矛盾してるよなw

30:デフォルトの名無しさん
19/07/02 06:01:36.34 Atdu9zIi.net
シェルスクリプトにはPOSIXの範囲ではグローバル変数しか無いけれど
(localやtypesetはPOSIXではない)
サブシェルまで考えると、ローカル変数として使えるんだよな。
よく考えられた言語だと思うよ。

31:デフォルトの名無しさん
19/07/02 06:03:41.58 uO4UDEG+.net
プロセスが別だからというだけだけどね。よくは考えてないだろう

32:デフォルトの名無しさん
19/07/02 06:05:53.06 rBxHnYzF.net
ID: uO4UDEG+の主張をなるべく中立的に列挙してみる。
・「自分が好きな書き方」のシェルスクリプトがある。
・それを人に強制する気はない。
↑これで合ってるよね。
ただ自分がこの人に賛同できない点は二つあって
1. 肝心の「自分が好きな書き方」の規則や具体例をほとんど挙げていない。
例えば「サブシェルをできれば使いたくない」とかそういう好みを言わずに,
人が書いたシェルスクリプトを「これは自分の好みに合わない」って言ってる。
2. 規格に準拠した書き方と「自分が好きな書き方」が同等の立場にあると思っている。
これは賛否あるかも知れないけど,好みの書き方が規格に準じてなかった場合,
大抵の人はそのプログラムを規格に準じた書き方に直すと思う。
たとえその書き方が嫌いだったとしても。

33:デフォルトの名無しさん
19/07/02 06:08:36.27 rBxHnYzF.net
>>28
Bashとかだとわざわざlocalっていう新しい予約語を用意してるけど
正直無駄っちゃ無駄よね。
POSIX準拠のシェルスクリプトでもほぼ可読性を損なわずに局所変数が定義できるから。
ところでBashの拡張機能で素晴しいと思うのは配列だね。
これはPOSIXに準じたシェルスクリプトではなかなか実現できない。
実現できたとしても大抵は複雑奇怪でデバックも地獄。

34:デフォルトの名無しさん
19/07/02 06:09:34.19 uO4UDEG+.net
forkはプロセスのコピーなので、親プロセスの変数なんぞはそのまま使える。だがしかし返すことや親プロセスの変数を変えることはできません
ってだけだね、確か
>>30
1.すでに言ってるけどなあ。最初から言えっていう?bashでのスッキリした書き方がわかっているもんだと思ったから
2.「同等の立場」とか何言っているのかわからん。どこでも誰でもPOSIXでなければならないとか言ってないでしょ?何を言っているのかわからん。bashでいいならbashを使ったそれに準じたでいいでしょね

35:デフォルトの名無しさん
19/07/02 06:10:40.06 uO4UDEG+.net
>>31
おいおいおいおい。>>27と言っておいて、それも人をそれをネタに揶揄しといて、それないないw

36:デフォルトの名無しさん
19/07/02 06:13:15.11 rBxHnYzF.net
>>33
「矛盾している」という指摘を「揶揄」と捉えてしまうような人とはお話できませんね……。

37:デフォルトの名無しさん
19/07/02 06:16:38.40 uO4UDEG+.net
>>34
その「矛盾している」という元はなんだったのか自分の書いたレスをよく読んできてね(そもそも普遍的でないは別にスコープとは無関係なことでなのに急にという)
スコープがPOSIXでは無かったら、bashでできるようなのは無駄とか言っちゃってるんですけど?ちょっと酷すぎね?w

38:デフォルトの名無しさん
19/07/02 06:19:02.38 rBxHnYzF.net
>>32
> どこでも誰でもPOSIXでなければならないとか言ってないでしょ
いや,今回に限ればそれは違う。
スレリンク(tech板:962番)
でPOSIXでの書き方を訊いた人がいて,それに関して
スレリンク(tech板:971番)
を提示すると
スレリンク(tech板:972番)
でID:uO4UDEG+が「その書き方は嫌いだ」という主張をしている。
つまりID:uO4UDEG+は少なくとも前スレ972においては
「POSIXに準じた書き方」と「自分が好きな書き方」を比較している。
たとえ無意識的だったとしても,たった2つ前のスレを読んでさえいれば
前スレ971で(俺が)提示したシェルスクリプトがPOSIX準拠を念頭に置いて書いたものだと分かる筈。

39:デフォルトの名無しさん
19/07/02 06:22:13.76 uO4UDEG+.net
>>36
いやいや。POSIXでも「同等」に書ける?と聞いているし、whileを使ったのもそれは嫌と言っているでしょ
根本的にPOSIX第一主義にあなたの思いが強すぎて読めてないよ、たぶん

40:デフォルトの名無しさん
19/07/02 06:26:43.80 Atdu9zIi.net
>>29
サブシェルはプロセスを別にする必要はないよ。
実際にkshはサブシェルだけど別プロセスにならない場合がある

41:デフォルトの名無しさん
19/07/02 06:28:53.26 uO4UDEG+.net
>>38
そういう場合は変えられるんじゃないの?でないと、わざわざメモリガードというか別メモリを用意してとかめんど臭いことしなきゃならないだろうね

42:デフォルトの名無しさん
19/07/02 06:30:42.30 Atdu9zIi.net
>>31
配列が出てくるのはシェルスクリプトのプログラミングスタイルがわかってないんだと思う。
一行一データで行指向で処理するのがシェルスクリプトだから
ツリー構造のデータにRDBMSを使うようなもん

43:デフォルトの名無しさん
19/07/02 06:32:49.73 Atdu9zIi.net
>>39
> そういう場合は変えられるんじゃないの?
主語をはっきりさせろ。誰にも伝わらん。
> わざわざメモリガードというか別メモリを用意してとかめんど臭いことしなきゃならないだろうね
だからkshは面倒くさいことをして
(特定の条件を満たす限り)サブシェルを別プロセスにしてない。
そういうことをしてOKだし、そういうことを想定してるから、
サブプロセスではなくサブシェルという別の言葉を作ってる

44:デフォルトの名無しさん
19/07/02 06:36:07.29 rBxHnYzF.net
>>40
まあ,そう言われればそうだな。
俺も,シェルスクリプト大好きですみたいな雰囲気のくせして,
シェルスクリプトで面倒な操作が要求されるような場合は
すぐにC#やPython3に浮気するからなw

45:デフォルトの名無しさん
19/07/02 06:36:08.06 uO4UDEG+.net
>>41
サブシェルが別プロセスでない場合だよ。プロセスが別かどうかの話なんだからわかるかと思ったけどなあ
ということは、同一プロセスでも変えられないのね。「ksh」はそこは「よく考えるんだな」と言えるでしょうね。なんでまたとも思うけど。古のshは別プロセスの方だろうと思うけどどうだろう

46:デフォルトの名無しさん
19/07/02 06:37:14.94 Atdu9zIi.net
>>43
だから、何を何に「変えられる」のか言えって

47:デフォルトの名無しさん
19/07/02 06:38:46.75 rBxHnYzF.net
>>37
別に俺はPOSIX第一主義でもなんでもない。
というかPOSIXに従わないという明確な方針があるならそれはそれでいいとさえ思ってる
(あまり賛同しずらいけど)。
ただし今回はPOSIXに準拠したものと「同等の」シェルスクリプトを書く話だから
俺はPOSIX規格を持ち出してきてる訳。

48:デフォルトの名無しさん
19/07/02 06:39:59.55 uO4UDEG+.net
>>44
ああ、「変数を」の方か?それも以後の文でわかってるでしょうに。まあ、いちおうすまん。なんか納得いかんから「いちおう」。だか「すまん」もあるよ
なんかめんどくさいやつだと思ってしまうぞw

49:デフォルトの名無しさん
19/07/02 06:41:23.10 rBxHnYzF.net
しっかし……なんでそう極端にしかモノを考えられないのかね。
たぶん,彼が想像する世界には「POSIX絶対!」っていう人と「Bashizm最高!」っていう人の二種類しか存在しないのかもw
だってそうじゃなきゃ(限定的に)POSIXの話をしている中に割って入って「POSIX第一主義だ」なんて言えないもん。
(というかそういう発想がまず出てこないw)

50:デフォルトの名無しさん
19/07/02 06:41:51.94 uO4UDEG+.net
>>45
そうなの?だったら単に読んでなかっただけか??
「同等」がそういう「同等」ではないと、元の人がすでに言っていたわけだったのよ

51:デフォルトの名無しさん
19/07/02 06:44:53.65 Atdu9zIi.net
POSIXシェルの範囲でできることなんだから、POSIX準拠でいいやん
これだけだろ。
POSIX準拠じゃできないことならまだしも、
POSIX準拠でできるならPOSIX準拠で作ってりゃ可搬性も有るし。
必要もないのに [[ ]] を使うやつ多すぎ

52:デフォルトの名無しさん
19/07/02 06:45:12.79 uO4UDEG+.net
>>47
「読んでなかった」とは思えんし、スコープでの豹変からそう判断せざるを得なかったなあw 他にもね
こちらからもあなたが極端と見えるんだけどねえw

53:デフォルトの名無しさん
19/07/02 06:46:27.41 uO4UDEG+.net
>>49
そゆとこだよ、あなたの悪いwとこは。やっぱり自分が正しく他の人の好みは認めんってだけやん

54:デフォルトの名無しさん
19/07/02 06:47:02.37 rBxHnYzF.net
>>48
元の人というのはID:Tm8GOmHyだよな。
この人物のその後の発言は
スレリンク(tech板:967番)
しかないのだが,ここから
「POSIXと『同等』のシェルスクリプトというのは
POSIX規格に準拠したシェルスクリプトのことではない」
という主張は俺にはどうしても読み取れんな……。

55:デフォルトの名無しさん
19/07/02 06:48:07.81 Atdu9zIi.net
>>51
そういうとこな(笑)

56:デフォルトの名無しさん
19/07/02 06:48:23.35 Atdu9zIi.net
>>51
お前のことやで。そういうとこ。

57:デフォルトの名無しさん
19/07/02 06:49:02.19 rBxHnYzF.net
>>51
「POSIX準拠でいいやん」
これを
「POSIX準拠以外は認めない」
って読み替えてしまうのヤバくない?

58:デフォルトの名無しさん
19/07/02 06:49:41.71 rBxHnYzF.net
>>53
>>54
なんで二回もレスしたしw

59:デフォルトの名無しさん
19/07/02 06:49:42.46 uO4UDEG+.net
>>52
なにを言っているのだかだよ
>while は見た目簡潔じゃないし、インクリメント忘れる可能性もある
という拒否だよ、彼の好みからの。「同等」の意味をまだわかってないねえ

60:デフォルトの名無しさん
19/07/02 06:49:55.77 Atdu9zIi.net
「POSIX準拠でいいやん」という意見を認めたくないんだろうね(笑)

61:デフォルトの名無しさん
19/07/02 06:50:40.47 rBxHnYzF.net
>>57
すいません,ここでの「『同等』の意味」を教えていただけますか。

62:デフォルトの名無しさん
19/07/02 06:50:44.84 Atdu9zIi.net
>>57
そういうとこやで、
わかってないねぇ → 何が? → 何も言わずにまた逃走
お前、自分の意見を何も言ってない。
そういうとこやで

63:デフォルトの名無しさん
19/07/02 06:53:34.64 uO4UDEG+.net
>>53-55
あなたたちとの違いは、
>必要もないのに [[ ]] を使うやつ多すぎ
とかいうのと同じようなこと言ってないよ。俺は別にあなたにPOSIXにこだわって書くなとは言ってないよ?好きにすればだよ
あなたのこの言葉はそれと同じとでも言うの?
なんであなたの好みを他人に押し付けるの?なにか意味あんのそれ?

64:デフォルトの名無しさん
19/07/02 06:55:55.49 uO4UDEG+.net
>>59
全く同じに近い同等だろう、whileでさえ拒否するあたりは
>>58,60
何を言っているのだが、一人で悦に入るねえ、たびたび
俺はあんたらにああしろとは言わない。それが意見を言ってないというならそうだろうが、まさかそう言っているわけ?

65:デフォルトの名無しさん
19/07/02 07:08:42.17 rBxHnYzF.net
>>62
あーなるほど。
Bashの独自文法で書いたシェルスクリプトと限りなく同じ見た目のものを要求してた訳か……。
うーん。これには助けにならないな。
少なくとも俺はPOSIXに準じつつかつfor (())文みたいな「見た目」のシェルスクリプトを書けない。

66:デフォルトの名無しさん
19/07/02 07:09:11.44 uO4UDEG+.net
ああ、ああしろとは言ってるな「好みを押し付けるんじゃねえ」とw

67:デフォルトの名無しさん
19/07/02 07:09:48.34 rBxHnYzF.net
>>63
sed -e 's/助けにならない/助けになれない/'

68:デフォルトの名無しさん
19/07/02 07:10:52.83 uO4UDEG+.net
>>63
ご理解いただけて嬉しい限りでございます。彼の本音とかわからんけどねw

69:デフォルトの名無しさん
19/07/02 07:14:40.86 Atdu9zIi.net
全く同じじゃないとだめとかアホだろw
同等のコードがかければ問題ない。

70:デフォルトの名無しさん
19/07/02 07:17:16.38 uO4UDEG+.net
好みを押し付けるんじゃねえ
って繰り返すだけだな、もうwアホとか馬鹿にしなきゃならないほどのあんたの心理がわからん

71:デフォルトの名無しさん
19/07/02 07:42:13.15 Atdu9zIi.net
>>63
> 少なくとも俺はPOSIXに準じつつかつfor (())文みたいな「見た目」のシェルスクリプトを書けない。
ほらよ。関数を作ってPOSIX準拠でコレが動くようにしたで。これなら満足やろ?
forloop i=0 'i < 2' i+=1; do
 forloop j=0 'j < 10' j+=2; do
  echo "$i $j"
 done
done
出力結果
0 0
0 2
0 4
0 6
0 8
1 0
1 2
1 4
1 6
1 8
forloop の実装はお昼ごろ公開(笑)

72:デフォルトの名無しさん
19/07/02 07:59:30.87 rBxHnYzF.net
>>69
おーすごい。
単に三つの引数を取って処理するだけじゃ
doやdoneキーワードをシェルが認識できないから,
そこをやりくりする必要があるな。
俺には思い付かんわw

73:デフォルトの名無しさん
19/07/02 09:02:17.46 QDdew1lC.net
まとめるとどこでも動くシェルスクリプトなんて都市伝説ってことだね。
だってめんどくさすぎるもん。
普通に書いたらその実質環境専用。

74:デフォルトの名無しさん
19/07/02 09:04:33.59 rBxHnYzF.net
そういうことにしたいのなら、そうなんでしょうね。

75:デフォルトの名無しさん
19/07/02 09:18:25.84 p7jTc1Zw.net
POSIX原理主義的にはアウトなんだろうけど
俺なら素直にseq使うな
for i in `seq 0 1`; do
 for j in `seq 0 2 9`; do
  echo "$i $j"
 done
done

76:デフォルトの名無しさん
19/07/02 09:24:30.73 TPa3Dzqe.net
仮定の話として、
bashのがPOSIX規格に入ったとして、方々の環境で使えるようになったとしても、
それを使わずに独特なあんなのを書くのだろうか?

77:デフォルトの名無しさん
19/07/02 09:38:35.04 NGgK0zPR.net
修羅の道

78:デフォルトの名無しさん
19/07/02 09:42:44.56 p7jTc1Zw.net
慣れの問題じゃないかな
人間は最初に覚えたものを正しいとする傾向があるからね

79:デフォルトの名無しさん
19/07/02 10:12:37.42 K9FUvK74.net
>>73
seqをシェルスクリプトで実装すればOK。簡単でしょ?
でもそれだとiをループ内で更新できないからだめなんだと
そんなことしねーだろうに、条件がよくわからんわw

80:デフォルトの名無しさん
19/07/02 10:27:34.91 p7jTc1Zw.net
>>77
実装があるのは知ってたw
URLリンク(github.com)
でもこれ速度的にどうなんだろね

81:デフォルトの名無しさん
19/07/02 10:33:48.48 K9FUvK74.net
>>78
例のawkプログラマのコードか
そんな無駄に実装しないでいいやん
単に数列を返す関数を作ればいいだけ

82:デフォルトの名無しさん
19/07/02 10:36:47.73 uMGeffjZ.net
bash のfor ループで、5分ぐらい掛かるものが、
awk, Perl, Ruby などでは数秒以内
dash なら、まだマシ

83:デフォルトの名無しさん
19/07/02 10:38:10.41 9kNMjoh/.net
また原理主義者が跳梁跋扈しているのか

84:デフォルトの名無しさん
19/07/02 10:38:45.33 K9FUvK74.net
× bash のfor ループで、5分ぐらい掛かるものが、
○ bash のfor ループで大量に外部プロセス呼び出ししたから5分ぐらい掛かる。俺ってなんて馬鹿だろう

85:デフォルトの名無しさん
19/07/02 13:09:34.12 +S00pq20.net
では>>69の解答(こんなコード書かないで普通にwhile使うわw)
iterator() {
 case $iterator in
  ?) eval ": \$(($3)); [ \$(($2)) = 1 ]" ;;
  *) eval ": \$(($1)); iterator=1" ;;
 esac
}
alias forloop="iterator=; while iterator"
forloop i=0 'i < 2' i+=1; do
 forloop j=0 'j < 10' j+=2; do
  echo "$i $j"
 done
done

86:デフォルトの名無しさん
19/07/02 13:10:15.61 +S00pq20.net
あ、bashの場合のコード忘れてたw
[ "${BASH_VERSION:-}" ] && shopt -s expand_aliases

87:デフォルトの名無しさん
19/07/02 13:12:43.38 NqAwj9wC.net
やっぱりどこでも動くシェルスクリプトなんて現実的じゃないね。

88:デフォルトの名無しさん
19/07/02 16:30:08.56 rBxHnYzF.net
そういうことにしたいのなら、そうなんでしょうね。

89:デフォルトの名無しさん
19/07/02 16:35:31.23 rBxHnYzF.net
>>74
そんな訳なくね?
だってBashの構文がPOSIX規格に採用されたということは
「好みの」問題でBashの構文を書いたとしてもどこでも動くシェルスクリプトが書ける訳でしょ。
俺はどーでもいいけどBashの構文を書きたい&&POSIXに準拠したい人は,
当然Bashの構文で書くようになるだろうね。

90:デフォルトの名無しさん
19/07/02 17:50:15.63 2TyYMhHV.net
いやらしい無理してのレスだな

91:デフォルトの名無しさん
19/07/02 18:50:36.28 p7jTc1Zw.net
POSIX準拠コマンドの選定基準ってあるのかね
seqのないシステムなんて見たことないんだけどな

92:デフォルトの名無しさん
19/07/02 19:14:34.05 fp/AcynX.net
URLリンク(en.wikipedia.org)(Unix)
らしい

93:デフォルトの名無しさん
19/07/02 19:40:34.32 p7jTc1Zw.net
BSD, GNU系だからってことか
でも Solaris(SYSV系)にも入ってたはずだけどな
選定基準はBSDとSYSVの共通項とる感じなのかね

94:デフォルトの名無しさん
19/07/02 20:08:50.12 fp/AcynX.net
seqは初期のUnixの頃にはいらない子だったんだなと
URLリンク(en.wikipedia.org)
コマンド初出元は方々だね、基準がわからない。お話し合いでじゃないのかな
trは不人気もありお話し合いで上がらないか却下とか

95:デフォルトの名無しさん
19/07/02 20:19:23.81 p7jTc1Zw.net
なるほどね
そろそろ改定してもいいんじゃないって思うな
今どき SCCSなんて使ってないでしょw

96:デフォルトの名無しさん
19/07/02 20:28:41.77 fp/AcynX.net
>trは不人気もあり
seqは不人気もありの間違い
なんか今でもコマンドの内容については議論しているようだけどね。コマンドの選定とかもあるかな。議論を見ると時間がかかるのが明らかだけど

97:デフォルトの名無しさん
19/07/02 21:31:39.81 rBxHnYzF.net
>>93
それな。
ていうかまず書庫作成コマンドにおけるpaxみたいに,
ネットワークを扱う中立的なコマンドを作って

98:デフォルトの名無しさん
19/07/02 23:55:56.36 rBxHnYzF.net
>>83
それってどうしても
alias使わないと無理?

99:デフォルトの名無しさん
19/07/03 00:36:59.38 1lX/P2wW.net
>>96
whileループが1回目の場合にループ変数に初期値の設定、それ以外は加算する必要がある。
だからループの1回目かそれ以外の区別する必要があるんだけど、他にいい方法が思いつかなかった。
見た目まで合わせようとするとこうなるかなと
ま、普通にwhile使えばいいんで、こんな事しないけどねw

100:デフォルトの名無しさん
19/07/03 01:05:12.87 1lX/P2wW.net
あとaliasを使えば、簡単な文法の変換を行えるわけだけど、
aliasを使わないならば、forloop i=0 'i < 2' i+=1; do とは書けずに、
while iterator i=0 'i < 2' i+=1; do のようにwhile と iterator の最低二つの単語が必要だろうね。

101:デフォルトの名無しさん
19/07/03 01:37:44.21 t0CPqQzZ.net
>>98
なるほ。ありがとう。

102:デフォルトの名無しさん
19/07/03 13:08:21.29 R/PdF9TQ.net
hoge.sh の中で bash hage.sh と実行した時に、なんでなにもしてないのに
hage.shの中ですでに環境変数などが設定されてるんだ?誰が設定してるんだ?って思ったら
BASH_ENVにファイル名を入れておくと、bash hage.sh実行時に
指定されたファイルを読み込むのか・・・

103:デフォルトの名無しさん
19/07/03 14:51:49.69 jC/WE6MC.net
> hoge.sh の中で bash hage.sh と実行
素人質問で済みません、これは無限ループにならないのでしょうか?
ならないなら、どういう仕組みで阻止されてるのでしょうか

104:デフォルトの名無しさん
19/07/03 15:22:43.46 k7t42OM8.net
無限ループに条件つけて終了させればいい
どの言語でも一緒

105:デフォルトの名無しさん
19/07/03 15:25:15.83 R/PdF9TQ.net
>>101
ハゲは一人だ

106:デフォルトの名無しさん
19/07/03 16:12:30.34 jC/WE6MC.net
あー、シェルが勝手に阻止してくれるワケではないのですね...
#! /bin/sh
echo "foo!"
bash hoge.sh
これ無限ループになりました。

107:デフォルトの名無しさん
19/07/03 18:44:48.49 sXMtau7O.net
>>103
誰も気づいていないみたいだよw

108:デフォルトの名無しさん
19/07/03 19:21:20.61 v/5AoTKN.net
hoge、fuga、piyoは認めるがhageは認めんぞ
俺が禿げているって訳じゃないぞ本当だからな

109:デフォルトの名無しさん
19/07/03 19:25:37.57 XEr4jr+a.net
うるせーハゲ

110:デフォルトの名無しさん
19/07/03 19:49:42.97 pKA2Nnt3.net
             )ソ)
          ッλ ノ(.,ノ)
         (゙- ..::.::. . (
        (ソ.  .彡⌒ミ. )ソ)
        ).::'; (´・ω・`) ス (
       ソ .::;';'(つ ⊂)::;';'`~、.
       (  :;';' |__∧_| ::;';'  ヽ)
`'~`'''`'`'`~'~~`~~'`'`''''"`'`'`''`''''"`'``'~`''`'~`'''`'`'`~
 さ あ 禿 げ 上 が っ て ま い り ま し た

111:デフォルトの名無しさん
19/07/03 21:40:00.18 ehEf7ymj.net
禿ーゲンダッツ

112:デフォルトの名無しさん
19/07/03 22:05:25.84 t0CPqQzZ.net
>>101
$SHLVL変数で判定するんじゃないの?

113:デフォルトの名無しさん
19/07/03 23:07:21.62 t0CPqQzZ.net
……と思ったらhogeとhageかよw
クッソwww紛らわしいメタ変数使うなw
普通hogeの次はfugaだろーがよ

114:デフォルトの名無しさん
19/07/04 03:34:12.16 KpaWo1Ff.net
commandって便利やな。
シェルスクリプトでオーバーライドができちゃうよ

115:デフォルトの名無しさん
19/07/04 07:10:15.99 vxwYTSOB.net
>>112
ls () {
command -p ls
}
↑こういうやつなw

116:デフォルトの名無しさん
19/07/04 09:07:36.04 BLb3ulq0.net
command て.... ググラビリティ低すぎでしょ

117:デフォルトの名無しさん
19/07/04 09:37:41.63 vxwYTSOB.net
>>114
いやもっとググビティ低いのでmanとかありますし……。
あとcatもかな?make・niceあたりも引っ掛かりにくい。
でもまあ関連語句と一緒に検索すればノイズはほぼ無くなるけどね。

118:デフォルトの名無しさん
19/07/04 10:08:16.55


119:846uO/vY.net



120:デフォルトの名無しさん
19/07/04 10:50:19.43 8CMbGrkR.net
シェルスクリプトで、実行結果にかかわらず終了コード0を先出しする書き方ってないでしょうか。
背景としては…
openvpnのServer側で、「clientが接続してきたらコマンドを実行」できるんですが、
そのコマンドの終了コードが0でないと以降の処理が進まず、接続が確立されないようなんです。
今回コマンドの目的は「SSHでclientにコマンドを送り込むスクリプト」なので、
コマンドの実行結果なんか見ないで先に接続を確立してくれないと、送り込みようがないです。
なのでopenvpn側には、スクリプトの結果にかかわらず終了コード0を先に返しておいて、
sleepを入れるなり何なりして後からSSHでコマンドを送り込みたいんですが、
/path/to/script.sh && true とか色々試してみるも、一向にスクリプト終了と見なしてもらえません。
何か方法はないでしょうか。

121:デフォルトの名無しさん
19/07/04 10:58:34.54 vxwYTSOB.net
/path/to/script.sh; true
これじゃあかんの?

122:デフォルトの名無しさん
19/07/04 11:41:34.07 97ll0bAQ.net
catとtac
lsとsl
moreとless
nanoとmicro
headとtail
こいつらみたいな言葉遊びって他にもある?
大抵は既存コマンドの改良版が対にされやすいよな

123:デフォルトの名無しさん
19/07/04 11:54:20.16 VX27EPul.net
>>117
/path/to/script.sh & true
script.shをバックグラウンドで実行でいいんじゃないの

124:デフォルトの名無しさん
19/07/04 12:16:55.68 KpaWo1Ff.net
>>117
終了コードを先出しするの意味がわからんが、
まあ中断しないようにしたいということだとして。
まず途中で中断するのは set -e されてるから
set -e されてる状態だとコマンドの終了コードが0以外だとそこで中断されてしまう。
中断されなくする一番簡単な方法は
hige ||: ・・・終了コードが0以外でも中断せず、かつ終了コードを0にする
hige &&: ・・・終了コードが0以外でも中断せず、かつ終了コードはそのまま保持する
あと、if hige; then ~ みたいに if や while の中に入れてもOK
if や while は、コマンドの終了コードを条件に処理を分岐するので
これらの中に入れても中断しなくなる。

125:デフォルトの名無しさん
19/07/04 12:22:58.60 KpaWo1Ff.net
>>117
どうでもいいけどさ、openvpnの機能で
たしか接続時にスクリプト実行する機能がなかったか?

126:デフォルトの名無しさん
19/07/04 12:29:18.19 vxwYTSOB.net
>>119
yacc→bison
cat→dog
make→kati (URLリンク(git.io))

127:117
19/07/04 14:12:34.15 8CMbGrkR.net
>>118,120
;も&もダメでした。
>>121
ちょっと理解し切れてるかわかりませんが、
;や&の代わりに||を試しても、同じ結果でした。
>>122
その接続時スクリプト実行機能で、自作スクリプトを実行しようとしているが、
自作スクリプトのexitcode 0を確認しない限り接続が確立されないので、
接続できている前提の自作スクリプトがうまく動かない、という話です。
その後、試行錯誤してうまくいったんですが、
・openvpnの接続時スクリプト1は、別のスクリプト2を&付きで実行してすぐexit 0で終了
・別のスクリプトにやりたい処理を記述、終わったらexit 0
こういう方法でした。

128:デフォルトの名無しさん
19/07/04 14:21:40.05 vxwYTSOB.net
今さらだけどPOSIXでpushdとかって「未定義」なんだな。
つまりこれらの字句が来たとき、pushdコマンドが実行されるかもしれないと想定しなきゃいけない。

129:デフォルトの名無しさん
19/07/04 14:44:38.64 VFVr1rb1.net
>>124
これは?
/path/to/script.sh ; exit 0

130:デフォルトの名無しさん
19/07/04 18:16:12.18 KBMDzr/H.net
俺には >>120>>124 でうまくいった方法が同じに思えるのだが何が違ったのだろう...

131:デフォルトの名無しさん
19/07/04 18:44:40.09 Nr3czBjG.net
>>119
more most
nano pico
perl ruby

132:117
19/07/04 18:54:04.40 8CMbGrkR.net
>>126
明日試してみます
>>127
そもそもopenvpn側の判定条件がはっきりしてないので、
シェルスクリプト的には皆さんに教えてもらったのが正解でも
openvpn的にダメってだけかもしれません。
シェルスクリプト的にokならそれでokじゃないはずがない、とは思うんですが。

133:デフォルトの名無しさん
19/07/04 19:05:50.51 zzPJIhEP.net
>>129
openvpnの
--client-connect

--route-up
を使えばいい気がする

134:デフォルトの名無しさん
19/07/04 19:30:11.56 gP3HGmG/.net
>>125
もとはcshの機能だからPOSIX策定時は独自拡張だったんだろうな
POSIX準拠のシェルスクリプトではpushd,popd,dirsは使わない

135:デフォルトの名無しさん
19/07/04 19:39:31.79 VX27EPul.net
>>129
スクリプトではなく純粋にコマンドの実行=単に実行ファイルの実行とか
引数の解釈分解もopenvpnでやってるとかかな?であれば、
/bin/sh -c '/path/to/script.sh & true'
とかなんとか。書き方も違うかもしれない(' が必要なのか可能なのか、もしかしたらできないとか)

136:デフォルトの名無しさん
19/07/05 06:22:27.69 CMdnJVDV.net
POSIXユーティリティにネットワーク関連のコマンドが追加される予定ってあるの?

137:デフォルトの名無しさん
19/07/05 10:21:41.11 CMdnJVDV.net
>>128
perlはもともとどういう意味だったんだろうな。

138:デフォルトの名無しさん
19/07/05 10:39:53.85 7D1ht1Ch.net
teeの無理矢理感すき

139:デフォルトの名無しさん
19/07/05 10:46:54.44 /9SntML6.net
>>134
確か pearl って言語が既にあったので perl にしたんだったと思った。

140:デフォルトの名無しさん
19/07/06 03:00:27.30 d8QKOOo3.net
>>135
そういういえばteeのパイプ版のpeeというのもあった。

141:デフォルトの名無しさん
19/07/06 04:11:43.20 O76mcSig.net
きたねぇな

142:デフォルトの名無しさん
19/07/06 04:28:48.13 Db2rLmY3.net
pooとかもあるな
>>140
それはpooh

143:デフォルトの名無しさん
19/07/06 05:18:54.35 d8QKOOo3.net
>>139
それは「pooコマンド」があるってこと?
検索してもネットミームしか引っ掛からんw

144:デフォルトの名無しさん
19/07/06 10:11:41.54 q0MZeBYW.net
URLリンク(codeday.me)
おしっこw

145:デフォルトの名無しさん
19/07/06 10:27:36.00 Qorx3cLN.net
comedyday

146:デフォルトの名無しさん
19/07/06 14:22:39.80 B/itK7pP.net
pingは潜水艦のソナー音

147:デフォルトの名無しさん
19/07/06 16:53:09.35 p445ST1A.net
sosコマンドとかないのかな。

148:デフォルトの名無しさん
19/07/08 08:11:26.31 OnOhhClA.net
tarが入ってない環境なんてあるのかな?

149:デフォルトの名無しさん
19/07/08 08:54:13.07 ny4rr8vT.net
paxコマンド使って、どうぞ

150:デフォルトの名無しさん
19/07/08 08:56:35.94 uRBHZP6h.net
♪IN TERRA PAX~

151:デフォルトの名無しさん
19/07/08 16:03:08.50 u+KjwOdz.net
>>144
sosreport ならある

152:デフォルトの名無しさん
19/07/09 00:44:32.67 hKj+lpg6.net
sexという天文学用のコマンドがある事実
下ネタ満載のmanもあるらしいが

153:デフォルトの名無しさん
19/07/09 08:05:36.87 DRnRn6EV.net
>>149
man woman
とか面白いぞ

154:デフォルトの名無しさん
19/07/09 08:31:28.67 chrBBqpb.net
s式の expression という意味で lisp では
sexp というワードが使われる時が sex ちらつく
シェルスクリプトじゃなくてごめん

155:デフォルトの名無しさん
19/07/09 10:07:15.07 DRnRn6EV.net
$ man co
URLリンク(kazmax.zpp.jp)

156:デフォルトの名無しさん
19/07/10 13:17:47.35 AgLkizrd.net
セマンティックバージョニングの並びで最新のタグを取得するにはどうすればいいの?
sort -Vはposixにはないようなんでなしで。
gitコマンドで(最後に付けたタグではなく)最新のタグが取得できればそれでも良いんだけど

157:デフォルトの名無しさん
19/07/10 13:29:47.61 eZpAq1ko.net
>>153
試してないけどsortの区切りオプションを“.”にして
各桁を数字順に並び換えたら上手いこといきそう。

158:デフォルトの名無しさん
19/07/10 13:46:00.77 AgLkizrd.net
1桁目を並び替えて、それから2桁を並び替えて、それから3桁目を並び替えるってできるんかいな?
できたとしても、1.0.0 よりも 1.0.0-alpha は小さくなって、
1.0.0-alpha と 1.0.0-beta はASCII順で後者のほうが後で、
1.0.0-alpha と 1.0.0-alpha+20190710 は順番が同じなんていうルールが有るわけだけど

159:デフォルトの名無しさん
19/07/10 15:06:48.80 StxWbt+s.net
できたとしても以後がえぐい

160:デフォルトの名無しさん
19/07/10 16:09:18.81 eZpAq1ko.net
素直にsort -V使うのが一番。
POSIXに準拠したければそれなりの実力がないとね。
少なくとも俺には無理w ていうかわざわざ既にある機能を苦労して再発明したくねーw

161:デフォルトの名無しさん
19/07/10 16:15:38.61 6IY0QwqQ.net
つまりどこでも動くシェルスクリプトなんて都市伝説だよね。

162:デフォルトの名無しさん
19/07/10 17:49:00.07 lDiVjXP/.net
世界征服して一つのシェルしか使わないように全世界の人間に強制すれば可能

163:デフォルトの名無しさん
19/07/10 18:31:37.23 8OTK1K8V.net
シェルだけ統一しても無理だな

164:デフォルトの名無しさん
19/07/10 19:54:16.62 eZpAq1ko.net
シェルスクリプトは「完全に」どこでも動くとは限らないけど
他の言語と比べて「ある程度」どこでも動く確率が高い。

165:デフォルトの名無しさん
19/07/10 20:10:25.56 8OTK1K8V.net
確率を言うならデータもってこいよ
どこにあるんだよその統計はw

166:デフォルトの名無しさん
19/07/10 20:36:18.03 j+J/37U2.net
まだやってる。堂々巡りを。四国へ行け

167:デフォルトの名無しさん
19/07/10 20:37:15.39 StxWbt+s.net
それいわれたのC があって perl ができる前の常識でしょ
C よりは確かに移植性ある

168:デフォルトの名無しさん
19/07/10 20:59:14.35 lDiVjXP/.net
Windowsには最初からは入ってないよね?今のは入ってる?
まあ WSL 動かしちゃえば何でもありにはなるが。

169:デフォルトの名無しさん
19/07/10 20:59:47.00 mGyL/3Gj.net
そんなに難しい話じゃなくてshは多くの環境にインストールされてるってだけのことでしょ?
例えばPerlが初期インストールされてるような環境なら
必ずshもインストールされてる。
Perlが入って無くても、shはインストールされてる。

170:デフォルトの名無しさん
19/07/10 21:01:25.84 mGyL/3Gj.net
>>165
Windowsにはshが入ってないけど、
PerlやRubyも入ってない。
shが入ってないならば、○○も入ってないが成り立つ。

171:デフォルトの名無しさん
19/07/10 21:13:36.75 mGyL/3Gj.net
結局の所Windowsとそれ以外のOSに分かれるわけで、
Windowsとそれ以外のOSの両方に入ってる言語はなくて、
Windows以外のOSに入ってる言語で一番多いのはshなんだよね。

172:デフォルトの名無しさん
19/07/10 21:16:39.60 mGyL/3Gj.net
dockerとか使うとわかるけど、最小イメージのalpineには
perもrubyもpythonも入ってないからな

173:デフォルトの名無しさん
19/07/10 21:19:19.80 mGyL/3Gj.net
そういやalpineにはbashですら入ってないのな

174:デフォルトの名無しさん
19/07/10 21:23:57.90 6IdsJob5.net
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

175:デフォルトの名無しさん
19/07/10 23:46:47.18 8OTK1K8V.net
要はPOSIXは必要最低限の機能しか規格化していないから出来ることには限界があるってことだ

176:デフォルトの名無しさん
19/07/11 04:18:38.14 pY8YHtW/.net
>>168
そうそう。こういうことなんだよ。

177:デフォルトの名無しさん
19/07/11 09:51:44.08 5BkhO8Tf.net
独自にcmdやpowershell持ってるしな

178:デフォルトの名無しさん
19/07/11 10:49:49.47 7babKKNu.net
Windowsにはshが入ってない!
→ かといってじゃあ他の言語が入っているかというと入ってない
Windowsは諦めた。それ以外で最初からOSに入っていてどこでも使える言語はなんだ?
→ sh

179:デフォルトの名無しさん
19/07/11 11:30:36.51 EFuj/0Xm.net
どこでも動くシェルスクリプトって都市伝説だよねw

180:デフォルトの名無しさん
19/07/11 11:35:07.95 nlZoRVuP.net
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

181:デフォルトの名無しさん
19/07/11 11:39:41.84 bvWe7WiP.net
Javaなら一度書けばどこでも動くのに

182:デフォルトの名無しさん
19/07/11 11:54:59.97 PMWvbDa1.net
まじで?
買ってきたばかりの ノートブック windows でも?

183:デフォルトの名無しさん
19/07/11 12:03:46.60 oBmxbhd/.net
買ってきたばかりの ノートブック windows でも
Perlなら動く!→動きません(笑)
Rubyなら? Pythonなら? C言語なら? NO!!!!

184:デフォルトの名無しさん
19/07/11 12:05:03.00 PMWvbDa1.net
それでも Java なら動く?

185:デフォルトの名無しさん
19/07/11 12:28:30.89 pY8YHtW/.net
PowerShellなら動きます(白目)

186:デフォルトの名無しさん
19/07/11 12:29:45.46 W9yQmyPF.net
Windowsに最初から入ってるのは vbs とか js とか、あとバッチファイルとかパワーシェルかな。よく知らんけど。
HTAってのもあったっけ。

187:デフォルトの名無しさん
19/07/11 12:34:10.09 CgGarxi7.net
powershell考えた奴は頭おかしいんじゃね
なんでいちいちコマンドとかあんな長いんだよ
無能にもほどがある

188:デフォルトの名無しさん
19/07/11 12:50:53.46 At9Pc1xn.net
adduserとuseraddどっちがどっちかたまに使うとき毎回調べるみたいなクソ下らないことしたくないからじゃない?

189:デフォルトの名無しさん
19/07/11 12:57:39.35 oBmxbhd/.net
それをいうなら、Windows、Macで、どの言語でも構わないが
ユーザーを追加する方法を調べないでわかるっていうの?

190:デフォルトの名無しさん
19/07/11 12:58:48.61 l57S3jiM.net
POSIXってUNIX系OSの規格なのに
なんでWindowsの話になってんだよw

191:デフォルトの名無しさん
19/07/11 13:00:17.64 A1tpN7ls.net
>>181
インストールしないで動くのか?

192:デフォルトの名無しさん
19/07/11 13:01:52.25 PMWvbDa1.net
>>188
>Javaなら一度書けばどこでも動くのに
とあったから
Windows は標準でいれてるのかなと

193:デフォルトの名無しさん
19/07/11 13:23:31.79 W9yQmyPF.net
>>189
入れたかったんだけどね・・・

194:デフォルトの名無しさん
19/07/11 14:01:00.83 l57S3jiM.net
Javaはオワコン

195:デフォルトの名無しさん
19/07/11 14:06:11.17 oQkLsXMb.net
javaのコンセプト
write ones, test everywhere

196:デフォルトの名無しさん
19/07/11 14:16:47.27 5J3UX5Vb.net
debug anywhereやろ

197:デフォルトの名無しさん
19/07/11 14:20:46.71 xCkJ5LaR.net
Windows, WSL, Ubuntu16.04 では、Python, Perl は最初から入っている。
Ruby は、apt でインストールした
ls -l /usr/bin/python
/usr/bin/python -> python2.7
ls -l /usr/bin/python3
/usr/bin/python3 -> python3.5
ls -l /usr/bin/perl
/usr/bin/perl
ls -l /usr/bin/ruby
/usr/bin/ruby -> ruby2.3
注意。サーバーエラーになるので、全角に変換した

198:デフォルトの名無しさん
19/07/11 14:59:54.89 3GvBtncU.net
そういえば IBM の z/OS ではどうなっているんだろうと
思ったら z/OS シェルってのがデフォルトでインストール
されてて、こいつは POSIX compliant らしい

199:デフォルトの名無しさん
19/07/11 15:48:04.71 PMWvbDa1.net
それだ WSL が標準で最初から入っているようになると
昔のニュースで見たが、どうなっているの?
標準は取りやめ? Windows の最新情報追ってないからわからない

200:194
19/07/11 16:19:18.53 xCkJ5LaR.net
Windows10 を普通にアップデートしていれば、WSL は、最初から入っている。
ストアから、Ubuntu18.04 (長期サポート版)などをインストールして、日本語化すればよい
漏れはまだ、古いUbuntu16.04 の方を使っているけど

201:デフォルトの名無しさん
19/07/11 18:15:20.64 8iBC56G3.net
>>184
あれは、普段使いのCUIではないからな
単なる開発用

202:デフォルトの名無しさん
19/07/11 18:16:22.72 8iBC56G3.net
>>189
XPは標準で入ってて問題になった

203:デフォルトの名無しさん
19/07/11 18:29:01.43 8iBC56G3.net
個人的には、*nixとWindowsの違いは、
シェルと馴染んだコマンド群の有無、シェルスクリプトの実行可否だけなので、
それさえできれば、どちらでもいいや。
Cygwinはややストレス溜まったけど、WSLはだいぶ快適になった。

204:デフォルトの名無しさん
19/07/12 00:13:06.93 Iwx9PgjW.net
cmdのオプションが/なのは当て付けなんだろうか
XENIXを売ってた頃のMS知らんけど

205:デフォルトの名無しさん
19/07/12 00:38:52.25 hw+u6C0G.net
階層がないファイルシステムだと - でも / でもどっちでも違和感が無いのだろう
単に好みでそれにしたってだけじゃないかな
階層があるようになって / を好みで選んで失敗したと思ったけどどうにもならななかったよう
手立ては用意したがサードパーティがそれを使わないとか

206:デフォルトの名無しさん
19/07/12 00:54:25.43 hw+u6C0G.net
ああ、どうにもならなかったのは、
オプションを/にしてしまったからとりあえずパス区切りはバックスラッシュにしたよ、でも、/ にもできるよ
だった。オプションを - に変えるのは今でも前のいつでもできるだろうな
コマンドによっては別の意味を持たせてとかありそうだが、なんの拘りなんだかよくわからんな

207:デフォルトの名無しさん
19/07/12 08:37:34.85 paORMduQ.net
URLリンク(packages.debian.org)
kshはずっと93uだったはずだが、2020なんてのがでるのか?

208:デフォルトの名無しさん
19/07/12 10:59:03.44 paORMduQ.net
同じPCで一つがWSL1上のUbuntu、もう一つがDocker上のUbuntuで
lsb_release -aしてどちらも同じUbuntu 18.04.2 LTSなのに
kshのシェルに入ってから以下のコマンドを実行すると違いがある
echo $((99999999999999999))
=> 100000000000000000 # WSL
=> 99999999999999999 # Docker
KSV_VERSIONは両方とも同じ Version AJM 93u+ 2012-08-01
カーネル関係なさそうなのに、なんでだろう?

209:デフォルトの名無しさん
19/07/12 11:04:55.32 OtxPhCkg.net
大きな数の取り扱いの限界が違うのかも

210:デフォルトの名無しさん
19/07/12 12:04:33.46 uJ9G3Ton.net
ディレクトリごとの正確なファイル数が高速に知りたいです。

211:デフォルトの名無しさん
19/07/12 12:15:53.93 OtxPhCkg.net
ls より find が早い
再帰ディレクトリ探索とファイル名出力はそれに任せて
その出力をパイプで変換していったらいいんじゃないか?

212:デフォルトの名無しさん
19/07/12 12:22:05.68 gCudY7G9.net
なぜduでファイル数も調べられるようにしなかったのか?

213:デフォルトの名無しさん
19/07/12 12:22:27.56 gCudY7G9.net
duの作者に問い詰めたい

214:デフォルトの名無しさん
19/07/12 12:24:06.88 OtxPhCkg.net
やるべきことは最小限の1つ
UNIXの哲学でしょ
小さいから早い
小さいからパイプでつなげていろいろ実現できる
小さいから保守できる

215:デフォルトの名無しさん
19/07/12 12:27:18.37 gCudY7G9.net
その理屈だと、lsコマンドはファイルの名前だけじゃなくて
ファイルサイズまで表示している。
最小限になってない。findコマンドを見習え
って話になるんだがw

216:デフォルトの名無しさん
19/07/12 12:28:12.53 gpn1wbN7.net
>>209
ファイルを数えるのはduの仕事じゃないから

217:デフォルトの名無しさん
19/07/12 12:30:19.18 gCudY7G9.net
ファイルを数えるのは誰の仕事?
仕事は一番うまくできる人がするべきですよ

218:デフォルトの名無しさん
19/07/12 12:32:27.12 gCudY7G9.net
そういやファイル名に改行が含まれる場合、
POSIX準拠コマンド&オプションだけで数えられるの?

219:デフォルトの名無しさん
19/07/12 12:35:41.89 gCudY7G9.net
やるべきことは最小限っていったら
duコマンドなんていらんよな
findでファイル検索して、lsでファイルの情報出して
awkで加算すれば良い
パイプでつなげていろいろ実現できる

220:デフォルトの名無しさん
19/07/12 12:53:26.46 433S/V3Z.net
>>205
>>206
long doubleを使っているんだと思う。long doubleは昔のx87 fpuで計算されることになるが、これは精度を設定できて、確かデフォルトがlinuxでは80bit、windowsでは64bitになっていたと思う。

221:デフォルトの名無しさん
19/07/12 13:00:19.57 WQ2UtQMj.net
>>217
でもWSL版Ubuntuと通常のUbuntuでバイナリは同じはずでしょ?
FPUモードの設定とかあるってこと?
同じ命令でもモードによって精度が違うとか

222:デフォルトの名無しさん
19/07/12 13:39:06.41 uwyqXnfJ.net
元々、浮動小数点は誤差があるから、どっちでも良い
誤差無しなら、プログラミング言語で、Decimal などのライブラリを使わないといけない

223:デフォルトの名無しさん
19/07/12 13:49:24.26 OtxPhCkg.net
>>212
ls 凄いよね
呼びだした端末の表示限界まで調査して
整列してくれる
最小限だけではものたりないから Emacs とかできたんじゃない?

224:デフォルトの名無しさん
19/07/12 13:57:13.80 q8HbeEfz.net
>>207
$ find 〈対象ディレクトリ〉 -type f | wc -l

225:デフォルトの名無しさん
19/07/12 13:59:45.00 q8HbeEfz.net
bcコマンド使いなよ。POSIXで定められたほとんど唯一といっていい任意精度演算ができるコマンドだぜ。
残念ながらなぜかUbuntuには初期状態で入っていない……。

226:デフォルトの名無しさん
19/07/12 14:11:11.28 OtxPhCkg.net
>>207
find ~/web -type f | perl -pe 's{[^/]+$}{\n}m'|uniq -c
27 /home/web/
11 /home/web/elona/
5 /home/web/elona/.git/
9 /home/web/elona/.git/hooks/
1 /home/web/elona/.git/info/
...

227:デフォルトの名無しさん
19/07/12 14:17:11.58 OtxPhCkg.net
やっぱりシェルスクリプトのパイプやばい
たった1行の短いのでそこそこ早いのが書きあがっちゃう

228:デフォルトの名無しさん
19/07/12 17:35:59.38 greuAEFm.net
>>220
emacsは出自がUnixじゃないから

229:デフォルトの名無しさん
19/07/12 18:42:09.14 q8HbeEfz.net
ちなみにPlan 9(Unixの後釜)のlsはもっと洗練された体系になってる。
あとPlan 9のEmacsの手引書がおもしろい

230:デフォルトの名無しさん
19/07/12 19:16:50.62 13weq3zY.net
Plan 9の今後のプランは!?

231:デフォルトの名無しさん
19/07/12 19:39:49.25 gpn1wbN7.net
Plan 9も最初からGPLで公開していればLinuxと肩を並べてたかもね

232:デフォルトの名無しさん
19/07/12 20:39:39.59 fylm51D9.net
>>218
FPU制御レジスタをFLDCW命令で変更すると計算精度や丸め方向が設定でき、同じ命令でも動作が変わる
プログラムが明示的に設定しなければ、当然OSが設定した値になる

233:デフォルトの名無しさん
19/07/13 10:28:41.44 H4ToI7wx.net
>>223
こういうの見るといつも思うんだけど、全部Perl(など)で全部完結して書くのとどっちがいいのかな?
殊に「高速で」条件があるなら。

234:デフォルトの名無しさん
19/07/13 10:36:29.63 006l8Xk5.net
>>230
パイプ有利でしょ
なぜなら perl は C の 10% 程の速度
シェルスクリプトの基本ツールは C で書かれているから早い
そしてパイプは並列プログラミングだ

235:デフォルトの名無しさん
19/07/13 10:51:01.49 Q8eoyE6C.net
並列「プログラミング」ではないな
単に仕組みとしてプロセスが同時並行しているだけで

236:デフォルトの名無しさん
19/07/13 13:12:58.10 PcwCdG6p.net
>>230
どうでもいいけど
>>223は基本的なコマンドで完結してるシェルスクリプトなので
Perlで「全部完結する」というのは対比する表現としてはちょっとおかしく思えるな

237:デフォルトの名無しさん
19/07/13 14:39:07.51 4CNtNVmB.net
単機能のコマンドを組み合わせて処理するのがシェルスクリプトだからな
それで速度が遅いだの言うならシェルスクリプトなんか使わなければいい

238:デフォルトの名無しさん
19/07/13 16:01:43.14 Lat3oh38.net
>>223
uniq -cの前にsortしなくていいの?

239:デフォルトの名無しさん
19/07/13 16:32:06.44 006l8Xk5.net
>>235
別のところで動かしたらだめだったよ
sort 必要

240:デフォルトの名無しさん
19/07/13 16:34:17.14 006l8Xk5.net
ソートはたぶん早くないから
つまりコストが高いから
たぶん定番のあれやったほうがいい
1行ずつ読みこんだそれでハッシュ作って インクリメントしてくあれ

241:デフォルトの名無しさん
19/07/13 18:44:37.37 Wy302ne8.net
実はPOSIX sortならsort -uでuniq | sortと同等ことができるのでuniqは実質要らない子

242:デフォルトの名無しさん
19/07/13 19:00:08.87 Q8eoyE6C.net
uniqは重複したのを抽出する目的での利用が多いな
純粋にuniqで使う機会の方が極端に少ない

243:デフォルトの名無しさん
19/07/13 19:23:10.38 56OavmE8.net
uniq | sortって使い方分かってない奴かよw
uniqくらいソース読んでみなよ

244:デフォルトの名無しさん
19/07/13 19:38:16.75 Wy302ne8.net
>>240
そんな揚げ足取らんでも。。。
sort | uniqの間違いです。

245:デフォルトの名無しさん
19/07/13 20:35:19.67 yaak8A3v.net
ls .-lのrwxに8進数表記も追加できないかな

246:デフォルトの名無しさん
19/07/13 22:25:11.39 h6vp2MpA.net
こんな感じかな
URLリンク(wandbox.org)
# スクリプトを直接書いて投稿すると 403 エラーになるな…

247:デフォルトの名無しさん
19/07/13 22:28:56.59 h6vp2MpA.net
あ、setuid/setgid/sticky bit のこと忘れてたわ

248:デフォルトの名無しさん
19/07/13 22:47:31.71 YCgasS9+.net
find ~TEST -type f -printf "%h\n" |sort |uniq -c
これは早いわ

249:デフォルトの名無しさん
19/07/13 23:30:54.16 yaak8A3v.net
duのファイル版は俺も作ったけど未熟なんでこんな出来に
find ./ -type d -printf "%p " -exec bash -c 'ls -b "{}" | wc -l' \; | sed -r 's/(.* )(\w+)/\2\t\1/g'

250:デフォルトの名無しさん
19/07/13 23:43:20.86 PcwCdG6p.net
>>246
見易くていいね!

251:デフォルトの名無しさん
19/07/14 00:22:33.01 KitiOp9Q.net
>>244
URLリンク(stackoverflow.com)
awkで頑張れば4桁表示できるらしい

252:デフォルトの名無しさん
19/07/14 02:01:57.73 ygf6VvPi.net
>>207
Ruby の、1-liner で、特定のディレクトリ以下を再帰的にたどりながら(find)、
ディレクトリ以外(reject)を表示する。
%Q("~") は、" を、Windows のPowerShell に解釈させないために、クォートする
-r で、pathname モジュールを読み込む
ただし、途中で改行しているけど、実際には改行しないで下さい!
ruby -rpathname -e 'Pathname( %Q("C:/Users/Owner/Documents/Ruby/test") ).find
{ |path| if File.directory?( path ) then; puts path, path.children.reject( &:directory? ).length end; }'


253: 出力 C:/Users/Owner/Documents/Ruby/test 11 C:/Users/Owner/Documents/Ruby/test/a 4 C:/Users/Owner/Documents/Ruby/test/a/b 0



254:デフォルトの名無しさん
19/07/14 06:45:35.11 GSQZGuhE.net
stat -c '%A %U %G %z %n' .*
↑こういうのどう? lsのパーミッション表示を8進数に



255:ワあPOSIXに規定されてないけど



256:デフォルトの名無しさん
19/07/14 10:08:35.55 niuQOGKU.net
>>245
sort を差し替えた
~/ 対象にしたら倍速
find ~/ -type f -printf "%h\n" | perl -ne '$dirs{$_} += 1; END{for $key (keys %dirs) {printf "%5s %s", $dirs{$key}, $key } }'

257:デフォルトの名無しさん
19/07/14 10:11:35.12 niuQOGKU.net
途中だった
最後に | sort -k 2,2 入れても入れなくてもあまり変わらない
やはり指数関数的にsort に大量渡すと遅くなる

258:デフォルトの名無しさん
19/07/14 12:30:16.97 GSQZGuhE.net
LANG=Cでやってみ。

259:デフォルトの名無しさん
19/07/14 13:29:14.61 VYOKuUQn.net
POSIX の find って -printf がないのな。
難しいことは -exec でなんとかしろということか。

260:デフォルトの名無しさん
19/07/14 13:32:10.29 VYOKuUQn.net
>>252
perl の中で sort やれば良いのでは?
sort keys %dirs にして。

261:デフォルトの名無しさん
19/07/14 14:08:00.15 Vo3Tn1vW.net
Perlようわからんけど、findのところもまとめていわゆるVisitorパターンでやると?
シェルだと時間掛かる。
#!/bin/bash
shopt -s dotglob
walk() {
local c=0
for p in "$1"/*; do
if [ -d "$p" ]; then
walk "$p" # recursive call
elif [ -f "$p" ]; then
((c++))
fi
done
echo "$1: $c"
}
start_dir=$(basename "$1")
walk "$start_dir"

262:デフォルトの名無しさん
19/07/14 14:15:10.09 niuQOGKU.net
>>255
そうだね
さらにちょっと早くなった

263:デフォルトの名無しさん
19/07/14 15:14:56.46 GSQZGuhE.net
どうせPerl使うんならPerlに用意されているfindコマンド的な関数使えばいいのに。
いや正直Perl書けないので外部コマンドのほうが効率いいのかも知れんけど

264:デフォルトの名無しさん
19/07/14 15:43:17.08 niuQOGKU.net
今回たまたま perl が早かったのは
>237
ということ
つまり C は10倍ぐらい早いけど
何十倍も無駄なことやってたら遅くなってしまう
高速な find の出力を |sort |uniq -c したら一応答えでるけど
そのsort がウルトラ処理多い
だったらperl で1行ずつ読んで正しいアルゴリズムで処理したほうが早いだけ

265:デフォルトの名無しさん
19/07/14 16:48:51.97 XOVWGW1L.net
perlでソートしてないから

266:デフォルトの名無しさん
19/07/14 19:10:07.29 BEvjoRaR.net
なんだperlでソートしたら遅いのか

267:デフォルトの名無しさん
19/07/14 19:11:22.06 AAGaqnKC.net
>>227
Plan無いん

268:227
19/07/14 20:00:20.57 QmWR+pGh.net
>>262
GJ!

269:デフォルトの名無しさん
19/07/14 20:02:48.24 XOVWGW1L.net
awk版。ディレクトリ名でソートするなら sort -k2
find . -type f -exec dirname {} + | awk '{c[$0]++}END{for(i in c){printf"%4d %s\n",c[i],i}}' | sort

270:デフォルトの名無しさん
19/07/14 20:08:54.86 XOVWGW1L.net
xargs使ったほうが良いかな
find . -type f | xargs dirname | awk '{c[$0]++}END{for(i in c){printf"%4d %s\n",c[i],i}}' | sort

271:デフォルトの名無しさん
19/07/15 08:12:50.57 jP+0UVPX.net
どうせなら計測結果も付記してくれよ

272:デフォルトの名無しさん
19/07/15 10:56:15.79 Ww8nr7y5.net
やってることが同じなら、Perlとawkは比較するまでもないのでは?

273:デフォルトの名無しさん
19/07/15 12:22:56.47 E9YINa1F.net
数分で書けるのがシェルスクリプトの良いところなんだし
数百万のファイルを何分以内で処理せよとか性能要件があるなら
そもそもシェルスクリプトなんかで書かないわ

274:デフォルトの名無しさん
19/07/15 15:08:49.68 3UWFYY1V.net
高速化するならC言語使うな。

275:デフォルトの名無しさん
19/07/15 16:42:34.21 jP+0UVPX.net
なんかシェルスクリプトを貶す人間ってシェルスクリプトを本来の目的とは違う方法で使った結果失敗して
その恨みを自分の無能さではなくシェルスクリプトにぶつけてる印象。

276:デフォルトの名無しさん
19/07/15 16:46:57.72 tvlJQJn9.net
このパーツは意外と頻度多いからCで書いておいてもいいかもね
| perl -ne '$dirs{$_} += 1; END{for $key (sort keys %dirs) {printf "%5s %s", $dirs{$key}, $key } }'

277:デフォルトの名無しさん
19/07/15 19:25:46.44 jP+0UVPX.net
端末の応答(例えば$ printf '\e]11;?\e\\'で返ってくる\e]11;rgb:〈赤〉/〈緑〉/〈青〉\e\\っていう文字列)を
sedやらなにやらで加工できるように標準出力に流したいんだど
そのままの状態だと端末そのものに文字列が渡ってしまって加工できない。
$ printf '\e]11;?\e\\' | od
みたいにすると(当然だけど)\e]11;?\e\\という文字列がパイプを通ってしまう。
個人的にはsttyとかをうまくやりくりしたらいけそうな気もするのだけど
そういう文書や記事がないのと俺があまり端末の処理に詳しくないのとで今のところ成功していない。
端末応答を標準出力として処理できる方法知らないですかね。

278:デフォルトの名無しさん
19/07/15 19:47:51.35 iDG/5azN.net
>>272
色というものが何者かわかってないんじゃね?
色を付けるためのエスケープシーケンスっていうのは、
エスケープ文字、ASCIIコード表でESC(0x1B)の文字8進数だと033
ESC文字から始まる一連の文字列の流れ(シーケンス)ってだけだよ
だから0x1Bで始まるその文字列を加工すりゃ良い。
\e]11;の ]11;は単なる文字だけど、\eは(シェルによりけりだが)
0x1Bの文字に置き換わる。だからsedなんかで\eを見つけようとしてもだめ
そんな文字列は流れてこないんだから

279:デフォルトの名無しさん
19/07/15 19:59:18.87 jP+0UVPX.net
>>273
あー。いやそうじゃなくて 端末の応答を取得したいんよ。
試しに
$ printf '\e]11;?\e\\'
ってやってみて。多分端末の上に
^[]11;rgb:0c0c/0c0c/0c0c^[\
みたいな文字列が表われる。
この文字列をtestコマンドの対象にしたりしたい。
でも普通の方法ではこの文字列は標準出力ではなく端末の上に直接出力されてるから
そういう加工ができない。

280:デフォルトの名無しさん
19/07/15 20:00:57.13 iDG/5azN.net
>>274
話の内容を単純化しよう。
文字の内容は今どうでもいい話だろ?
printf 'hogehoge' ってやってみたら
端末の上に、hogehoge って表示されるな?
それでこの文字列をどうしたいって?

281:デフォルトの名無しさん
19/07/15 20:20:16.67 f1G4msuO.net
わかってない奴が話に絡んでいくなよ
文字列なんか関係ない
奴はttyの出力(もしくは入力)を横取りしてパスワードを盗みたいという話をしてる

282:デフォルトの名無しさん
19/07/15 20:21:36.85 iDG/5azN.net
$ printf '\e]11;?\e\\' の話だろ?

283:デフォルトの名無しさん
19/07/15 21:13:36.27 f1G4msuO.net
ぜんぜん違う

284:デフォルトの名無しさん
19/07/15 21:15:41.25 iDG/5azN.net
>>278
試しに
$ printf '\e]11;?\e\\'
ってやってみて。

285:デフォルトの名無しさん
19/07/15 21:21:51.85 qldwvqW5.net
>>276
パスワードだとしたら、出力には返ってこないから横取りもできないんじゃね
パスワード生で出力するようなアレでなければ

286:デフォルトの名無しさん
19/07/15 21:35:01.81 f1G4msuO.net
>>280
だから入力って書いたじゃん
エコーバックやめるタイミングを捕まえて入力側をだな
まあいいや、俺も答え知らないしw

287:デフォルトの名無しさん
19/07/15 21:42:13.41 qldwvqW5.net
>>274
そういうのが出る Terminalアプリ もあるし出ないのもある
Terminalアプリが出しているんでしょ、その エスケープシーケンスを Terminalの画面制御 のために
Terminalアプリの作りによるんじゃないかなあ、また、Terminalアプリで何か提供してなきゃダメなんじゃないかなあ
>281
そもそもは出力をだから出力で入力をは無理だな。


288:エコーバックは今時はローカルではしてないんじゃね、パスワードを生で表示だろしw



289:デフォルトの名無しさん
19/07/15 22:20:41.82 qldwvqW5.net
なんのエスケープシーケンスなのか知らずにだったが、OSC Operating System Commandつうのね。で、制御ではなくてリポート(情報)なのね
Teminalアプリは、それを相手(シェルプログラム)への入力として出力しているのでできそうか

290:デフォルトの名無しさん
19/07/15 22:24:08.87 EBIcrGzb.net
ls結果をテキストエディタで開いた時[0mだらけで焦った思い出
ANSIカラーコードって正規表現で消せるのかしら

291:デフォルトの名無しさん
19/07/15 22:38:58.41 tvlJQJn9.net
消してみた
ほぼ消えたといって問題ないのでは?
URLリンク(i.imgur.com)

292:デフォルトの名無しさん
19/07/15 22:54:17.82 qldwvqW5.net
>>274
#!/bin/bash
result=''
printf '\e]11;?\e\\'
while read -s -N 1 -t 0.2 char
do
result="$result$char"
done
printf "%s" "$result" > hoge
試行錯誤中だけど、こんなんで取れてる

293:デフォルトの名無しさん
19/07/15 22:55:24.82 jP+0UVPX.net
>>275
その文字列はパイプで処理できるじゃん。
例えば
$ printf 'hogehoge' | sed -e 's/hoge/fuga/'
でも端末応答の文字列はそういう処理ができないのよ。
試してみると分かる。

294:デフォルトの名無しさん
19/07/15 22:59:10.56 jP+0UVPX.net
>>286
すげえ!ありがとう!
なるほどなぁ。readコマンドで対処するのか……。
全然文字列が取得できなくて悩んでたからマジで助かったわ。

295:デフォルトの名無しさん
19/07/16 01:24:24.20 b8YViJ87.net
こんな感じかなぁ
$ stty -echo;printf '\e]11;?\e\\'; IFS=';' read -r -d '\' _ bgcolor;stty echo
$ echo $bgcolor
rgb:3232/3232/3232

296:デフォルトの名無しさん
19/07/16 01:27:52.36 b8YViJ87.net
あ、尻尾に ESC(0x1b) が付いてるから適当に削ってちょ

297:デフォルトの名無しさん
19/07/16 02:07:13.54 6ZdisLnD.net
>>290
末尾のESC \は端末が返す文字列の仕様だから問題ないと思う。
というか応答の形式が
ESC ] 11;rgb/3232/3232/3232 ESC \
↑こういう感じ。

298:デフォルトの名無しさん
19/07/16 16:37:09.91 6ZdisLnD.net
シェルスクリプトでラムダ計算を実装するとしたらどんなインターフェースがいいんだろう。
lambda -x @ 'echo @ | tr "[A-Z]" "[a-z]"'
でもこれだとこの後に適用したい変数を持って来たときにlambdaコマンドの引数と見分けがつかなくなる…。

299:デフォルトの名無しさん
19/07/16 16:40:13.19 cpfSTA9t.net
パイプつなげるのが普通だから
xargs とか
なんか {} みたいなのでこれまでのパイプの流れてきたのを表現する
コマンドがあったからそれでいいんじゃないか?

300:デフォルトの名無しさん
19/07/16 16:55:42.40 zaQ9s3Gk.net
>>292
何が問題なのかわからんけど、
1. ラムダ計算だとしてlambdaコマンドに引数なんているの?
2. 'echo なんたら' の前がlambdaコマンド引数、後ろがechoの引数でいいだろ?
3. 'echo なんたら' で区切れない場合、-- で区切るのがよくある実装方法
って言っておくよ

301:デフォルトの名無しさん
19/07/16 17:34:51.11 6ZdisLnD.net
>>293
そうそう。xargsみたいなのを妄想してるw

302:デフォルトの名無しさん
19/07/16 19:39:35.56 6ZdisLnD.net
>>294
例えばPython3のラムダ計算だと
(lambda x: x * x)(3)
みたいな形式じゃん。
キーワードlambdaをコマンド
変数宣言x:を、どんな変数を扱うかというオプション
(xargsで言う-I)
演算本体のx * xは被演算子
としてみた。

303:デフォルトの名無しさん
19/07/17 23:26:41.26 ySrAQEz0.net
このラムダ計算は偽物だ。食べられないよ。
また明日来てください。僕が本当のラムダ計算をお見せしますよ。

304:デフォルトの名無しさん
19/07/17 23:47:22.37 ycSiezB+.net
このラムダは食べられないよ。ラムダこりゃ~

305:デフォルトの名無しさん
19/07/17 23:56:54.05 Lq1+nMLH.net
>>297
楽しみにしております ^ ^;

306:デフォルトの名無しさん
19/07/18 11:57:22.02 BkvY1rKv.net
>>297
本物のラムダ計算はよ。

307:デフォルトの名無しさん
19/07/18 11:58:54.05 832IkKkF.net
いくら待ってもムラダ。

308:デフォルトの名無しさん
19/07/18 14:21:32.04 BkvY1rKv.net
なんだ虚勢だったのか。

309:デフォルトの名無しさん
19/07/18 17:02:47.87 ugDCzjFC.net
シェルスクリプトでラムダ式ってどんな場面で便利なの?
普通に関数定義すれば事足りると思うんだけどな

310:デフォルトの名無しさん
19/07/18 17:23:35.77 vfPv5uwZ.net
URLリンク(www.sejuku.net)
> #lambda式を使わずに通常の関数を用いる場合
> def func(price,tax):
> return price + (price * tax)
>
> payment1 = func(100,0.08)
> print(payment1)
>
> #lambda式を用いる場合
> print((lambda price,tax:price + (price * tax))(100,0.08))
よくわからんのでコレをサンプル。
price?tax? シェルスクリプトにとって引数とは$1, $2,・・・固定なんだよな。省略かな?w
echo "$(lambda '$1 + ($1 * $2)' 100 0.08)"
イメージ的にはこんな感じか。少数の計算があるんでbc使わなきゃいけないので動くように直すと
lambda() {
formula="$1"
shift
echo "$(eval "$formula")"
}
echo "$(lambda 'echo "$1 + ($1 * $2)" | bc' 100 0.08)"
一発で普通に動いたわw
シェルスクリプトにとって戻り値=出力なんでこうかけるし、
あとbcの使いづらいのをどうにかすればこんな感じでかけるだろう
lambda 'calc "$1 + ($1 * $2)"' 100 0.08

311:デフォルトの名無しさん
19/07/18 17:25:39.32 Nv4mVpEC.net
bash の mapfile にある callback みたいなもん?

312:デフォルトの名無しさん
19/07/18 19:06:15.61 ugDCzjFC.net
数値計算ならbcに直接渡すし
文字列を加工するラムダ式はbcで処理できないし
必要性を感じたことないんだよね

313:デフォルトの名無しさん
19/07/18 19:08:03.03 BkvY1rKv.net
>>304
すごいけど
数値計算に限定されるのが残念な仕様だね。

314:デフォルトの名無しさん
19/07/18 19:17:03.16 DPDlMznj.net
>>307
へ?数値計算に限定するならもっとシンプルに書けるよ
これだけにできる
lambda '$1 + ($1 * $2)"' 100 0.08
数値計算に限定してないから呼び出し側にechoとかbcが埋め込まれてるんだけど?

315:デフォルトの名無しさん
19/07/18 19:21:15.11 DPDlMznj.net
lambda関数は>>304のままで小文字を大文字にする例
lambda 'echo "$1" | tr "a-z" "A-Z"' abc

316:デフォルトの名無しさん
19/07/18 19:28:37.52 DPDlMznj.net
ラムダで用いる計算式は通常短くなるから、
$1, $2 であっても分かりづらくなることはないだろうが
もともとの人は変数をどうすべきかって言ってたから書くと
lambda 'calc "$1 + ($1 * $2)"' 100 0.08

lambda v1 v2 -- 'calc "$v1 + ($v1 * $v2)"' 100 0.08
ってやろうと思えばやれる。変数に入れてからevalすればいいだけだから
それが>>294で書いたこと。--で区切るのが面倒だと思えばこういう書き方もありだろう
lambda v1:v2 'calc "$v1 + ($v1 * $v2)"' 100 0.08
第一引数が:で区切られた変数名、第二引数が計算式、残りが引数と簡単に見分けられる

317:デフォルトの名無しさん
19/07/18 19:41:15.10 DPDlMznj.net
数値限定で引数全てに計算式を適用して返す例(笑)
map() {
 formula="$1"
 shift
 while [ $# -gt 0 ]; do
  eval "echo \$(($formula))"
  shift
 done
}
map '$1 * $1' 1 2 3

318:デフォルトの名無しさん
19/07/18 19:53:59.13 ugDCzjFC.net
書き方が煩雑になるだけでメリットないんじゃね
やりたいこと素直に書けばいいじゃんって思ってしまう

319:デフォルトの名無しさん
19/07/18 19:54:42.45 DPDlMznj.net
まあ、それはラムダ計算そのものが言われていることだからw
シェルスクリプトの話ではないね。

320:デフォルトの名無しさん
19/07/18 20:0


321:3:10.85 ID:ugDCzjFC.net



322:デフォルトの名無しさん
19/07/18 20:09:12.09 DPDlMznj.net
簡潔に書けてるよw
map '$1 * $1' 1 2 3
ただ違うのはシェルスクリプトにはそれようのライブラリがないだけ
ここで例示したようなmapみたいなライブラリ集ができたら
もっと便利になると思う

323:デフォルトの名無しさん
19/07/18 20:15:16.65 DPDlMznj.net
というか、普通の言語のラムダ式だと、こんな感じで変数が出てくるけど
lambda a, b : a + b
引数名が$1, $2と数字固定だから変数宣言が不要になるんだよな
lambda a, b : a + b がシェルスクリプトだと
lambda '$1 + $2' だけになっちゃう
i = (lambda a, b: a + b)(1, 2) はシェルスクリプトだと
i=$(lambda '$1 + $2' 1 2) こうなる

324:デフォルトの名無しさん
19/07/18 20:17:43.55 ugDCzjFC.net
クロージャの概念がないシェルスクリプトは
ラムダ式の真価を発揮する場面は無いだろうね

325:デフォルトの名無しさん
19/07/18 20:22:14.60 DPDlMznj.net
無いっていうのは出来ないんじゃなくて
用意されてないって意味だけどな
実はPOSIX標準でも一つだけクロージャーが使われてる。
それがtrap
trap 'echo trapped; exit 1' INT
みたいな書き方ができる

326:デフォルトの名無しさん
19/07/18 20:55:40.78 BkvY1rKv.net
ていうか(ほぼ暴論だけど)シェルスクリプトだってオブジェクト思考っぽいことはできる訳だし
単に「向いている処理」「向いていない処理」があるってだけ。
シェルスクリプトでラムダ式は書けるけど、シェルスクリプトはラムダ式を扱うのには向いていない。

327:デフォルトの名無しさん
19/07/18 21:16:40.14 DPDlMznj.net
そんな難しく考えるなよw
trapの例もあるんだし、使うのが適切な場合に使えば良いいんだよ

328:デフォルトの名無しさん
19/07/18 21:28:25.20 KBi6m+gV.net
map は意外と使い道がないんだよな
lisp 以外では意外と実装されていない

329:デフォルトの名無しさん
19/07/18 21:33:57.01 DPDlMznj.net
実装されてない言語のほうが珍しいだろw

330:デフォルトの名無しさん
19/07/18 21:36:48.83 DPDlMznj.net
mapがある言語
Python、Ruby、Perl、JavaScript、C#(LINQのSelect)
思いついたものだけ


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