シェルスクリプト総合 その30

レス数が1000を超えています。これ以上書き込みはできません。
2019/07/01(月) 23:04:27.02ID:/rKj5XUf
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ:
シェルスクリプト総合 その29
https://mevius.5ch.net/test/read.cgi/tech/1537540487/
2019/07/01(月) 23:18:57.10ID:/rKj5XUf
お約束
・特記なき場合、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: http://www.speech-lab.org/~hiroki/csh-whynot.euc)
・POSIX に準拠しましょう
 有用なリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています。
 最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
  (左上の「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オプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
2019/07/01(月) 23:19:51.24ID:/rKj5XUf
初心者へのアドバイス
・適した道具を判断するのも頭の重要な使い方。
 シェルスクリプトよりも Per lまたは Python の方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたら man(1) を引きましょう。
・思い通りに動かないときは、まずは sh(1) の -x オプションでトレースしましょう。

回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに「そういうのはPerl, Python使え」と回答するのはやめましょう。
 安易に Perl や Python に逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。
2019/07/01(月) 23:28:17.35ID:GotlxjDf
次スレ立てる時はこのリンクを追加しよう

Bourne shellの種類とか歴史とかシェルの挙動とかいろいろ詳しい
https://www.in-ulm.de/~mascheck/
2019/07/02(火) 00:29:00.45ID:rBxHnYzF
お約束
・特記なき場合,Bourne ShellもしくはPOSIX準拠のsh互換(というより再現=jシェルが質問・議論の前提です。
 つまりシェルスクリプトのシバンは#!/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でのシェルスクリプトは*まったく推奨しません*(参考: http://www.speech-lab.org/~hiroki/csh-whynot.euc)。
・POSIX (Portable Operating System Interface) に準拠しましょう。
 有用なリンクはhttps://en.wikipedia.org/wiki/POSIX末節などを参照。
 最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
  (左上の「Shell & Utilities」から各コマンドの仕様を閲覧できます。また,コマンドだけでなく,ファイルその他の仕様も閲覧できます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh,次点でDebianなどに搭載されているDASH。
  Heirloom sh: http://heirloom.sourceforge.net/sh.html
  Dash shell: http://gondor.apana.org.au/~herbert/dash/
・Bourne shellの種類・歴史やシェルの挙動とかいろいろ詳しいサイト: https://www.in-ulm.de/~mascheck/
・Unixにはシェルスクリプトに便利な小さなコマンド類がいろいろあります。
「並び換え (sort(1))」「検索 (grep(1))」等々。
 Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
 apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
2019/07/02(火) 00:29:24.94ID:rBxHnYzF
↑一個のスレに収まるギリギリ……。
2019/07/02(火) 05:21:24.78ID:uO4UDEG+
なんかどうも理解してないようだから、続きのひとレス
動くかどうかの問題無いじゃないんだよ。cat 以後の cat の出力に対してのという表記に見えるのが好みじゃないってとこなんだよ。わかるかなあ?
例で cat | while でやることと、前処理と前処理の調整は別のもん。なのにってとこだよ。そこが無理してんなということだよ。わかるかなあ?まあ、わからんだろうけど
そういう「俺の好み」からはナイなということだよ。言ってもわからんだろうけど、いちおう最後にということで
2019/07/02(火) 05:29:38.90ID:Atdu9zIi
明確な理由がなくて、単に好みとだけ言ってたら
賛同を得られないのは当たり前。

bashはだめだよ。好みじゃないもの(笑)
2019/07/02(火) 05:31:07.65ID:Atdu9zIi
変数のスコープを考えろって話だ。
前処理だろうが、後処理だろうが、
変数を参照するならば、同じ階層(かそれ以下)でなければならない。

関数の外で、関数内の変数を参照しようっていうのがそもそも間違い。
2019/07/02(火) 05:34:16.34ID:Atdu9zIi
例えば、

hoge=0   # ← ==== ここで変数定義 ==== ・・・ (A)
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done < <(cat)

if [ hoge = 0 ]; then # ← ==== ここで使用してる ====・・・ (B)
前処理の調整
else
前処理の調整
fi


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

これぐらいはすぐに理解しよう。
2019/07/02(火) 05:38:13.57ID:Atdu9zIi
関数の中で、前処理、後処理(前処理の調整)を
したくないっていうのなら、こうなる。

foo() {
 hoge=0
 while IFS= read -r line; do
  [ なにか ] && hoge=1
  ほかにいろいろ
 done
 [ hoge = 0 ]
}

前処理
if cat | foo; then
 前処理の調整
else
 前処理の調整
fi


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

ワンライナーとかシェル芸とかばっかりやってると
こういうプログラミング能力が身につかないのかもなw
2019/07/02(火) 05:38:23.13ID:uO4UDEG+
別にそれでいいよ。別に俺はあなたにそう使うなとは言ってないし、bashのを使えとも言ってないけど?どう書くのかなあと聞いただけだよ、理解してお礼も言っているのにw
あなたが根本的に勘違いしているのは自分は正しい他は間違いってとこだね。賛同とかw別にあなたに賛同を求めてはいないよ?はなから。

>>9は無茶苦茶。なにかひどく後で出た巻数にすればいいに自信を持っているように見えるんだが、勝手にいろいろ妄想しすぎです

なんか異常に自分は正しいに拘るのね。わからん
2019/07/02(火) 05:40:12.69ID:rBxHnYzF
>>7
正直,お前の好みと可搬性だったら可搬性を優先するわ。
2019/07/02(火) 05:41:35.09ID:Atdu9zIi
>>12
お前なんの話してるの?

POSIX準拠だとサブシェルの中で変数を書き換えられないって
言ってたから、正しいプログラミングをすれば、それは問題にならないって
実例を上げて説明したんだが?

で、お礼も言わずに「俺の好みじゃない」と言ってるだけじゃん
2019/07/02(火) 05:41:58.38ID:uO4UDEG+
うわっ。なんか他の言語で当たり前の事をながーく書いてるねえ
他の言語と同じように書けるっぽいのがbashの方だと思うんだけどねえ
>>7で書いた通りのままだな。やっぱりわかってないようだし、コロコロ表記変わるよりは、bashのでのほうが変わらない普遍的だなというw結論で、俺は納得しておしまい
2019/07/02(火) 05:42:48.48ID:Atdu9zIi
>>15
中身のないレスするなよw
2019/07/02(火) 05:42:53.77ID:rBxHnYzF
[[ "$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に準拠してるよね。
何か問題があればツッコんで欲しい(自分では上手くいくと思っているので)。
2019/07/02(火) 05:42:58.59ID:uO4UDEG+
>>14
俺の最初のレスをよく読もうな。そしてお礼を言ったレスもよく読もうな
2019/07/02(火) 05:43:26.93ID:Atdu9zIi
やっぱりわかってない → 何がわかってないのか? → 何も言わずにまた逃げる

このパターンなんだよなw
2019/07/02(火) 05:43:51.62ID:Atdu9zIi
>>18
もってこいや
2019/07/02(火) 05:44:48.28ID:Atdu9zIi
>>17
サブシェルになると、変数が書き換えられなくて困る(?)とかいう話らしい

困らんのだがねw
2019/07/02(火) 05:45:16.64ID:uO4UDEG+
まあ...なんだな自分の世界で生きている人だな。そんなにレス書けているんだから読むくらいできるでしょwすげえな
2019/07/02(火) 05:48:48.18ID:p7jTc1Zw
bashで書いた好みのスクリプト見せてください!
2019/07/02(火) 05:49:21.91ID:uO4UDEG+
>>13
ちょっとショックと思ったら>>17で納得したwなんだかな
2019/07/02(火) 05:52:54.65ID:rBxHnYzF
あたりまえの事言われてるのにショック受けててかわいい
2019/07/02(火) 05:55:02.13ID:uO4UDEG+
ちょっとキモいっす。あなたにとってあたりまえでしょ>>17と勧めた人だもの
2019/07/02(火) 05:58:21.90ID:rBxHnYzF
>>21
なるほど……。
あんたもレスしてたけど
シェルスクリプトにおける変数のスコープってC言語やJavaScriptなんかとほぼ変わらない規則だよね。
「POSIXに準拠したシェルスクリプトは『普遍的』じゃない」っていう主張と矛盾してるよなw
2019/07/02(火) 06:01:36.34ID:Atdu9zIi
シェルスクリプトにはPOSIXの範囲ではグローバル変数しか無いけれど
(localやtypesetはPOSIXではない)
サブシェルまで考えると、ローカル変数として使えるんだよな。
よく考えられた言語だと思うよ。
2019/07/02(火) 06:03:41.58ID:uO4UDEG+
プロセスが別だからというだけだけどね。よくは考えてないだろう
2019/07/02(火) 06:05:53.06ID:rBxHnYzF
ID: uO4UDEG+の主張をなるべく中立的に列挙してみる。
・「自分が好きな書き方」のシェルスクリプトがある。
・それを人に強制する気はない。
↑これで合ってるよね。
ただ自分がこの人に賛同できない点は二つあって
1. 肝心の「自分が好きな書き方」の規則や具体例をほとんど挙げていない。
例えば「サブシェルをできれば使いたくない」とかそういう好みを言わずに,
人が書いたシェルスクリプトを「これは自分の好みに合わない」って言ってる。
2. 規格に準拠した書き方と「自分が好きな書き方」が同等の立場にあると思っている。
これは賛否あるかも知れないけど,好みの書き方が規格に準じてなかった場合,
大抵の人はそのプログラムを規格に準じた書き方に直すと思う。
たとえその書き方が嫌いだったとしても。
2019/07/02(火) 06:08:36.27ID:rBxHnYzF
>>28
Bashとかだとわざわざlocalっていう新しい予約語を用意してるけど
正直無駄っちゃ無駄よね。
POSIX準拠のシェルスクリプトでもほぼ可読性を損なわずに局所変数が定義できるから。

ところでBashの拡張機能で素晴しいと思うのは配列だね。
これはPOSIXに準じたシェルスクリプトではなかなか実現できない。
実現できたとしても大抵は複雑奇怪でデバックも地獄。
2019/07/02(火) 06:09:34.19ID:uO4UDEG+
forkはプロセスのコピーなので、親プロセスの変数なんぞはそのまま使える。だがしかし返すことや親プロセスの変数を変えることはできません
ってだけだね、確か

>>30
1.すでに言ってるけどなあ。最初から言えっていう?bashでのスッキリした書き方がわかっているもんだと思ったから
2.「同等の立場」とか何言っているのかわからん。どこでも誰でもPOSIXでなければならないとか言ってないでしょ?何を言っているのかわからん。bashでいいならbashを使ったそれに準じたでいいでしょね
2019/07/02(火) 06:10:40.06ID:uO4UDEG+
>>31
おいおいおいおい。>>27と言っておいて、それも人をそれをネタに揶揄しといて、それないないw
2019/07/02(火) 06:13:15.11ID:rBxHnYzF
>>33
「矛盾している」という指摘を「揶揄」と捉えてしまうような人とはお話できませんね……。
2019/07/02(火) 06:16:38.40ID:uO4UDEG+
>>34
その「矛盾している」という元はなんだったのか自分の書いたレスをよく読んできてね(そもそも普遍的でないは別にスコープとは無関係なことでなのに急にという)
スコープがPOSIXでは無かったら、bashでできるようなのは無駄とか言っちゃってるんですけど?ちょっと酷すぎね?w
2019/07/02(火) 06:19:02.38ID:rBxHnYzF
>>32
> どこでも誰でもPOSIXでなければならないとか言ってないでしょ
いや,今回に限ればそれは違う。

https://mevius.5ch.net/test/read.cgi/tech/1537540487/962
でPOSIXでの書き方を訊いた人がいて,それに関して
https://mevius.5ch.net/test/read.cgi/tech/1537540487/971
を提示すると
https://mevius.5ch.net/test/read.cgi/tech/1537540487/972
でID:uO4UDEG+が「その書き方は嫌いだ」という主張をしている。

つまりID:uO4UDEG+は少なくとも前スレ972においては
「POSIXに準じた書き方」と「自分が好きな書き方」を比較している。
たとえ無意識的だったとしても,たった2つ前のスレを読んでさえいれば
前スレ971で(俺が)提示したシェルスクリプトがPOSIX準拠を念頭に置いて書いたものだと分かる筈。
2019/07/02(火) 06:22:13.76ID:uO4UDEG+
>>36
いやいや。POSIXでも「同等」に書ける?と聞いているし、whileを使ったのもそれは嫌と言っているでしょ
根本的にPOSIX第一主義にあなたの思いが強すぎて読めてないよ、たぶん
2019/07/02(火) 06:26:43.80ID:Atdu9zIi
>>29
サブシェルはプロセスを別にする必要はないよ。
実際にkshはサブシェルだけど別プロセスにならない場合がある
2019/07/02(火) 06:28:53.26ID:uO4UDEG+
>>38
そういう場合は変えられるんじゃないの?でないと、わざわざメモリガードというか別メモリを用意してとかめんど臭いことしなきゃならないだろうね
2019/07/02(火) 06:30:42.30ID:Atdu9zIi
>>31
配列が出てくるのはシェルスクリプトのプログラミングスタイルがわかってないんだと思う。
一行一データで行指向で処理するのがシェルスクリプトだから
ツリー構造のデータにRDBMSを使うようなもん
2019/07/02(火) 06:32:49.73ID:Atdu9zIi
>>39
> そういう場合は変えられるんじゃないの?
主語をはっきりさせろ。誰にも伝わらん。

> わざわざメモリガードというか別メモリを用意してとかめんど臭いことしなきゃならないだろうね
だからkshは面倒くさいことをして
(特定の条件を満たす限り)サブシェルを別プロセスにしてない。

そういうことをしてOKだし、そういうことを想定してるから、
サブプロセスではなくサブシェルという別の言葉を作ってる
2019/07/02(火) 06:36:07.29ID:rBxHnYzF
>>40
まあ,そう言われればそうだな。
俺も,シェルスクリプト大好きですみたいな雰囲気のくせして,
シェルスクリプトで面倒な操作が要求されるような場合は
すぐにC#やPython3に浮気するからなw
2019/07/02(火) 06:36:08.06ID:uO4UDEG+
>>41
サブシェルが別プロセスでない場合だよ。プロセスが別かどうかの話なんだからわかるかと思ったけどなあ
ということは、同一プロセスでも変えられないのね。「ksh」はそこは「よく考えるんだな」と言えるでしょうね。なんでまたとも思うけど。古のshは別プロセスの方だろうと思うけどどうだろう
2019/07/02(火) 06:37:14.94ID:Atdu9zIi
>>43
だから、何を何に「変えられる」のか言えって
2019/07/02(火) 06:38:46.75ID:rBxHnYzF
>>37
別に俺はPOSIX第一主義でもなんでもない。
というかPOSIXに従わないという明確な方針があるならそれはそれでいいとさえ思ってる
(あまり賛同しずらいけど)。
ただし今回はPOSIXに準拠したものと「同等の」シェルスクリプトを書く話だから
俺はPOSIX規格を持ち出してきてる訳。
2019/07/02(火) 06:39:59.55ID:uO4UDEG+
>>44
ああ、「変数を」の方か?それも以後の文でわかってるでしょうに。まあ、いちおうすまん。なんか納得いかんから「いちおう」。だか「すまん」もあるよ
なんかめんどくさいやつだと思ってしまうぞw
2019/07/02(火) 06:41:23.10ID:rBxHnYzF
しっかし……なんでそう極端にしかモノを考えられないのかね。
たぶん,彼が想像する世界には「POSIX絶対!」っていう人と「Bashizm最高!」っていう人の二種類しか存在しないのかもw
だってそうじゃなきゃ(限定的に)POSIXの話をしている中に割って入って「POSIX第一主義だ」なんて言えないもん。
(というかそういう発想がまず出てこないw)
2019/07/02(火) 06:41:51.94ID:uO4UDEG+
>>45
そうなの?だったら単に読んでなかっただけか??
「同等」がそういう「同等」ではないと、元の人がすでに言っていたわけだったのよ
2019/07/02(火) 06:44:53.65ID:Atdu9zIi
POSIXシェルの範囲でできることなんだから、POSIX準拠でいいやん
これだけだろ。

POSIX準拠じゃできないことならまだしも、
POSIX準拠でできるならPOSIX準拠で作ってりゃ可搬性も有るし。

必要もないのに [[ ]] を使うやつ多すぎ
2019/07/02(火) 06:45:12.79ID:uO4UDEG+
>>47
「読んでなかった」とは思えんし、スコープでの豹変からそう判断せざるを得なかったなあw 他にもね
こちらからもあなたが極端と見えるんだけどねえw
2019/07/02(火) 06:46:27.41ID:uO4UDEG+
>>49
そゆとこだよ、あなたの悪いwとこは。やっぱり自分が正しく他の人の好みは認めんってだけやん
2019/07/02(火) 06:47:02.37ID:rBxHnYzF
>>48
元の人というのはID:Tm8GOmHyだよな。
この人物のその後の発言は
https://mevius.5ch.net/test/read.cgi/tech/1537540487/967
しかないのだが,ここから
「POSIXと『同等』のシェルスクリプトというのは
POSIX規格に準拠したシェルスクリプトのことではない」
という主張は俺にはどうしても読み取れんな……。
2019/07/02(火) 06:48:07.81ID:Atdu9zIi
>>51
そういうとこな(笑)
2019/07/02(火) 06:48:23.35ID:Atdu9zIi
>>51
お前のことやで。そういうとこ。
2019/07/02(火) 06:49:02.19ID:rBxHnYzF
>>51
「POSIX準拠でいいやん」
これを
「POSIX準拠以外は認めない」
って読み替えてしまうのヤバくない?
2019/07/02(火) 06:49:41.71ID:rBxHnYzF
>>53
>>54
なんで二回もレスしたしw
2019/07/02(火) 06:49:42.46ID:uO4UDEG+
>>52
なにを言っているのだかだよ
>while は見た目簡潔じゃないし、インクリメント忘れる可能性もある
という拒否だよ、彼の好みからの。「同等」の意味をまだわかってないねえ
2019/07/02(火) 06:49:55.77ID:Atdu9zIi
「POSIX準拠でいいやん」という意見を認めたくないんだろうね(笑)
2019/07/02(火) 06:50:40.47ID:rBxHnYzF
>>57
すいません,ここでの「『同等』の意味」を教えていただけますか。
2019/07/02(火) 06:50:44.84ID:Atdu9zIi
>>57
そういうとこやで、

わかってないねぇ → 何が? → 何も言わずにまた逃走

お前、自分の意見を何も言ってない。
そういうとこやで
2019/07/02(火) 06:53:34.64ID:uO4UDEG+
>>53-55
あなたたちとの違いは、
>必要もないのに [[ ]] を使うやつ多すぎ
とかいうのと同じようなこと言ってないよ。俺は別にあなたにPOSIXにこだわって書くなとは言ってないよ?好きにすればだよ
あなたのこの言葉はそれと同じとでも言うの?

なんであなたの好みを他人に押し付けるの?なにか意味あんのそれ?
2019/07/02(火) 06:55:55.49ID:uO4UDEG+
>>59
全く同じに近い同等だろう、whileでさえ拒否するあたりは

>>58,60
何を言っているのだが、一人で悦に入るねえ、たびたび
俺はあんたらにああしろとは言わない。それが意見を言ってないというならそうだろうが、まさかそう言っているわけ?
2019/07/02(火) 07:08:42.17ID:rBxHnYzF
>>62
あーなるほど。
Bashの独自文法で書いたシェルスクリプトと限りなく同じ見た目のものを要求してた訳か……。
うーん。これには助けにならないな。
少なくとも俺はPOSIXに準じつつかつfor (())文みたいな「見た目」のシェルスクリプトを書けない。
2019/07/02(火) 07:09:11.44ID:uO4UDEG+
ああ、ああしろとは言ってるな「好みを押し付けるんじゃねえ」とw
2019/07/02(火) 07:09:48.34ID:rBxHnYzF
>>63
sed -e 's/助けにならない/助けになれない/'
2019/07/02(火) 07:10:52.83ID:uO4UDEG+
>>63
ご理解いただけて嬉しい限りでございます。彼の本音とかわからんけどねw
2019/07/02(火) 07:14:40.86ID:Atdu9zIi
全く同じじゃないとだめとかアホだろw
同等のコードがかければ問題ない。
2019/07/02(火) 07:17:16.38ID:uO4UDEG+
好みを押し付けるんじゃねえ
って繰り返すだけだな、もうwアホとか馬鹿にしなきゃならないほどのあんたの心理がわからん
2019/07/02(火) 07:42:13.15ID:Atdu9zIi
>>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 の実装はお昼ごろ公開(笑)
2019/07/02(火) 07:59:30.87ID:rBxHnYzF
>>69
おーすごい。
単に三つの引数を取って処理するだけじゃ
doやdoneキーワードをシェルが認識できないから,
そこをやりくりする必要があるな。
俺には思い付かんわw
71デフォルトの名無しさん
垢版 |
2019/07/02(火) 09:02:17.46ID:QDdew1lC
まとめるとどこでも動くシェルスクリプトなんて都市伝説ってことだね。
だってめんどくさすぎるもん。
普通に書いたらその実質環境専用。
2019/07/02(火) 09:04:33.59ID:rBxHnYzF
そういうことにしたいのなら、そうなんでしょうね。
2019/07/02(火) 09:18:25.84ID:p7jTc1Zw
POSIX原理主義的にはアウトなんだろうけど
俺なら素直にseq使うな

for i in `seq 0 1`; do
 for j in `seq 0 2 9`; do
  echo "$i $j"
 done
done
2019/07/02(火) 09:24:30.73ID:TPa3Dzqe
仮定の話として、
bashのがPOSIX規格に入ったとして、方々の環境で使えるようになったとしても、
それを使わずに独特なあんなのを書くのだろうか?
2019/07/02(火) 09:38:35.04ID:NGgK0zPR
修羅の道
2019/07/02(火) 09:42:44.56ID:p7jTc1Zw
慣れの問題じゃないかな
人間は最初に覚えたものを正しいとする傾向があるからね
2019/07/02(火) 10:12:37.42ID:K9FUvK74
>>73
seqをシェルスクリプトで実装すればOK。簡単でしょ?

でもそれだとiをループ内で更新できないからだめなんだと
そんなことしねーだろうに、条件がよくわからんわw
2019/07/02(火) 10:27:34.91ID:p7jTc1Zw
>>77
実装があるのは知ってたw
https://github.com/ShellShoccar-jpn/misc-tools/blob/master/seq

でもこれ速度的にどうなんだろね
2019/07/02(火) 10:33:48.48ID:K9FUvK74
>>78
例のawkプログラマのコードか

そんな無駄に実装しないでいいやん
単に数列を返す関数を作ればいいだけ
2019/07/02(火) 10:36:47.73ID:uMGeffjZ
bash のfor ループで、5分ぐらい掛かるものが、
awk, Perl, Ruby などでは数秒以内

dash なら、まだマシ
2019/07/02(火) 10:38:10.41ID:9kNMjoh/
また原理主義者が跳梁跋扈しているのか
2019/07/02(火) 10:38:45.33ID:K9FUvK74
× bash のfor ループで、5分ぐらい掛かるものが、
○ bash のfor ループで大量に外部プロセス呼び出ししたから5分ぐらい掛かる。俺ってなんて馬鹿だろう
2019/07/02(火) 13:09:34.12ID:+S00pq20
では>>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
2019/07/02(火) 13:10:15.61ID:+S00pq20
あ、bashの場合のコード忘れてたw

[ "${BASH_VERSION:-}" ] && shopt -s expand_aliases
85デフォルトの名無しさん
垢版 |
2019/07/02(火) 13:12:43.38ID:NqAwj9wC
やっぱりどこでも動くシェルスクリプトなんて現実的じゃないね。
2019/07/02(火) 16:30:08.56ID:rBxHnYzF
そういうことにしたいのなら、そうなんでしょうね。
2019/07/02(火) 16:35:31.23ID:rBxHnYzF
>>74
そんな訳なくね?
だってBashの構文がPOSIX規格に採用されたということは
「好みの」問題でBashの構文を書いたとしてもどこでも動くシェルスクリプトが書ける訳でしょ。
俺はどーでもいいけどBashの構文を書きたい&&POSIXに準拠したい人は,
当然Bashの構文で書くようになるだろうね。
2019/07/02(火) 17:50:15.63ID:2TyYMhHV
いやらしい無理してのレスだな
2019/07/02(火) 18:50:36.28ID:p7jTc1Zw
POSIX準拠コマンドの選定基準ってあるのかね
seqのないシステムなんて見たことないんだけどな
2019/07/02(火) 19:14:34.05ID:fp/AcynX
https://en.wikipedia.org/wiki/Seq_(Unix)
らしい
2019/07/02(火) 19:40:34.32ID:p7jTc1Zw
BSD, GNU系だからってことか
でも Solaris(SYSV系)にも入ってたはずだけどな
選定基準はBSDとSYSVの共通項とる感じなのかね
2019/07/02(火) 20:08:50.12ID:fp/AcynX
seqは初期のUnixの頃にはいらない子だったんだなと

https://en.wikipedia.org/wiki/List_of_Unix_commands
コマンド初出元は方々だね、基準がわからない。お話し合いでじゃないのかな
trは不人気もありお話し合いで上がらないか却下とか
2019/07/02(火) 20:19:23.81ID:p7jTc1Zw
なるほどね
そろそろ改定してもいいんじゃないって思うな
今どき SCCSなんて使ってないでしょw
2019/07/02(火) 20:28:41.77ID:fp/AcynX
>trは不人気もあり
seqは不人気もありの間違い

なんか今でもコマンドの内容については議論しているようだけどね。コマンドの選定とかもあるかな。議論を見ると時間がかかるのが明らかだけど
2019/07/02(火) 21:31:39.81ID:rBxHnYzF
>>93
それな。
ていうかまず書庫作成コマンドにおけるpaxみたいに,
ネットワークを扱う中立的なコマンドを作って
2019/07/02(火) 23:55:56.36ID:rBxHnYzF
>>83
それってどうしても
alias使わないと無理?
2019/07/03(水) 00:36:59.38ID:1lX/P2wW
>>96
whileループが1回目の場合にループ変数に初期値の設定、それ以外は加算する必要がある。
だからループの1回目かそれ以外の区別する必要があるんだけど、他にいい方法が思いつかなかった。
見た目まで合わせようとするとこうなるかなと

ま、普通にwhile使えばいいんで、こんな事しないけどねw
2019/07/03(水) 01:05:12.87ID:1lX/P2wW
あとaliasを使えば、簡単な文法の変換を行えるわけだけど、
aliasを使わないならば、forloop i=0 'i < 2' i+=1; do とは書けずに、
while iterator i=0 'i < 2' i+=1; do のようにwhile と iterator の最低二つの単語が必要だろうね。
2019/07/03(水) 01:37:44.21ID:t0CPqQzZ
>>98
なるほ。ありがとう。
2019/07/03(水) 13:08:21.29ID:R/PdF9TQ
hoge.sh の中で bash hage.sh と実行した時に、なんでなにもしてないのに
hage.shの中ですでに環境変数などが設定されてるんだ?誰が設定してるんだ?って思ったら
BASH_ENVにファイル名を入れておくと、bash hage.sh実行時に
指定されたファイルを読み込むのか・・・
2019/07/03(水) 14:51:49.69ID:jC/WE6MC
> hoge.sh の中で bash hage.sh と実行
素人質問で済みません、これは無限ループにならないのでしょうか?
ならないなら、どういう仕組みで阻止されてるのでしょうか
2019/07/03(水) 15:22:43.46ID:k7t42OM8
無限ループに条件つけて終了させればいい
どの言語でも一緒
2019/07/03(水) 15:25:15.83ID:R/PdF9TQ
>>101
ハゲは一人だ
2019/07/03(水) 16:12:30.34ID:jC/WE6MC
あー、シェルが勝手に阻止してくれるワケではないのですね...

#! /bin/sh
echo "foo!"
bash hoge.sh
これ無限ループになりました。
2019/07/03(水) 18:44:48.49ID:sXMtau7O
>>103
誰も気づいていないみたいだよw
2019/07/03(水) 19:21:20.61ID:v/5AoTKN
hoge、fuga、piyoは認めるがhageは認めんぞ
俺が禿げているって訳じゃないぞ本当だからな
107デフォルトの名無しさん
垢版 |
2019/07/03(水) 19:25:37.57ID:XEr4jr+a
うるせーハゲ
2019/07/03(水) 19:49:42.97ID:pKA2Nnt3
             )ソ)
          ッλ ノ(.,ノ)
         (゙- ..::.::. . (
        (ソ.  .彡⌒ミ. )ソ)
        ).::'; (´・ω・`) ス (
       ソ .::;';'(つ ⊂)::;';'`〜、.
       (  :;';' |__∧_| ::;';'  ヽ)
`'~`'''`'`'`~'~~`~~'`'`''''"`'`'`''`''''"`'``'~`''`'~`'''`'`'`~
 さ あ 禿 げ 上 が っ て ま い り ま し た
109デフォルトの名無しさん
垢版 |
2019/07/03(水) 21:40:00.18ID:ehEf7ymj
禿ーゲンダッツ
2019/07/03(水) 22:05:25.84ID:t0CPqQzZ
>>101
$SHLVL変数で判定するんじゃないの?
2019/07/03(水) 23:07:21.62ID:t0CPqQzZ
……と思ったらhogeとhageかよw
クッソwww紛らわしいメタ変数使うなw
普通hogeの次はfugaだろーがよ
2019/07/04(木) 03:34:12.16ID:KpaWo1Ff
commandって便利やな。
シェルスクリプトでオーバーライドができちゃうよ
2019/07/04(木) 07:10:15.99ID:vxwYTSOB
>>112
ls () {
command -p ls
}
↑こういうやつなw
2019/07/04(木) 09:07:36.04ID:BLb3ulq0
command て.... ググラビリティ低すぎでしょ
2019/07/04(木) 09:37:41.63ID:vxwYTSOB
>>114
いやもっとググビティ低いのでmanとかありますし……。
あとcatもかな?make・niceあたりも引っ掛かりにくい。
でもまあ関連語句と一緒に検索すればノイズはほぼ無くなるけどね。
2019/07/04(木) 10:08:16.55ID:846uO/vY
less より vi(/= vim) が軽いので
ページャーとしてパイプの最後に less するのとりかえる
2019/07/04(木) 10:50:19.43ID:8CMbGrkR
シェルスクリプトで、実行結果にかかわらず終了コード0を先出しする書き方ってないでしょうか。

背景としては…
openvpnのServer側で、「clientが接続してきたらコマンドを実行」できるんですが、
そのコマンドの終了コードが0でないと以降の処理が進まず、接続が確立されないようなんです。
今回コマンドの目的は「SSHでclientにコマンドを送り込むスクリプト」なので、
コマンドの実行結果なんか見ないで先に接続を確立してくれないと、送り込みようがないです。

なのでopenvpn側には、スクリプトの結果にかかわらず終了コード0を先に返しておいて、
sleepを入れるなり何なりして後からSSHでコマンドを送り込みたいんですが、
/path/to/script.sh && true とか色々試してみるも、一向にスクリプト終了と見なしてもらえません。

何か方法はないでしょうか。
2019/07/04(木) 10:58:34.54ID:vxwYTSOB
/path/to/script.sh; true
これじゃあかんの?
2019/07/04(木) 11:41:34.07ID:97ll0bAQ
catとtac
lsとsl
moreとless
nanoとmicro
headとtail
こいつらみたいな言葉遊びって他にもある?
大抵は既存コマンドの改良版が対にされやすいよな
2019/07/04(木) 11:54:20.16ID:VX27EPul
>>117
/path/to/script.sh & true
script.shをバックグラウンドで実行でいいんじゃないの
2019/07/04(木) 12:16:55.68ID:KpaWo1Ff
>>117
終了コードを先出しするの意味がわからんが、
まあ中断しないようにしたいということだとして。

まず途中で中断するのは set -e されてるから
set -e されてる状態だとコマンドの終了コードが0以外だとそこで中断されてしまう。

中断されなくする一番簡単な方法は

hige ||: ・・・終了コードが0以外でも中断せず、かつ終了コードを0にする
hige &&: ・・・終了コードが0以外でも中断せず、かつ終了コードはそのまま保持する

あと、if hige; then 〜 みたいに if や while の中に入れてもOK
if や while は、コマンドの終了コードを条件に処理を分岐するので
これらの中に入れても中断しなくなる。
2019/07/04(木) 12:22:58.60ID:KpaWo1Ff
>>117
どうでもいいけどさ、openvpnの機能で
たしか接続時にスクリプト実行する機能がなかったか?
2019/07/04(木) 12:29:18.19ID:vxwYTSOB
>>119
yacc→bison
cat→dog
make→kati (https://git.io/fj6cL)
124117
垢版 |
2019/07/04(木) 14:12:34.15ID:8CMbGrkR
>>118,120
;も&もダメでした。

>>121
ちょっと理解し切れてるかわかりませんが、
;や&の代わりに||を試しても、同じ結果でした。

>>122
その接続時スクリプト実行機能で、自作スクリプトを実行しようとしているが、
自作スクリプトのexitcode 0を確認しない限り接続が確立されないので、
接続できている前提の自作スクリプトがうまく動かない、という話です。

その後、試行錯誤してうまくいったんですが、
・openvpnの接続時スクリプト1は、別のスクリプト2を&付きで実行してすぐexit 0で終了
・別のスクリプトにやりたい処理を記述、終わったらexit 0
こういう方法でした。
2019/07/04(木) 14:21:40.05ID:vxwYTSOB
今さらだけどPOSIXでpushdとかって「未定義」なんだな。
つまりこれらの字句が来たとき、pushdコマンドが実行されるかもしれないと想定しなきゃいけない。
126デフォルトの名無しさん
垢版 |
2019/07/04(木) 14:44:38.64ID:VFVr1rb1
>>124
これは?

/path/to/script.sh ; exit 0
2019/07/04(木) 18:16:12.18ID:KBMDzr/H
俺には >>120>>124 でうまくいった方法が同じに思えるのだが何が違ったのだろう...
2019/07/04(木) 18:44:40.09ID:Nr3czBjG
>>119
more most
nano pico
perl ruby
129117
垢版 |
2019/07/04(木) 18:54:04.40ID:8CMbGrkR
>>126
明日試してみます

>>127
そもそもopenvpn側の判定条件がはっきりしてないので、
シェルスクリプト的には皆さんに教えてもらったのが正解でも
openvpn的にダメってだけかもしれません。
シェルスクリプト的にokならそれでokじゃないはずがない、とは思うんですが。
2019/07/04(木) 19:05:50.51ID:zzPJIhEP
>>129
openvpnの
--client-connect

--route-up
を使えばいい気がする
2019/07/04(木) 19:30:11.56ID:gP3HGmG/
>>125
もとはcshの機能だからPOSIX策定時は独自拡張だったんだろうな
POSIX準拠のシェルスクリプトではpushd,popd,dirsは使わない
2019/07/04(木) 19:39:31.79ID:VX27EPul
>>129
スクリプトではなく純粋にコマンドの実行=単に実行ファイルの実行とか
引数の解釈分解もopenvpnでやってるとかかな?であれば、
/bin/sh -c '/path/to/script.sh & true'
とかなんとか。書き方も違うかもしれない(' が必要なのか可能なのか、もしかしたらできないとか)
2019/07/05(金) 06:22:27.69ID:CMdnJVDV
POSIXユーティリティにネットワーク関連のコマンドが追加される予定ってあるの?
2019/07/05(金) 10:21:41.11ID:CMdnJVDV
>>128
perlはもともとどういう意味だったんだろうな。
2019/07/05(金) 10:39:53.85ID:7D1ht1Ch
teeの無理矢理感すき
136デフォルトの名無しさん
垢版 |
2019/07/05(金) 10:46:54.44ID:/9SntML6
>>134
確か pearl って言語が既にあったので perl にしたんだったと思った。
2019/07/06(土) 03:00:27.30ID:d8QKOOo3
>>135
そういういえばteeのパイプ版のpeeというのもあった。
2019/07/06(土) 04:11:43.20ID:O76mcSig
きたねぇな
139デフォルトの名無しさん
垢版 |
2019/07/06(土) 04:28:48.13ID:Db2rLmY3
pooとかもあるな

>>140
それはpooh
2019/07/06(土) 05:18:54.35ID:d8QKOOo3
>>139
それは「pooコマンド」があるってこと?
検索してもネットミームしか引っ掛からんw
2019/07/06(土) 10:11:41.54ID:q0MZeBYW
https://codeday.me/jp/qa/20181126/2893.html

おしっこw
2019/07/06(土) 10:27:36.00ID:Qorx3cLN
comedyday
2019/07/06(土) 14:22:39.80ID:B/itK7pP
pingは潜水艦のソナー音
2019/07/06(土) 16:53:09.35ID:p445ST1A
sosコマンドとかないのかな。
2019/07/08(月) 08:11:26.31ID:OnOhhClA
tarが入ってない環境なんてあるのかな?
2019/07/08(月) 08:54:13.07ID:ny4rr8vT
paxコマンド使って、どうぞ
2019/07/08(月) 08:56:35.94ID:uRBHZP6h
♪IN TERRA PAX〜
2019/07/08(月) 16:03:08.50ID:u+KjwOdz
>>144
sosreport ならある
2019/07/09(火) 00:44:32.67ID:hKj+lpg6
sexという天文学用のコマンドがある事実
下ネタ満載のmanもあるらしいが
2019/07/09(火) 08:05:36.87ID:DRnRn6EV
>>149
man woman
とか面白いぞ
2019/07/09(火) 08:31:28.67ID:chrBBqpb
s式の expression という意味で lisp では
sexp というワードが使われる時が sex ちらつく

シェルスクリプトじゃなくてごめん
2019/07/09(火) 10:07:15.07ID:DRnRn6EV
$ man co
https://kazmax.zpp.jp/cmd/c/co.1.html
2019/07/10(水) 13:17:47.35ID:AgLkizrd
セマンティックバージョニングの並びで最新のタグを取得するにはどうすればいいの?
sort -Vはposixにはないようなんでなしで。
gitコマンドで(最後に付けたタグではなく)最新のタグが取得できればそれでも良いんだけど
2019/07/10(水) 13:29:47.61ID:eZpAq1ko
>>153
試してないけどsortの区切りオプションを“.”にして
各桁を数字順に並び換えたら上手いこといきそう。
2019/07/10(水) 13:46:00.77ID:AgLkizrd
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 は順番が同じなんていうルールが有るわけだけど
2019/07/10(水) 15:06:48.80ID:StxWbt+s
できたとしても以後がえぐい
2019/07/10(水) 16:09:18.81ID:eZpAq1ko
素直にsort -V使うのが一番。
POSIXに準拠したければそれなりの実力がないとね。
少なくとも俺には無理w ていうかわざわざ既にある機能を苦労して再発明したくねーw
158デフォルトの名無しさん
垢版 |
2019/07/10(水) 16:15:38.61ID:6IY0QwqQ
つまりどこでも動くシェルスクリプトなんて都市伝説だよね。
159デフォルトの名無しさん
垢版 |
2019/07/10(水) 17:49:00.07ID:lDiVjXP/
世界征服して一つのシェルしか使わないように全世界の人間に強制すれば可能
2019/07/10(水) 18:31:37.23ID:8OTK1K8V
シェルだけ統一しても無理だな
2019/07/10(水) 19:54:16.62ID:eZpAq1ko
シェルスクリプトは「完全に」どこでも動くとは限らないけど
他の言語と比べて「ある程度」どこでも動く確率が高い。
2019/07/10(水) 20:10:25.56ID:8OTK1K8V
確率を言うならデータもってこいよ
どこにあるんだよその統計はw
2019/07/10(水) 20:36:18.03ID:j+J/37U2
まだやってる。堂々巡りを。四国へ行け
2019/07/10(水) 20:37:15.39ID:StxWbt+s
それいわれたのC があって perl ができる前の常識でしょ
C よりは確かに移植性ある
165デフォルトの名無しさん
垢版 |
2019/07/10(水) 20:59:14.35ID:lDiVjXP/
Windowsには最初からは入ってないよね?今のは入ってる?
まあ WSL 動かしちゃえば何でもありにはなるが。
2019/07/10(水) 20:59:47.00ID:mGyL/3Gj
そんなに難しい話じゃなくてshは多くの環境にインストールされてるってだけのことでしょ?
例えばPerlが初期インストールされてるような環境なら
必ずshもインストールされてる。
Perlが入って無くても、shはインストールされてる。
2019/07/10(水) 21:01:25.84ID:mGyL/3Gj
>>165
Windowsにはshが入ってないけど、
PerlやRubyも入ってない。
shが入ってないならば、○○も入ってないが成り立つ。
2019/07/10(水) 21:13:36.75ID:mGyL/3Gj
結局の所Windowsとそれ以外のOSに分かれるわけで、
Windowsとそれ以外のOSの両方に入ってる言語はなくて、
Windows以外のOSに入ってる言語で一番多いのはshなんだよね。
2019/07/10(水) 21:16:39.60ID:mGyL/3Gj
dockerとか使うとわかるけど、最小イメージのalpineには
perもrubyもpythonも入ってないからな
2019/07/10(水) 21:19:19.80ID:mGyL/3Gj
そういやalpineにはbashですら入ってないのな
2019/07/10(水) 21:23:57.90ID:6IdsJob5
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\
2019/07/10(水) 23:46:47.18ID:8OTK1K8V
要はPOSIXは必要最低限の機能しか規格化していないから出来ることには限界があるってことだ
2019/07/11(木) 04:18:38.14ID:pY8YHtW/
>>168
そうそう。こういうことなんだよ。
2019/07/11(木) 09:51:44.08ID:5BkhO8Tf
独自にcmdやpowershell持ってるしな
2019/07/11(木) 10:49:49.47ID:7babKKNu
Windowsにはshが入ってない!
→ かといってじゃあ他の言語が入っているかというと入ってない

Windowsは諦めた。それ以外で最初からOSに入っていてどこでも使える言語はなんだ?
→ sh
176デフォルトの名無しさん
垢版 |
2019/07/11(木) 11:30:36.51ID:EFuj/0Xm
どこでも動くシェルスクリプトって都市伝説だよねw
2019/07/11(木) 11:35:07.95ID:nlZoRVuP
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\
2019/07/11(木) 11:39:41.84ID:bvWe7WiP
Javaなら一度書けばどこでも動くのに
2019/07/11(木) 11:54:59.97ID:PMWvbDa1
まじで?
買ってきたばかりの ノートブック windows でも?
2019/07/11(木) 12:03:46.60ID:oBmxbhd/
買ってきたばかりの ノートブック windows でも
Perlなら動く!→動きません(笑)

Rubyなら? Pythonなら? C言語なら? NO!!!!
2019/07/11(木) 12:05:03.00ID:PMWvbDa1
それでも Java なら動く?
2019/07/11(木) 12:28:30.89ID:pY8YHtW/
PowerShellなら動きます(白目)
183デフォルトの名無しさん
垢版 |
2019/07/11(木) 12:29:45.46ID:W9yQmyPF
Windowsに最初から入ってるのは vbs とか js とか、あとバッチファイルとかパワーシェルかな。よく知らんけど。
HTAってのもあったっけ。
2019/07/11(木) 12:34:10.09ID:CgGarxi7
powershell考えた奴は頭おかしいんじゃね
なんでいちいちコマンドとかあんな長いんだよ
無能にもほどがある
185デフォルトの名無しさん
垢版 |
2019/07/11(木) 12:50:53.46ID:At9Pc1xn
adduserとuseraddどっちがどっちかたまに使うとき毎回調べるみたいなクソ下らないことしたくないからじゃない?
2019/07/11(木) 12:57:39.35ID:oBmxbhd/
それをいうなら、Windows、Macで、どの言語でも構わないが
ユーザーを追加する方法を調べないでわかるっていうの?
2019/07/11(木) 12:58:48.61ID:l57S3jiM
POSIXってUNIX系OSの規格なのに
なんでWindowsの話になってんだよw
2019/07/11(木) 13:00:17.64ID:A1tpN7ls
>>181
インストールしないで動くのか?
2019/07/11(木) 13:01:52.25ID:PMWvbDa1
>>188
>Javaなら一度書けばどこでも動くのに
とあったから
Windows は標準でいれてるのかなと
190デフォルトの名無しさん
垢版 |
2019/07/11(木) 13:23:31.79ID:W9yQmyPF
>>189
入れたかったんだけどね・・・
2019/07/11(木) 14:01:00.83ID:l57S3jiM
Javaはオワコン
2019/07/11(木) 14:06:11.17ID:oQkLsXMb
javaのコンセプト
write ones, test everywhere
2019/07/11(木) 14:16:47.27ID:5J3UX5Vb
debug anywhereやろ
2019/07/11(木) 14:20:46.71ID:xCkJ5LaR
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

注意。サーバーエラーになるので、全角に変換した
2019/07/11(木) 14:59:54.89ID:3GvBtncU
そういえば IBM の z/OS ではどうなっているんだろうと
思ったら z/OS シェルってのがデフォルトでインストール
されてて、こいつは POSIX compliant らしい
2019/07/11(木) 15:48:04.71ID:PMWvbDa1
それだ WSL が標準で最初から入っているようになると
昔のニュースで見たが、どうなっているの?
標準は取りやめ? Windows の最新情報追ってないからわからない
197194
垢版 |
2019/07/11(木) 16:19:18.53ID:xCkJ5LaR
Windows10 を普通にアップデートしていれば、WSL は、最初から入っている。
ストアから、Ubuntu18.04 (長期サポート版)などをインストールして、日本語化すればよい

漏れはまだ、古いUbuntu16.04 の方を使っているけど
2019/07/11(木) 18:15:20.64ID:8iBC56G3
>>184
あれは、普段使いのCUIではないからな
単なる開発用
2019/07/11(木) 18:16:22.72ID:8iBC56G3
>>189
XPは標準で入ってて問題になった
2019/07/11(木) 18:29:01.43ID:8iBC56G3
個人的には、*nixとWindowsの違いは、
シェルと馴染んだコマンド群の有無、シェルスクリプトの実行可否だけなので、
それさえできれば、どちらでもいいや。
Cygwinはややストレス溜まったけど、WSLはだいぶ快適になった。
2019/07/12(金) 00:13:06.93ID:Iwx9PgjW
cmdのオプションが/なのは当て付けなんだろうか
XENIXを売ってた頃のMS知らんけど
2019/07/12(金) 00:38:52.25ID:hw+u6C0G
階層がないファイルシステムだと - でも / でもどっちでも違和感が無いのだろう
単に好みでそれにしたってだけじゃないかな
階層があるようになって / を好みで選んで失敗したと思ったけどどうにもならななかったよう
手立ては用意したがサードパーティがそれを使わないとか
2019/07/12(金) 00:54:25.43ID:hw+u6C0G
ああ、どうにもならなかったのは、
オプションを/にしてしまったからとりあえずパス区切りはバックスラッシュにしたよ、でも、/ にもできるよ
だった。オプションを - に変えるのは今でも前のいつでもできるだろうな
コマンドによっては別の意味を持たせてとかありそうだが、なんの拘りなんだかよくわからんな
2019/07/12(金) 08:37:34.85ID:paORMduQ
https://packages.debian.org/ja/experimental/ksh
kshはずっと93uだったはずだが、2020なんてのがでるのか?
2019/07/12(金) 10:59:03.44ID:paORMduQ
同じ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

カーネル関係なさそうなのに、なんでだろう?
2019/07/12(金) 11:04:55.32ID:OtxPhCkg
大きな数の取り扱いの限界が違うのかも
207デフォルトの名無しさん
垢版 |
2019/07/12(金) 12:04:33.46ID:uJ9G3Ton
ディレクトリごとの正確なファイル数が高速に知りたいです。
2019/07/12(金) 12:15:53.93ID:OtxPhCkg
ls より find が早い
再帰ディレクトリ探索とファイル名出力はそれに任せて
その出力をパイプで変換していったらいいんじゃないか?
2019/07/12(金) 12:22:05.68ID:gCudY7G9
なぜduでファイル数も調べられるようにしなかったのか?
2019/07/12(金) 12:22:27.56ID:gCudY7G9
duの作者に問い詰めたい
2019/07/12(金) 12:24:06.88ID:OtxPhCkg
やるべきことは最小限の1つ
UNIXの哲学でしょ

小さいから早い
小さいからパイプでつなげていろいろ実現できる
小さいから保守できる
2019/07/12(金) 12:27:18.37ID:gCudY7G9
その理屈だと、lsコマンドはファイルの名前だけじゃなくて
ファイルサイズまで表示している。

最小限になってない。findコマンドを見習え
って話になるんだがw
2019/07/12(金) 12:28:12.53ID:gpn1wbN7
>>209
ファイルを数えるのはduの仕事じゃないから
2019/07/12(金) 12:30:19.18ID:gCudY7G9
ファイルを数えるのは誰の仕事?

仕事は一番うまくできる人がするべきですよ
2019/07/12(金) 12:32:27.12ID:gCudY7G9
そういやファイル名に改行が含まれる場合、
POSIX準拠コマンド&オプションだけで数えられるの?
2019/07/12(金) 12:35:41.89ID:gCudY7G9
やるべきことは最小限っていったら
duコマンドなんていらんよな

findでファイル検索して、lsでファイルの情報出して
awkで加算すれば良い

パイプでつなげていろいろ実現できる
2019/07/12(金) 12:53:26.46ID:433S/V3Z
>>205
>>206
long doubleを使っているんだと思う。long doubleは昔のx87 fpuで計算されることになるが、これは精度を設定できて、確かデフォルトがlinuxでは80bit、windowsでは64bitになっていたと思う。
2019/07/12(金) 13:00:19.57ID:WQ2UtQMj
>>217
でもWSL版Ubuntuと通常のUbuntuでバイナリは同じはずでしょ?
FPUモードの設定とかあるってこと?
同じ命令でもモードによって精度が違うとか
2019/07/12(金) 13:39:06.41ID:uwyqXnfJ
元々、浮動小数点は誤差があるから、どっちでも良い

誤差無しなら、プログラミング言語で、Decimal などのライブラリを使わないといけない
2019/07/12(金) 13:49:24.26ID:OtxPhCkg
>>212
ls 凄いよね
呼びだした端末の表示限界まで調査して
整列してくれる

最小限だけではものたりないから Emacs とかできたんじゃない?
2019/07/12(金) 13:57:13.80ID:q8HbeEfz
>>207
$ find 〈対象ディレクトリ〉 -type f | wc -l
2019/07/12(金) 13:59:45.00ID:q8HbeEfz
bcコマンド使いなよ。POSIXで定められたほとんど唯一といっていい任意精度演算ができるコマンドだぜ。
残念ながらなぜかUbuntuには初期状態で入っていない……。
2019/07/12(金) 14:11:11.28ID:OtxPhCkg
>>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/
...
2019/07/12(金) 14:17:11.58ID:OtxPhCkg
やっぱりシェルスクリプトのパイプやばい
たった1行の短いのでそこそこ早いのが書きあがっちゃう
2019/07/12(金) 17:35:59.38ID:greuAEFm
>>220
emacsは出自がUnixじゃないから
2019/07/12(金) 18:42:09.14ID:q8HbeEfz
ちなみにPlan 9(Unixの後釜)のlsはもっと洗練された体系になってる。
あとPlan 9のEmacsの手引書がおもしろい
2019/07/12(金) 19:16:50.62ID:13weq3zY
Plan 9の今後のプランは!?
2019/07/12(金) 19:39:49.25ID:gpn1wbN7
Plan 9も最初からGPLで公開していればLinuxと肩を並べてたかもね
2019/07/12(金) 20:39:39.59ID:fylm51D9
>>218
FPU制御レジスタをFLDCW命令で変更すると計算精度や丸め方向が設定でき、同じ命令でも動作が変わる
プログラムが明示的に設定しなければ、当然OSが設定した値になる
230デフォルトの名無しさん
垢版 |
2019/07/13(土) 10:28:41.44ID:H4ToI7wx
>>223
こういうの見るといつも思うんだけど、全部Perl(など)で全部完結して書くのとどっちがいいのかな?
殊に「高速で」条件があるなら。
2019/07/13(土) 10:36:29.63ID:006l8Xk5
>>230
パイプ有利でしょ
なぜなら perl は C の 10% 程の速度
シェルスクリプトの基本ツールは C で書かれているから早い
そしてパイプは並列プログラミングだ
2019/07/13(土) 10:51:01.49ID:Q8eoyE6C
並列「プログラミング」ではないな
単に仕組みとしてプロセスが同時並行しているだけで
2019/07/13(土) 13:12:58.10ID:PcwCdG6p
>>230
どうでもいいけど
>>223は基本的なコマンドで完結してるシェルスクリプトなので
Perlで「全部完結する」というのは対比する表現としてはちょっとおかしく思えるな
2019/07/13(土) 14:39:07.51ID:4CNtNVmB
単機能のコマンドを組み合わせて処理するのがシェルスクリプトだからな
それで速度が遅いだの言うならシェルスクリプトなんか使わなければいい
235デフォルトの名無しさん
垢版 |
2019/07/13(土) 16:01:43.14ID:Lat3oh38
>>223
uniq -cの前にsortしなくていいの?
2019/07/13(土) 16:32:06.44ID:006l8Xk5
>>235
別のところで動かしたらだめだったよ
sort 必要
2019/07/13(土) 16:34:17.14ID:006l8Xk5
ソートはたぶん早くないから
つまりコストが高いから
たぶん定番のあれやったほうがいい

1行ずつ読みこんだそれでハッシュ作って インクリメントしてくあれ
2019/07/13(土) 18:44:37.37ID:Wy302ne8
実はPOSIX sortならsort -uでuniq | sortと同等ことができるのでuniqは実質要らない子
2019/07/13(土) 19:00:08.87ID:Q8eoyE6C
uniqは重複したのを抽出する目的での利用が多いな
純粋にuniqで使う機会の方が極端に少ない
2019/07/13(土) 19:23:10.38ID:56OavmE8
uniq | sortって使い方分かってない奴かよw
uniqくらいソース読んでみなよ
2019/07/13(土) 19:38:16.75ID:Wy302ne8
>>240
そんな揚げ足取らんでも。。。
sort | uniqの間違いです。
2019/07/13(土) 20:35:19.67ID:yaak8A3v
ls .-lのrwxに8進数表記も追加できないかな
2019/07/13(土) 22:25:11.39ID:h6vp2MpA
こんな感じかな

https://wandbox.org/permlink/O0PwxkOoTDVfsMQ9

# スクリプトを直接書いて投稿すると 403 エラーになるな…
2019/07/13(土) 22:28:56.59ID:h6vp2MpA
あ、setuid/setgid/sticky bit のこと忘れてたわ
245デフォルトの名無しさん
垢版 |
2019/07/13(土) 22:47:31.71ID:YCgasS9+
find ~TEST -type f -printf "%h\n" |sort |uniq -c
これは早いわ
2019/07/13(土) 23:30:54.16ID:yaak8A3v
duのファイル版は俺も作ったけど未熟なんでこんな出来に
find ./ -type d -printf "%p " -exec bash -c 'ls -b "{}" | wc -l' \; | sed -r 's/(.* )(\w+)/\2\t\1/g'
2019/07/13(土) 23:43:20.86ID:PcwCdG6p
>>246
見易くていいね!
2019/07/14(日) 00:22:33.01ID:KitiOp9Q
>>244
https://stackoverflow.com/questions/1795976/can-the-unix-list-command-ls-output-numerical-chmod-permissions
awkで頑張れば4桁表示できるらしい
2019/07/14(日) 02:01:57.73ID:ygf6VvPi
>>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; }'

出力
C:/Users/Owner/Documents/Ruby/test
11
C:/Users/Owner/Documents/Ruby/test/a
4
C:/Users/Owner/Documents/Ruby/test/a/b
0
2019/07/14(日) 06:45:35.11ID:GSQZGuhE
stat -c '%A %U %G %z %n' .*
↑こういうのどう? lsのパーミッション表示を8進数に
まあPOSIXに規定されてないけど
2019/07/14(日) 10:08:35.55ID:niuQOGKU
>>245
sort を差し替えた
~/ 対象にしたら倍速

find ~/ -type f -printf "%h\n" | perl -ne '$dirs{$_} += 1; END{for $key (keys %dirs) {printf "%5s %s", $dirs{$key}, $key } }'
2019/07/14(日) 10:11:35.12ID:niuQOGKU
途中だった
最後に | sort -k 2,2 入れても入れなくてもあまり変わらない
やはり指数関数的にsort に大量渡すと遅くなる
2019/07/14(日) 12:30:16.97ID:GSQZGuhE
LANG=Cでやってみ。
254デフォルトの名無しさん
垢版 |
2019/07/14(日) 13:29:14.61ID:VYOKuUQn
POSIX の find って -printf がないのな。
難しいことは -exec でなんとかしろということか。
255デフォルトの名無しさん
垢版 |
2019/07/14(日) 13:32:10.29ID:VYOKuUQn
>>252
perl の中で sort やれば良いのでは?
sort keys %dirs にして。
256デフォルトの名無しさん
垢版 |
2019/07/14(日) 14:08:00.15ID:Vo3Tn1vW
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"
2019/07/14(日) 14:15:10.09ID:niuQOGKU
>>255
そうだね
さらにちょっと早くなった
2019/07/14(日) 15:14:56.46ID:GSQZGuhE
どうせPerl使うんならPerlに用意されているfindコマンド的な関数使えばいいのに。
いや正直Perl書けないので外部コマンドのほうが効率いいのかも知れんけど
2019/07/14(日) 15:43:17.08ID:niuQOGKU
今回たまたま perl が早かったのは
>237
ということ
つまり C は10倍ぐらい早いけど
何十倍も無駄なことやってたら遅くなってしまう

高速な find の出力を |sort |uniq -c したら一応答えでるけど
そのsort がウルトラ処理多い
だったらperl で1行ずつ読んで正しいアルゴリズムで処理したほうが早いだけ
2019/07/14(日) 16:48:51.97ID:XOVWGW1L
perlでソートしてないから
2019/07/14(日) 19:10:07.29ID:BEvjoRaR
なんだperlでソートしたら遅いのか
262デフォルトの名無しさん
垢版 |
2019/07/14(日) 19:11:22.06ID:AAGaqnKC
>>227
Plan無いん
263227
垢版 |
2019/07/14(日) 20:00:20.57ID:QmWR+pGh
>>262
GJ!
2019/07/14(日) 20:02:48.24ID:XOVWGW1L
awk版。ディレクトリ名でソートするなら sort -k2

find . -type f -exec dirname {} + | awk '{c[$0]++}END{for(i in c){printf"%4d %s\n",c[i],i}}' | sort
2019/07/14(日) 20:08:54.86ID:XOVWGW1L
xargs使ったほうが良いかな

find . -type f | xargs dirname | awk '{c[$0]++}END{for(i in c){printf"%4d %s\n",c[i],i}}' | sort
2019/07/15(月) 08:12:50.57ID:jP+0UVPX
どうせなら計測結果も付記してくれよ
267デフォルトの名無しさん
垢版 |
2019/07/15(月) 10:56:15.79ID:Ww8nr7y5
やってることが同じなら、Perlとawkは比較するまでもないのでは?
2019/07/15(月) 12:22:56.47ID:E9YINa1F
数分で書けるのがシェルスクリプトの良いところなんだし
数百万のファイルを何分以内で処理せよとか性能要件があるなら
そもそもシェルスクリプトなんかで書かないわ
269デフォルトの名無しさん
垢版 |
2019/07/15(月) 15:08:49.68ID:3UWFYY1V
高速化するならC言語使うな。
2019/07/15(月) 16:42:34.21ID:jP+0UVPX
なんかシェルスクリプトを貶す人間ってシェルスクリプトを本来の目的とは違う方法で使った結果失敗して
その恨みを自分の無能さではなくシェルスクリプトにぶつけてる印象。
2019/07/15(月) 16:46:57.72ID:tvlJQJn9
このパーツは意外と頻度多いからCで書いておいてもいいかもね
| perl -ne '$dirs{$_} += 1; END{for $key (sort keys %dirs) {printf "%5s %s", $dirs{$key}, $key } }'
2019/07/15(月) 19:25:46.44ID:jP+0UVPX
端末の応答(例えば$ printf '\e]11;?\e\\'で返ってくる\e]11;rgb:〈赤〉/〈緑〉/〈青〉\e\\っていう文字列)を
sedやらなにやらで加工できるように標準出力に流したいんだど
そのままの状態だと端末そのものに文字列が渡ってしまって加工できない。
$ printf '\e]11;?\e\\' | od
みたいにすると(当然だけど)\e]11;?\e\\という文字列がパイプを通ってしまう。

個人的にはsttyとかをうまくやりくりしたらいけそうな気もするのだけど
そういう文書や記事がないのと俺があまり端末の処理に詳しくないのとで今のところ成功していない。
端末応答を標準出力として処理できる方法知らないですかね。
2019/07/15(月) 19:47:51.35ID:iDG/5azN
>>272
色というものが何者かわかってないんじゃね?

色を付けるためのエスケープシーケンスっていうのは、
エスケープ文字、ASCIIコード表でESC(0x1B)の文字8進数だと033
ESC文字から始まる一連の文字列の流れ(シーケンス)ってだけだよ
だから0x1Bで始まるその文字列を加工すりゃ良い。

\e]11;の ]11;は単なる文字だけど、\eは(シェルによりけりだが)
0x1Bの文字に置き換わる。だからsedなんかで\eを見つけようとしてもだめ
そんな文字列は流れてこないんだから
2019/07/15(月) 19:59:18.87ID:jP+0UVPX
>>273
あー。いやそうじゃなくて 端末の応答を取得したいんよ。
試しに
$ printf '\e]11;?\e\\'
ってやってみて。多分端末の上に
^[]11;rgb:0c0c/0c0c/0c0c^[\
みたいな文字列が表われる。
この文字列をtestコマンドの対象にしたりしたい。
でも普通の方法ではこの文字列は標準出力ではなく端末の上に直接出力されてるから
そういう加工ができない。
2019/07/15(月) 20:00:57.13ID:iDG/5azN
>>274
話の内容を単純化しよう。
文字の内容は今どうでもいい話だろ?

printf 'hogehoge' ってやってみたら
端末の上に、hogehoge って表示されるな?

それでこの文字列をどうしたいって?
2019/07/15(月) 20:20:16.67ID:f1G4msuO
わかってない奴が話に絡んでいくなよ
文字列なんか関係ない
奴はttyの出力(もしくは入力)を横取りしてパスワードを盗みたいという話をしてる
2019/07/15(月) 20:21:36.85ID:iDG/5azN
$ printf '\e]11;?\e\\' の話だろ?
2019/07/15(月) 21:13:36.27ID:f1G4msuO
ぜんぜん違う
2019/07/15(月) 21:15:41.25ID:iDG/5azN
>>278
試しに
$ printf '\e]11;?\e\\'
ってやってみて。
2019/07/15(月) 21:21:51.85ID:qldwvqW5
>>276
パスワードだとしたら、出力には返ってこないから横取りもできないんじゃね
パスワード生で出力するようなアレでなければ
2019/07/15(月) 21:35:01.81ID:f1G4msuO
>>280
だから入力って書いたじゃん
エコーバックやめるタイミングを捕まえて入力側をだな
まあいいや、俺も答え知らないしw
2019/07/15(月) 21:42:13.41ID:qldwvqW5
>>274
そういうのが出る Terminalアプリ もあるし出ないのもある
Terminalアプリが出しているんでしょ、その エスケープシーケンスを Terminalの画面制御 のために
Terminalアプリの作りによるんじゃないかなあ、また、Terminalアプリで何か提供してなきゃダメなんじゃないかなあ

>281
そもそもは出力をだから出力で入力をは無理だな。エコーバックは今時はローカルではしてないんじゃね、パスワードを生で表示だろしw
2019/07/15(月) 22:20:41.82ID:qldwvqW5
なんのエスケープシーケンスなのか知らずにだったが、OSC Operating System Commandつうのね。で、制御ではなくてリポート(情報)なのね
Teminalアプリは、それを相手(シェルプログラム)への入力として出力しているのでできそうか
2019/07/15(月) 22:24:08.87ID:EBIcrGzb
ls結果をテキストエディタで開いた時[0mだらけで焦った思い出
ANSIカラーコードって正規表現で消せるのかしら
2019/07/15(月) 22:38:58.41ID:tvlJQJn9
消してみた
ほぼ消えたといって問題ないのでは?
https://i.imgur.com/rV7A7JG.jpg
2019/07/15(月) 22:54:17.82ID:qldwvqW5
>>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

試行錯誤中だけど、こんなんで取れてる
2019/07/15(月) 22:55:24.82ID:jP+0UVPX
>>275
その文字列はパイプで処理できるじゃん。
例えば
$ printf 'hogehoge' | sed -e 's/hoge/fuga/'
でも端末応答の文字列はそういう処理ができないのよ。
試してみると分かる。
2019/07/15(月) 22:59:10.56ID:jP+0UVPX
>>286
すげえ!ありがとう!
なるほどなぁ。readコマンドで対処するのか……。
全然文字列が取得できなくて悩んでたからマジで助かったわ。
2019/07/16(火) 01:24:24.20ID:b8YViJ87
こんな感じかなぁ

$ stty -echo;printf '\e]11;?\e\\'; IFS=';' read -r -d '\' _ bgcolor;stty echo
$ echo $bgcolor
rgb:3232/3232/3232
2019/07/16(火) 01:27:52.36ID:b8YViJ87
あ、尻尾に ESC(0x1b) が付いてるから適当に削ってちょ
2019/07/16(火) 02:07:13.54ID:6ZdisLnD
>>290
末尾のESC \は端末が返す文字列の仕様だから問題ないと思う。
というか応答の形式が
ESC ] 11;rgb/3232/3232/3232 ESC \
↑こういう感じ。
2019/07/16(火) 16:37:09.91ID:6ZdisLnD
シェルスクリプトでラムダ計算を実装するとしたらどんなインターフェースがいいんだろう。

lambda -x @ 'echo @ | tr "[A-Z]" "[a-z]"'
でもこれだとこの後に適用したい変数を持って来たときにlambdaコマンドの引数と見分けがつかなくなる…。
2019/07/16(火) 16:40:13.19ID:cpfSTA9t
パイプつなげるのが普通だから
xargs とか
なんか {} みたいなのでこれまでのパイプの流れてきたのを表現する
コマンドがあったからそれでいいんじゃないか?
2019/07/16(火) 16:55:42.40ID:zaQ9s3Gk
>>292
何が問題なのかわからんけど、

1. ラムダ計算だとしてlambdaコマンドに引数なんているの?
2. 'echo なんたら' の前がlambdaコマンド引数、後ろがechoの引数でいいだろ?
3. 'echo なんたら' で区切れない場合、-- で区切るのがよくある実装方法

って言っておくよ
2019/07/16(火) 17:34:51.11ID:6ZdisLnD
>>293
そうそう。xargsみたいなのを妄想してるw
2019/07/16(火) 19:39:35.56ID:6ZdisLnD
>>294
例えばPython3のラムダ計算だと
(lambda x: x * x)(3)
みたいな形式じゃん。
キーワードlambdaをコマンド
変数宣言x:を、どんな変数を扱うかというオプション
(xargsで言う-I)
演算本体のx * xは被演算子
としてみた。
297デフォルトの名無しさん
垢版 |
2019/07/17(水) 23:26:41.26ID:ySrAQEz0
このラムダ計算は偽物だ。食べられないよ。
また明日来てください。僕が本当のラムダ計算をお見せしますよ。
2019/07/17(水) 23:47:22.37ID:ycSiezB+
このラムダは食べられないよ。ラムダこりゃ〜
2019/07/17(水) 23:56:54.05ID:Lq1+nMLH
>>297
楽しみにしております ^ ^;
300デフォルトの名無しさん
垢版 |
2019/07/18(木) 11:57:22.02ID:BkvY1rKv
>>297
本物のラムダ計算はよ。
2019/07/18(木) 11:58:54.05ID:832IkKkF
いくら待ってもムラダ。
2019/07/18(木) 14:21:32.04ID:BkvY1rKv
なんだ虚勢だったのか。
2019/07/18(木) 17:02:47.87ID:ugDCzjFC
シェルスクリプトでラムダ式ってどんな場面で便利なの?
普通に関数定義すれば事足りると思うんだけどな
2019/07/18(木) 17:23:35.77ID:vfPv5uwZ
https://www.sejuku.net/blog/23677#lambda
> #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
2019/07/18(木) 17:25:39.32ID:Nv4mVpEC
bash の mapfile にある callback みたいなもん?
2019/07/18(木) 19:06:15.61ID:ugDCzjFC
数値計算ならbcに直接渡すし
文字列を加工するラムダ式はbcで処理できないし
必要性を感じたことないんだよね
2019/07/18(木) 19:08:03.03ID:BkvY1rKv
>>304
すごいけど
数値計算に限定されるのが残念な仕様だね。
2019/07/18(木) 19:17:03.16ID:DPDlMznj
>>307
へ?数値計算に限定するならもっとシンプルに書けるよ
これだけにできる

lambda '$1 + ($1 * $2)"' 100 0.08

数値計算に限定してないから呼び出し側にechoとかbcが埋め込まれてるんだけど?
2019/07/18(木) 19:21:15.11ID:DPDlMznj
lambda関数は>>304のままで小文字を大文字にする例

lambda 'echo "$1" | tr "a-z" "A-Z"' abc
2019/07/18(木) 19:28:37.52ID:DPDlMznj
ラムダで用いる計算式は通常短くなるから、
$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

第一引数が:で区切られた変数名、第二引数が計算式、残りが引数と簡単に見分けられる
2019/07/18(木) 19:41:15.10ID:DPDlMznj
数値限定で引数全てに計算式を適用して返す例(笑)

map() {
 formula="$1"
 shift
 while [ $# -gt 0 ]; do
  eval "echo \$(($formula))"
  shift
 done
}
map '$1 * $1' 1 2 3
2019/07/18(木) 19:53:59.13ID:ugDCzjFC
書き方が煩雑になるだけでメリットないんじゃね
やりたいこと素直に書けばいいじゃんって思ってしまう
2019/07/18(木) 19:54:42.45ID:DPDlMznj
まあ、それはラムダ計算そのものが言われていることだからw
シェルスクリプトの話ではないね。
2019/07/18(木) 20:03:10.85ID:ugDCzjFC
ラムダ式って簡潔に書けるのがメリットでしょ
コード量増えるのなら本末転倒だよね
2019/07/18(木) 20:09:12.09ID:DPDlMznj
簡潔に書けてるよw

map '$1 * $1' 1 2 3

ただ違うのはシェルスクリプトにはそれようのライブラリがないだけ
ここで例示したようなmapみたいなライブラリ集ができたら
もっと便利になると思う
2019/07/18(木) 20:15:16.65ID:DPDlMznj
というか、普通の言語のラムダ式だと、こんな感じで変数が出てくるけど

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) こうなる
2019/07/18(木) 20:17:43.55ID:ugDCzjFC
クロージャの概念がないシェルスクリプトは
ラムダ式の真価を発揮する場面は無いだろうね
2019/07/18(木) 20:22:14.60ID:DPDlMznj
無いっていうのは出来ないんじゃなくて
用意されてないって意味だけどな

実はPOSIX標準でも一つだけクロージャーが使われてる。
それがtrap

trap 'echo trapped; exit 1' INT

みたいな書き方ができる
2019/07/18(木) 20:55:40.78ID:BkvY1rKv
ていうか(ほぼ暴論だけど)シェルスクリプトだってオブジェクト思考っぽいことはできる訳だし
単に「向いている処理」「向いていない処理」があるってだけ。

シェルスクリプトでラムダ式は書けるけど、シェルスクリプトはラムダ式を扱うのには向いていない。
2019/07/18(木) 21:16:40.14ID:DPDlMznj
そんな難しく考えるなよw
trapの例もあるんだし、使うのが適切な場合に使えば良いいんだよ
2019/07/18(木) 21:28:25.20ID:KBi6m+gV
map は意外と使い道がないんだよな
lisp 以外では意外と実装されていない
2019/07/18(木) 21:33:57.01ID:DPDlMznj
実装されてない言語のほうが珍しいだろw
2019/07/18(木) 21:36:48.83ID:DPDlMznj
mapがある言語

Python、Ruby、Perl、JavaScript、C#(LINQのSelect)
思いついたものだけ
2019/07/18(木) 21:42:27.79ID:ugDCzjFC
trapってただのイベントハンドラだよ
引数渡したり戻り値受け取ったりできないじゃん
2019/07/18(木) 21:52:45.54ID:DPDlMznj
trapはイベントハンドラじゃない。
シグナルに対してイベントハンドラを設定するもの

引き数渡したり戻り値受け取ったり出来ないのは
trapの制限であってイベントハンドラの制限じゃない
2019/07/18(木) 22:00:05.94ID:ugDCzjFC
言いたいのはクロージャの話してるのにtrap 持ってくるのは筋違いってことだ
2019/07/18(木) 22:03:45.58ID:DPDlMznj
別に筋違いでもない。戻り値は(標準)出力と上で書いたが、
trapで出力したものは画面に表示される。
328デフォルトの名無しさん
垢版 |
2019/07/18(木) 23:59:39.80ID:SGv/emwF
「mapは意外と使い道がない!lisp以外では意外と実装されていない!!(キリッ」
2019/07/19(金) 01:30:43.88ID:/UdqfCLD
正直>>321のmapの話は無知だなと思ったけど(めちゃめちゃ実装言語があるので)
そうやって煽ることしかできない君より100万倍有意義な発言だったよ。
330デフォルトの名無しさん
垢版 |
2019/07/19(金) 01:49:27.68ID:7Hdy7m6i
>>323
Kotlin もよろしく
2019/07/19(金) 02:44:48.56ID:ApXEphk2
map 縛ると高階関数で書きにくい
332デフォルトの名無しさん
垢版 |
2019/07/19(金) 08:55:46.76ID:MqWaI42B
>>329
本人乙。
勉強になったなw
次からはあんま調子乗らないよう気を付けろよ?ww
2019/07/19(金) 09:10:54.61ID:mIHotaYe
第13話 本物のラムダ計算(完)
334デフォルトの名無しさん
垢版 |
2019/07/19(金) 10:16:54.74ID:uab/wKdg
Cだとqsort()とかがラムダになるのかな。
2019/07/19(金) 10:47:40.54ID:pw5qcQRZ
map が有効な例はどんな時?
2019/07/19(金) 11:16:36.30ID:ApXEphk2
集合XからYに写像を持つ関数fがあれば
Y = f(X) と書ける
これを満たす x, yは
y = f(x) で表わせる

数学だとこんなかんじだが
プログラムなら
Y = map f X のような感じでいっきに変換できる

map 使わないで、古典的なループを書くと
for my $x (@X) {push @Y, &f(x)}
のような具合になるが、x, push など本来不要な変数や操作を中継するため
コードが肥大化する
2019/07/19(金) 11:33:07.63ID:/UdqfCLD
>>332
いや俺>>321じゃないけど…w
2019/07/19(金) 11:37:49.93ID:/UdqfCLD
>>336
Y = f(X)って書き方は数学ではあんましねーな。
f: X → Yという風に書く。
ラムダ計算は
f: x ∈ X ↦ y ∈ Yに対して
(λ x ∈ X. y ∈ Y)のことを言う。
↑こうすると
f(x) = yっていう「普通の」関数適用が
(λ x. y)(x) = y
というように「f」という新規記号を用いずに表せる。
ここから>>336の後半に続く。
2019/07/19(金) 11:47:33.02ID:/UdqfCLD
>>316
たしかにそう言われるとシェルスクリプトのほうが
短かいっちゃ短かいな。
変数名が固定されることが有利に働くとは。
2019/07/19(金) 12:35:59.70ID:mIHotaYe
>>339
perlのsortの場合、$a、$b固定になってる
https://perldoc.jp/func/sort

my @articles = sort {$a cmp $b} @files;

perlの場合、関数の引数は$_[0]、$_[1]で取れるのだが
そうすると、sortの外の$_[0]、$_[1]になってしまう。

文字列にしてevalしちゃえば同じことはできると思うがそれでも長くなっちゃうしな。
my @articles = sort '$_[0] cmp$_[1]' @files;

このために$a、$bをグローバル変数としているようだが、Perlはダイナミックスコープを
使えるからローカル変数にできるんじゃないかな? 互換性のためにそうなっているのかも
2019/07/19(金) 14:53:58.91ID:pw5qcQRZ
>>336
一気に変換できるとありがたい例が
具体的に思いつかないのですか
342デフォルトの名無しさん
垢版 |
2019/07/19(金) 15:35:22.89ID:uab/wKdg
>>341
有り難いと言うか、記述が短くなったり、余計な変数を使わなくてよくなったり、連結して書けて分かりやすくなったりという利点があるかな。
2019/07/19(金) 15:43:06.00ID:ApXEphk2
>>341
集合を扱うのに適した型がない言語、perl などを例にすると
後ろの方を見るのに時間がかかる大きなリスト素早く参照するハックとして
>271
のようにハッシュに打ちこむ手法がある
シェルスクリプトのワンライナーだと1行ずつ入ってくるけど
perl コード内なら簡潔に書けるし、たぶん map の部分が C で書かれてて
速度が出ることが覆い

このタイプの高速な手法としてはシュワルツ変換が有名
|sort -k 2,2
に相当するやつ
2019/07/19(金) 16:04:19.10ID:S0JoFjeS
>>340
心配しなくてもその $a と $b はダイナミックスコープなローカル変数だよ。
レキシカルスコープでなければローカル変数じゃないという意見もあろうが。
2019/07/19(金) 17:47:07.68ID:mIHotaYe
>>344
リンク先にはグローバルって書いてある。
下の方にごちゃごちゃ書いてあるけど、ちょっと今読みたくないやw
2019/07/19(金) 19:32:30.99ID:LTHpRmEj
ていうかシェルスクリプトの関数って(少なくともPOSIXの範囲では)広域定義で
システムのコマンドと同じ名前空間(名前空間なんて一つしかないけど)で定義するしかない。
だからラムダ式に代表される無名関数は寧ろシェルスクリプトのような言語で重宝するかも知れない。
でも可読性や保守性を考えると一般的でない書き方なので多用は控えたほうがいいかな。
2019/07/20(土) 02:10:15.33ID:RMeQOh+3
>>345
もちろんそのリンク先に書いてある。……下から 21 行目に。(空行を除く)
2019/07/23(火) 15:21:00.97ID:vatz3/hX
シェルスクリプトで引数が整数であることを判定する可搬で高速な方法ってなんだろう
思い付いたのは
isint() {
case "$1" in
[0-9][0-9]*) printf '%d\n' $1 ;;
*) return 22 ;;
esac
}

…ところで$1がないときは標準入力から値を取得するっていう操作ってどう実装するんだろう?
2019/07/23(火) 15:29:05.59ID:+7TCISw6
>>348
標準入力かどうかは
けっこうシェルスクリプトとperlは同じような書き方する部分があるから
こんな構文がありそうだ
https://pastebin.com/0wXLeenr

あとそれだと負の数が抜けてる。数字の前に マイナス記号がついている可能性がある
2019/07/23(火) 15:31:44.56ID:ecacfG7E
case $1 in # $1にダブルクォートはいらない
 *[!0-9]* ) ;; # 数字以外が含まれている = 整数ではない
 *) ;; # それ以外 = 整数である
esac



if [ $# -eq 0 ]; then
 read -r data
else
 data=$1
fi
とかいろいろ
2019/07/23(火) 15:32:56.13ID:ecacfG7E
> 数字の前に マイナス記号がついている可能性がある

case ${1#-} in

こうすればよい
2019/07/23(火) 15:36:47.54ID:ecacfG7E
$1があるかどうかじゃなくて、echoなどで流し込まれているかどうかなら

if [ -t 0 ]; then
 # 流し込まれてなどいない
else
 # 流し込まれている
fi
2019/07/23(火) 15:43:42.61ID:ecacfG7E
所でcaseって戻り値を返すって知ってる?

isint() {
 case $1 in
  *[!0-9]* ) false ;;
  *) true ;;
 esac
}

if isint 1; then
 echo int
fi

とか、

if case $1 in *[!0-9]* ) false ;; *) true ;; esac; then
 echo int
fi

とか

if ! case $1 in *[!0-9]* ) false; esac; then
 echo int
fi

とか書けるよ
2019/07/23(火) 15:47:46.96ID:ecacfG7E
> if ! case $1 in *[!0-9]* ) false; esac; then
間違えたw !いらない

最短かな?
if case $1 in *[!0-9]*) false; esac; then
echo int
fi

ワンライナーw
isint() { case $1 in *[!0-9]*) false; esac; }
2019/07/23(火) 15:50:04.40ID:ecacfG7E
あ、空文字のときにintになるね。こうすればよい

isint() { case $1 in ''|*[!0-9]*) false; esac; }
2019/07/23(火) 15:50:25.78ID:h7ECSrMt
expr "$1" + 0 >/dev/null 2>&1
echo $?

というのもありかと思ったけど、MAXINT(2^32or2^64)以上になると
エラーになる(exit status 3)からダメか
357348
垢版 |
2019/07/23(火) 16:11:28.72ID:vatz3/hX
みなさんありがとうございます。
↓助言を参考にさしてもらってこういう形にしました。
isint() { set -- "$1"
case ${1#-} in
''|*[!0-9]*) return 22 ;;
*) true ;;
esac
}
「$1が設定されていなければ標準入力を$1に」というのはシェルスクリプトでは
実現が難しそうなので諦めます。
2019/07/23(火) 16:12:19.43ID:ecacfG7E
if case $1 in *[!0-9]*) false; esac; then
 echo int
fi

こっちのほうが短いかw
case $1 in *[!0-9]*) :;; *)
 echo int
esac
359348
垢版 |
2019/07/23(火) 16:15:37.53ID:vatz3/hX
……と思いましたが良い感じの構文を思い付きました。
isint() { set -- "${1:-"$(cat)"}"
case ${1#-} in
''|*[!0-9]*) return 22 ;;
*) true ;;
esac
}
これでどうでしょうかね。もし$1が設定されていなければcat(1)が実行されて
cat(1)には引数が渡っていない(この時は$1が設定されていない)ので
If no file operands are specified, the standard input shall be used.
(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cat.html)
に従って標準入力が読み込まれてset -- 〈標準入力の内容〉となって$1に標準入力が設定される。
2019/07/23(火) 16:15:43.02ID:ecacfG7E
trueはさっき俺が書いたけど、別にいらない

isint() { set -- "$1"
case ${1#-} in
''|*[!0-9]*) return 22
esac
}

> 「$1が設定されていなければ標準入力を$1に」というのはシェルスクリプトでは
こっちも書いたはずだが? cat "$1" or cat "/dev/stdin" の話でもしてたのか?
2019/07/23(火) 16:16:28.44ID:ecacfG7E
cat呼び出しは遅いから、read使ったんだが?
2019/07/23(火) 17:17:45.59ID:vatz3/hX
>>361
申し訳ないです。完全に見落してました。
363デフォルトの名無しさん
垢版 |
2019/07/23(火) 23:34:58.45ID:JEktaXSk
npmでシェルスクリプトだけのパッケージを配布してもOKですか? 
2019/07/24(水) 01:15:44.75ID:ArGZw8p9
npmスレに。
2019/07/24(水) 21:22:10.25ID:ArGZw8p9
>>361
catとreadってたった一行読み込むのにそんな差ある?
2019/07/25(木) 02:49:23.09ID:WafvXnG3
1行だからcatが遅いんだろ
367デフォルトの名無しさん
垢版 |
2019/07/25(木) 02:51:27.80ID:muDuQw8n
ついcatなって言った
2019/07/25(木) 08:46:34.39ID:m8sWcejF
こawkあいはしていない。
2019/07/25(木) 14:59:51.08ID:VsjL1nxe
sedで質問です。

置換前
(a0b1c2=99999) (a0b1c2=00000)

置換後
DATA1=99999 DATA2=00000

こんな感じに置換したいです。
カッコと接頭辞みたいなのを除去した上で、
行の1つめはDATA1に、2つめはDATA2に置換したいという意味です。
何卒ご教示ください。
2019/07/25(木) 15:04:52.21ID:D8pzUtDE
(
[a-zA-Z0-9]
=
[0-9]+
)
こんな形のデータか?
2019/07/25(木) 15:09:40.46ID:D8pzUtDE
暫定これ
echo "(a0b1c2=99999) (a0b1c2=00000)" | sed -n 's/([a-zA-Z0-9]\+=\([0-9]\+\)) ([a-zA-Z0-9]\+=\([0-9]\+\))/DATA1=\1 DATA2=\2/gp'
DATA1=99999 DATA2=00000
2019/07/25(木) 15:11:16.41ID:VsjL1nxe
>>370
すいません、話を簡単にするため>>369は端折ったんですが、
端折らない方がよさそうなので元データそのまま書きます。
わかる人にはわかるかもしれませんが、VMwareのAPIから取ってきた値です。

guest(01) %!s(int32=110) %!s(int32=3625)

これは左からゲスト名、各ゲストのCPU使用量(MHz)、メモリ使用量(MB)です。
これを
guest(01) CPU=110 Memory=3625
こんな感じにしたいなと思っています。
最初はsedの単純な置換とパイプで何とかしようとしたんですが、
ゲスト名にもカッコが使われてる(のが除去されちゃう)という部分が回避できませんでした。
2019/07/25(木) 15:20:38.81ID:D8pzUtDE
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | sed -n 's/\S\+([a-zA-Z0-9]\+=\([0-9]\+\)) \S\+([a-zA-Z0-9]\+=\([0-9]\+\))/DATA1=\1 DATA2=\2/gp'
guest(01) DATA1=110 DATA2=3625
これで間にあう?
2019/07/25(木) 15:22:34.93ID:D8pzUtDE
失礼しました
最後のCPU, Memoryに書きかえて
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | sed -e 's/\S\+([a-zA-Z0-9]\+=\([0-9]\+\)) \S\+([a-zA-Z0-9]\+=\([0-9]\+\))/CPU=\1 Memory=\2/g'
guest(01) CPU=110 Memory=3625
2019/07/25(木) 15:27:23.74ID:hsvk8oNq
>>361
パイプにテキストファイルの中身を流し込んで逐次処理するとき、
cat "hoge.txt" | 〜 のほかに、
echo $(< "hoge.txt") | 〜 とか、
lessなどのページャー読み込みでもできるけど、
どうするかいつも悩むなぁ。

grepなどの、ファイル読み込みオプションのあるコマンドが先頭ならそれを使えばいいけど、
そうでない場合は、みんなどうしてる?
2019/07/25(木) 15:44:25.16ID:qx5YGZv4
>>375
何故 < hoge.txt じゃ駄目なの?
2019/07/25(木) 15:57:19.67ID:VsjL1nxe
>>374
できました!ありがとうございます!
高度すぎて何やってるのかさっぱり理解できてませんが、
じっくり解読させていただきます。
2019/07/25(木) 17:02:25.09ID:hsvk8oNq
>>376
複数のパイプを繋げた逐次処理の場合に、
処理元のファイルが何であるかを明確にしたいので、
すべてのパイプの先頭に持っていきたいんだよ。

ファイル読み込み | 処理1 | 処理2 | 処理3…
2019/07/25(木) 17:18:56.17ID:vvE0ECJG
俺なら
< hoge.txt cmd1 | cmd2 | cmd3 ...
と書く
2019/07/25(木) 17:34:33.11ID:hsvk8oNq
>>379
ほぉ、リダイレクトって、コマンドの前にもってこれるんだ。ありがとう。
これならとりあえず、ソースを明確にできるね。
しかもおそらく一番処理が速いかな。

catを使った方法のような、単に読み込むだけのコマンドの高速版みたいなのはないのかなぁ。
2019/07/25(木) 18:20:54.41ID:D8pzUtDE
>>377
正規表現は実行可能な回戦ノイズになりやすいから、
複雑なものは、可能なら perl を薦める
バックスラッシュの頻度も下がり、空白で単位ごとに分けられ読みやすい
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | perl -pe 's{ \S+ \( [a-zA-Z0-9]+ = ([0-9]+) \) \N{SPACE} \S+ \( [a-zA-Z0-9]+ = ([0-9]+) \) }{CPU=$1 Memory=$2}xg'
guest(01) CPU=110 Memory=3625

sedの正規表現にはいくつか注意すべきことがあると思う
match部の
( が 文字どおりの ( にマッチする
\( が あとで \1 \2 で使う為のキャプチャの括弧になる。
\+ が1つ以上の という個数指定になる
2019/07/25(木) 18:41:30.57ID:m8sWcejF
……Perlも十分読み難いと思うのは俺だけだろうか…
2019/07/25(木) 18:52:29.83ID:I5POGkj3
perl が使えるような環境なら sed -E 使えるんじゃね?
2019/07/25(木) 19:47:46.86ID:D8pzUtDE
>>382
もっと分かりやすそうに書いてみた
今度はどうだ?
echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | perl -pe ' $pattern = q{ \S+ \( [a-zA-Z0-9]+ = ([0-9]+) \) } ; s/$pattern \N{SPACE} $pattern/CPU=$1 Memory=$2/x'
guest(01) CPU=110 Memory=3625
385デフォルトの名無しさん
垢版 |
2019/07/25(木) 21:09:49.52ID:AjtfUs9C
>>384
$pattern への値の代入は一回で良いので BEGIN { ... } の中に入れた方が効率が良くなる。
(勝手に最適化されて最終的には大差なくなってしまうかも知れないけどね)。
2019/07/25(木) 22:22:57.77ID:1GqrqsZl
これぐらいのの複雑さになると、perl でちゃんと改行、インデントして
書いた方がいいような気がする
2019/07/26(金) 00:44:50.95ID:16gdYth6
シェルスクリプトは関数型だとかアホなこと言ってるブログがあった
2019/07/26(金) 10:46:37.80ID:54Ib42km
Ruby では、

def get_value( str ) # = ) の間にある文字列を取得する
pos_1 = str.rindex "=" # 文字を末尾から探す
pos_2 = str.rindex ")"
str[ pos_1 + 1 ... pos_2 ]
end

str = 'guest(01) %!s(int32=110) %!s(int32=3625)'
ary = str.split # 空白で区切る
# ["guest(01)", "%!s(int32=110)", "%!s(int32=3625)"]

puts "#{ ary[ 0 ] } CPU=#{ get_value( ary[ 1 ] ) } Memory=#{ get_value( ary[ 2 ] ) }"
# guest(01) CPU=110 Memory=3625

1-liner では、
ただし、途中で改行したので、1行にしてください!

echo 'guest(01) %!s(int32=110) %!s(int32=3625)' | ruby -ne 'def get_value( str ) pos_1 = str.rindex "="; pos_2 = str.rindex ")"; str[ pos_1 + 1 ... pos_2 ] end;
ary = $_.split; puts "#{ ary[ 0 ] } CPU=#{ get_value( ary[ 1 ] ) } Memory=#{ get_value( ary[ 2 ] ) }"'
389デフォルトの名無しさん
垢版 |
2019/07/26(金) 12:22:34.47ID:AGnOcgvd
>>388
死ね
2019/07/27(土) 10:41:07.02ID:6v++aFZ1
上の方の数値判定だけどマイナス記号を考えない(つまり正整数だけを判定する)のなら
[ ! ${var%%[0-9]*} ]
これが最速で(記述も)最短じゃなかろうか。
391デフォルトの名無しさん
垢版 |
2019/07/27(土) 11:54:57.07ID:z4Poa3yK
真っ直ぐに一直線ですか?
2019/07/27(土) 13:52:23.75ID:QzyB/IP7
>>390
シェルのパターンマッチングでの '*' って any string の意味なので、

$ var='10abcdefg'
$ [ ! ${var%%[0-9]*} ] && echo integer
integer

となってしまう。bash の extglob を使うなら、

$ [ ! ${var%%?([-+])+([0-9])} ] && echo integer

などと書ける(空文字の場合に対応してないけど)。
2019/07/27(土) 15:15:37.83ID:6v++aFZ1
>>392
おうマジだ。
なぜか英字のみと数字のみの変数で試してたから気付かなかったw
恥かしすぎるw
2019/07/27(土) 19:04:12.75ID:6v++aFZ1
突飛なことはせずcase分使うのが一番いいのかな。
正直、俺だったらそもそも「型」の概念が必要になるようなプログラムは
シェルスクリプトで書かないけど
395デフォルトの名無しさん
垢版 |
2019/07/28(日) 00:29:26.94ID:LPR+u+AV
* は、シェルスクリプトでは、0文字以上の任意の文字列で、
正規表現では、直前の文字の0回以上の繰り返し

正規表現を使うのなら、egrep, grep -e でフィルターしないといけない

egrep '正規表現'

これもシェルで解釈されないように、シングルクォーテーションで囲む方がよい
2019/07/28(日) 00:33:37.21ID:7n7RswoS
perlは正規表現しか知らんが構文は結構読みにくいのね
pythonやruby辺りやった方がいいのかな
簡単なシェルスクリプトを書いたりsedやawkで弄ったりはしてるけど
2019/07/28(日) 01:42:13.12ID:/N9EqgUo
シェルスクリプトとしてはワンライナーが短く書け、
カオスも含めた無限のような表現力のあるperl を薦める
seq 30 | perl -0777 -ne 'print $_ =()= /1/g'
13
2019/07/28(日) 02:18:58.47ID:UCGA8APU
seq 30 | tr -dc '1' | wc -c

でいいんじゃね
2019/07/28(日) 02:37:29.23ID:/N9EqgUo
旨い
2文字以上じゃないことを利用する柔軟性見事
2019/07/28(日) 03:11:34.56ID:vKAr7iFy
>>397
>>398
この二つって1から30までの間に何回1が登場するかを数えてるの?
2019/07/28(日) 04:13:22.82ID:/N9EqgUo
はい
2019/07/28(日) 04:28:55.80ID:LPR+u+AV
Ruby では、1 の個数を数える

seq 30 | ruby -e 'puts ARGF.read.count( "1" )'
#=> 13
2019/07/28(日) 04:30:02.41ID:vKAr7iFy
何の意味があんの?
Perlだと複雑に書けるよってこと?
2019/07/28(日) 04:37:14.85ID:UCGA8APU
1 を数えたいなら

$ seq 30 | grep -o 1 | wc -l
2019/07/28(日) 10:48:09.20ID:/N9EqgUo
きっと見たこともない構文だと思って書いた
しかし、ここに多く書かれるより短いワンライナーより長いので
全然良くなかった

本当は「普通は思い浮かばない書き方の中に
短く書けるような可能性がある」と思わせたかったけど
力不足だった
406デフォルトの名無しさん
垢版 |
2019/07/28(日) 11:51:54.16ID:V62sQMom
改行を無視して検索は?
2019/07/28(日) 12:45:34.52ID:/N9EqgUo
3行以上にまたがる複数行?
2行まで?
408デフォルトの名無しさん
垢版 |
2019/07/29(月) 21:57:36.07ID:LpaqQy0x
PowerShell では、

$matches = 1..30 | Select-String "1" -AllMatches

$matches.Matches.Count

#=> 13
2019/07/30(火) 00:35:05.01ID:TDafWW+v
PowerShellって嫌われてるけど結構便利だよね。
でも使い熟せる自信も気力もないw
2019/07/30(火) 07:02:14.50ID:lWAzz/KK
PowerShellってどういう場面で使われるの?
Bash使わないでPowerShell使うことってあんの?
2019/07/30(火) 07:18:22.77ID:RYwsY7rK
windows update からの shutdown
でも十分便利そうだ
UIがことごとくGUIだから
砂漠の水のように利くんじゃないか?
2019/07/30(火) 07:51:48.49ID:TDafWW+v
喩えが文学的すぎて分からん
413デフォルトの名無しさん
垢版 |
2019/07/30(火) 18:08:45.58ID:EUusSyFO
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14

doshってなに?
2019/07/30(火) 18:16:09.63ID:fdfPnQnm
Remove-Item、Copy-Itemとか生理的に受け付けない体になってる。
2019/07/30(火) 18:28:39.62ID:R+5nd6EU
>>413
DOcker SHell
416デフォルトの名無しさん
垢版 |
2019/07/30(火) 18:34:09.08ID:EUusSyFO
時代からしてそれはないだろ
2019/07/30(火) 19:37:33.76ID:6/Ph+fdB
>>408
オシャレだ
2019/07/30(火) 20:50:28.04ID:TDafWW+v
>>413
簡単にWebを検索してみてそれらしい記述を一件のみ見付けた。ほんとにこれがdoshの由来かは知らん。

OpenSolarisのBシェルから派生したSchily Bourne ShellというUnixシェル
http://schilytools.sourceforge.net/bosh.html
によると
* dosh builtin that allows to implement parametrized aliases.
らしい。
419418
垢版 |
2019/07/30(火) 20:57:36.54ID:TDafWW+v
https://unix.stackexchange.com/a/223935
ここでも同じようなことを言っている。
dosh組込み命令を実装したうんぬん。

しかし肝心要のSolaris Bシェルの手引書
https://docs.oracle.com/cd/E56342_01/html/E54074/jsh-1.html
にはその記述が見当らず……。どゆこと???
420デフォルトの名無しさん
垢版 |
2019/07/30(火) 21:12:05.50ID:EUusSyFO
>>418
サンクス。boshなんてのがあるのか。
でもなんとなくboshが最初だとは思えないな
POSIXに影響を与えてるぐらいだからもっと大きな元ネタがありそうだけど
あとなんの略かもわからん。まさか do sh (shする?)

あと>>413のリンクが間違っていたので訂正
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01
421デフォルトの名無しさん
垢版 |
2019/07/30(火) 21:15:06.53ID:EUusSyFO
ここには元ネタはUNOSとか書いてあるね。

https://unix.stackexchange.com/questions/453827/making-alias-of-rm-command

This concept of parameterizable aliases has been invented by former AT&T
employees in 1980 and implemented in their real time UNIX clone called UNOS.
422デフォルトの名無しさん
垢版 |
2019/07/30(火) 21:19:41.35ID:EUusSyFO
https://www.in-ulm.de/~mascheck/bourne/
> built-in "dosh" added, behaves similar to "sh -c 'command'" without launching a new shell, supports aliases

あぁ、なるほど。sh -c 'command'と同じように使えて
新しいシェルを起動しないから、do sh なのか
423デフォルトの名無しさん
垢版 |
2019/07/30(火) 21:26:48.89ID:EUusSyFO
https://unix.stackexchange.com/questions/145522/what-does-it-mean-to-be-sh-compatible

If you like to know more relations, e.g. with UNOS "command", "bsh" and the recent
Bourne Shell, send me a note. As a hint: UNOS command had a builtin command
"do" that acted as a one-line shell script with arguments. This idea was transferred into
the Bourne Shell as "dosh" and permits parameterizable aliases, something you cannot get from ksh or bash. ? schily

このschilyってのはSchily Bourne Shell(=bosh)の作者かな?
424デフォルトの名無しさん
垢版 |
2019/07/30(火) 21:30:36.00ID:TDafWW+v
>>423
この回答者>>419じゃない?
そうだとしたら確実にOpenSolarisのシェルに携わってる人。
2019/07/30(火) 21:57:06.40ID:EUusSyFO
「OpenSolarisのシェルに携わってる」はちょっと疑問かな

http://schilytools.sourceforge.net/bosh.html
> The Schily Bourne Shell was derived from the Bourne Shell sources from OpenSolaris.

と書いてあるように、OpenSolarisのシェルをベースに改良したSchily Bourne Shellの作者のようだ。
OpenSolarisシェルそのものには関わってない気がする

Schily Bourne Shellには、古いBourne Shellと互換性があるoboshと
POSIX厳格なpboshと、POSIX準拠+拡張のboshの三種類のシェルが含まれていて、
そのboshにはOpenSolaris Bourne Shell にはない機能

> The enhanced Schily Bourne Shell (bosh) implements the following features that are missing
> in the OpenSolaris Bourne Shell listed above:

として、自身が昔仕事で関わっていたUNOS

https://unix.stackexchange.com/users/120884/schily
> First paid UNIX related work with UNOS in 1982.

で実装されていたdosh(元はビルトインコマンドの"do"?)を移植したという流れっぽい。
だからSolaris Bシェルの手引書には無くて当然なのだろう。

Bourne Shellにも移植された
> This idea was transferred into the Bourne Shell as "dosh"
ようだから、どこかの実装にはdoshが存在するのかも
2019/07/30(火) 22:00:29.38ID:TDafWW+v
>>425
ははーん。そういうことか。
Solaris Bシェルが持ってた拡張機能じゃなくてSolaris Bシェルに対する拡張機能だった訳ね。
Solarisの手引書を漁っても見付からない訳だ。
2019/07/30(火) 22:35:47.42ID:TDafWW+v
全然関係ないけど
$'\n'←こういうのって2020年あたりに発行されるPOSIXに組込まれるかもしれないらしいね。
そのページの下の方に書いてあった。
互換性とか大丈夫なのかな……?
2019/07/30(火) 22:45:31.33ID:TDafWW+v
参考: http://austingroupbugs.net/view.php?id=249
ていうかAustin GroupってThe Open Groupとは別ドメインなんだな。
サブグループだと思ってたわ。
2019/07/31(水) 12:01:53.51ID:6BPSvdm1
>>414
get-alias (gal)で、alias を表示できる。
多くのLinux コマンドのalias も、指定されている

gal | where-object {$_.Definition -match "remove-item"}
# Remove-Item のalias は、del, erase, rd, ri, rm, rmdir

gal | where-object {$_.Definition -match "copy-item"}
# Copy-Item のalias は、copy, cp, cpi

gal -name ls
# ls -> Get-ChildItem

gal -name echo
# echo -> Write-Output
2019/07/31(水) 16:37:25.52ID:kGX3Rh8Y
>>429
それ日本語が出てるの?
それとも日本語はあなたが付け足したの?
431デフォルトの名無しさん
垢版 |
2019/07/31(水) 22:49:22.63ID:FZL3ewwl
>>412
お釈迦様のアドバイス「犀の角のように独り歩め」も意味わからん…
2019/07/31(水) 23:18:58.96ID:kGX3Rh8Y
boshがビルドできずに諦めたw
2019/07/31(水) 23:25:31.28ID:8xUIRaAC
>>432
Debian 9で普通にmakeしたらできたけど?
正確にはDockerのbuildpack-depsだけど
2019/07/31(水) 23:39:26.64ID:8xUIRaAC
おや?最新版、2019-07-22版でビルド失敗した。

なんとなしにNetBSDでパッケージがあるのを見つけて使った2019-03-11版が運が良かったか
https://cdn.netbsd.org/pub/pkgsrc/current/pkgsrc/shells/bosh/README.html
2019/07/31(水) 23:57:18.53ID:8xUIRaAC
2019-06-13までは普通にビルドできるね
2019-07-15からビルドに失敗するようになってる
2019/08/01(木) 02:58:17.41ID:PmXIwIbo
>>435
情報ありがとう。古いので試してみるわ。
2019/08/01(木) 11:35:33.85ID:czAE5CE0
関数の中は、set -eで止めたいけど、関数の外では(後処理をするために)止めたくないって場合が辛いわ

例えばこんなコードがあって、falseで止まるようにしたいからset -eにするだろ?

foo() {
 set -e
 echo 1
 false
 echo 2
}

でも呼び出し側では必ず後処理をしたいから止めたくない。

set +e
foo
echo "後処理"

これだと止まってしまうから、foo &&: とかすると
今度は、fooの中でset -eの効果が無くなってしまう。何だこの仕様?

( foo ) とすると期待通りにfalseで止まるかつ後処理を実行できたが、
fooがサブシェルなので、fooの中で定義した変数にアクセスできない
困った
438デフォルトの名無しさん
垢版 |
2019/08/01(木) 12:20:40.41ID:aVYnxNEs
>>431
それは犀の角が一本だからという、特にひねりのない喩え。
2019/08/01(木) 12:25:28.77ID:iHxbPEOX
set -eはshellをexitするから当然の動作じゃない?
foo && : だと最終的なfooの戻り値を判定する必要があるからfalseで止まらずに最後まで行くんじゃないか

関数の中だけなら横着せずに
false || return
しろってことじゃないかな
2019/08/01(木) 13:07:42.24ID:lJwvTmEp
後処理だけなら、trap '後処理' ERR でやれば
根本的に -e の使い方が違うと思うけど
2019/08/01(木) 13:10:18.98ID:bR99qXsR
$ dash
$ trap : ERR
trap: ERR: bad trap
2019/08/01(木) 13:15:37.05ID:lJwvTmEp
EXIT でもいいぞ
2019/08/01(木) 13:17:58.23ID:bR99qXsR
どうやってEXITから終了せずに通常の流れに戻すの?
2019/08/01(木) 13:19:11.98ID:lJwvTmEp
なんやお前は
「後処理だけなら」って言ってるだろ
2019/08/01(木) 15:30:04.66ID:WaJjQk0q
SIGHUT とかのシグナル部分を書くとか?
2019/08/01(木) 20:47:35.88ID:SQRHjrcQ
func() {
return 123
}

if ! func; then
echo $?
fi

0って表示されるんだけど、どういうこと!?
2019/08/01(木) 21:31:03.39ID:2c4IvXw2
>>446
戻り値123を!しているから0になっただけでは
2019/08/01(木) 21:33:30.40ID:SQRHjrcQ
こう書けってことか?
面倒くさいな

if func; then
:
else
echo $?
fi
2019/08/01(木) 22:05:20.92ID:Ye1sT2dv
func || echo $? でいいんじゃね
2019/08/01(木) 22:10:56.38ID:SQRHjrcQ
実際にはecho $?以外にもすることがあるから
2019/08/01(木) 22:27:36.45ID:Ye1sT2dv
んじゃ、

func || { echo $?; ... ; }

とか。
2019/08/02(金) 02:34:53.77ID:hQ+yEyXN
Cじゃないから終了コードをそんな風に使わないほうが良い気がする…
あくまで「気がする」だけだけど
2019/08/02(金) 02:59:49.78ID:O3iYpUQI
値が 0 とそれ以外だけではなく、
それ以外にも、ある程度数値に意味があるのもあるからいいんじゃないのと思うけど
2019/08/02(金) 03:02:36.73ID:O3iYpUQI
ああ、そんな風 = 返り値が勝手に暗黙的に変わる変わらないってことかな?
だったらほぼ同意
2019/08/02(金) 03:40:21.45ID:hQ+yEyXN
>>453
あー。例えばあるコマンドで「ファイルが無い」ことを示すのに
exit 32が返ってくるとして
それに応じた最適なエラー処理をするってことかな?
2019/08/02(金) 03:54:22.19ID:O3iYpUQI
まあ元レスの人がどういう使い方をしたいのかわからんけど、そういう感じ
2019/08/02(金) 07:48:45.01ID:hQ+yEyXN
bcコマンドで階乗計算をしたくてコードを書いてるんだけど↓
n = 2
define f(n) {
f = 1
if (n == 0) { return(f) } /* 0! := 1 */
f = n * f(n - 1)
return(f)
}
"0! = "; f(0)
"1! = "; f(1)
"2! = "; f(2)
"5! = "; f(5)
多分これでいい筈なんだけどreturn式を二度使ってるのがダサく感じる…
もうちょっと賢い方法知らない?
2019/08/02(金) 07:49:38.54ID:hQ+yEyXN
ごめん一行目のn=2は無視って。
2019/08/02(金) 08:02:59.58ID:XJV5qmce
define f(n) {
if (n == 0) {
f = 1
} else {
f = n * f(n - 1)
}
return(f)
}

とか( n < 0 の場合、無限ループになるけど)
2019/08/02(金) 08:15:06.73ID:hQ+yEyXN
>>459
ありがとう。
でもelseって使えなくない? GNU bcだと使えるのかな?
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html
2019/08/02(金) 08:42:59.37ID:dUmy9lW0
elseはGNU拡張
else使えないならこうするしかない

define f(n) {
if (n == 0) { f = 1 }
if (n != 0) { f = n * f(n - 1) }
return(f)
}
462デフォルトの名無しさん
垢版 |
2019/08/02(金) 09:23:07.90ID:7tJhBDcy
>>438
それ喩える意味あるぅ?
情報量低すぎるどころか混乱を招いて逆効果だわ。
「グーはチョキに勝つ。そう、斧が槍に強いように」とか言われてる気分。
2019/08/02(金) 11:27:07.42ID:hQ+yEyXN
世の中には例え話を持ち出さないと気が済まない人が一定数存在する。
464デフォルトの名無しさん
垢版 |
2019/08/02(金) 12:50:24.63ID:vUPSv33I
>>462
知らんけど昔の人が思い付いていいと思ったから書いたんだろう。
2019/08/02(金) 12:51:11.15ID:hQ+yEyXN
>>190 WindowsにJavaが入るかもって話あったの?そもそもそんな話すらなくね?
2019/08/02(金) 13:50:46.03ID:pa9nweBb
>>465
昔あったっしょ
Microsoft J++だったっけ?
JDirectとか言うCOMかActiveXコントロールかを直接呼び出せる機能拡張付きで、
それにSunがケチを付けて(確か)裁判沙汰になって、結局廃止になったやつ
TCKにも通らないだろうからJavaは名乗れないはずだけど
467デフォルトの名無しさん
垢版 |
2019/08/02(金) 13:54:51.56ID:xsQQm7uF
>>465
90年代後半にだな・・・
2019/08/02(金) 13:57:46.29ID:XJV5qmce
「マイクロソフトが Java に塩を混ぜた!」ってやつか
2019/08/02(金) 20:32:46.34ID:hQ+yEyXN
sedかなにかで↓
<td>
AAAA
</td>
<td>
BBBB
</td>
↑っていうデータのBBBを取り出したい。

残念なことにtdにIDやらなにやらが賦与されてないから手段としては
「1番目に表われた/<td>/<\/td>/は無視って2番目の/<td>/<\/td>/の中身を表示する」
っていうのになると思う。しかし方法が思い付かない……。
できればsed, awkあたりで処理できればいいなと思ってるんだけど,どなたか力を貸してほしい。

上のデータだけど,「実際はもっと複雑でtableが入れ子になってる」とかそういうことはないです。
2019/08/02(金) 20:38:11.21ID:cEuue6ob
なら5行目を取り出せばいいじゃん
2019/08/02(金) 20:40:10.25ID:2UnKye9C
/^<td>$/{n;/BBB/p}
2019/08/02(金) 20:44:47.38ID:O3iYpUQI
今までのレスからはそんな質問するはずがないとしか思えないんだけどw
<td>AAA
</td>
<td>
BBB</td>
なんぞリターンがあってもなくてもいいというhtml/xmlらしく、行がちゃんとしているわけではないとか?
2019/08/02(金) 21:06:45.26ID:dUmy9lW0
>>469
俺ならシェルスクリプト使わずにHTMLパーサに食わせるな
nodejsでcheerio使うとか楽な方法を選ぶね
2019/08/02(金) 21:06:52.97ID:XJV5qmce
GNU sed の -z オプションを使って

$ sed -rz 's:.*</td>\n?<td>\n?(.*)</td>.*:\1:' data.html
2019/08/02(金) 21:07:39.38ID:hQ+yEyXN
>>472
そうです。相手はHTMLなんで改行されてない場合が普通にあるんです……。
つくづくUnixツールとマークアップ言語は相性悪いなぁと思いますw
2019/08/02(金) 21:30:15.54ID:XJV5qmce
GNU grep ならこんな感じ

$ grep -Pzo '<td>\n?\K(.|\n)*?(?=\n?</td>)' x.xml | tr '\0' '\n' | sed -n 2p
2019/08/02(金) 21:35:20.07ID:hQ+yEyXN
>>476
すげぇ!
ありがとうございます!とりあえず脳死状態でコピペさせていただきます。
正規表現の勉強しないとなぁ……。
2019/08/02(金) 21:38:37.66ID:cEuue6ob
正直、CLIツール使って一発でやってしまおう!
なんて考えるから難しくなるんだよ。
一行一データになってないものは、
シェルスクリプトでやったほうが楽

#!/bin/sh
a=$(cat html.txt)
a=${a#*<td>}
a=${a#*<td>}
a=${a%%</td>*}
echo "$a"
2019/08/02(金) 21:38:54.44ID:+p+nzQa3
>>475
>を>\nにして\n\nを\nにすればいいだけじゃないの?
480デフォルトの名無しさん
垢版 |
2019/08/02(金) 21:59:02.93ID:T1FFAKuC
xmllint使えは禁句なの?
2019/08/02(金) 22:00:05.58ID:G/LyK8vk
Ruby なら、すべての改行を削除してから、最短マッチ

str = <<"EOT"
<td>
AAAA
</td>
<td>
BBBB
</td>
EOT

str.delete!( "\n" ) # すべての改行を削除する

re = /<td>(.*?)<\/td>/ # ? は最短マッチ

p results = str.scan( re ).flatten
# ["AAAA", "BBBB"]

p results[ 1 ]
# "BBBB"
2019/08/02(金) 22:47:11.19ID:hQ+yEyXN
>>480
残念ながらそのHTMLは整形形式じゃないのでマトモに解析できないんです。
483481
垢版 |
2019/08/02(金) 23:15:30.78ID:G/LyK8vk
Ruby で、nokogiri パーサーなら、

require 'nokogiri'

doc = Nokogiri::HTML( <<EOT.delete( "\n" ) ) # すべての改行を削除する
<td>
AAAA
</td>
<td>
BBBB
</td>
EOT


elements = doc.css( "td" )
p elements.first.content #=> "AAAA"
p elements[ 1 ].content #=> "BBBB"
2019/08/02(金) 23:29:54.36ID:pa9nweBb
>>476
\Kじゃなくて(?<=..._)で書いたほうが読みやすくね?とか思ったけど
PerlやPCREじゃlookbehindに可変長になるパターンは指定できないのか
JavaScriptだと通るんだよね....
2019/08/02(金) 23:34:34.72ID:cEuue6ob
Ruby遅すぎるんだよ

$ time ruby html.rb
"AAAA"
"BBBB"

real 0m0.079s
user 0m0.079s
sys 0m0.000s



$ time sh html.sh

BBBB

real 0m0.002s
user 0m0.002s
sys 0m0.000s
2019/08/02(金) 23:36:49.26ID:cEuue6ob
これも遅いな。やっぱりシェルスクリプトが一番か

$ time grep -Pzo '<td>\n?\K(.|\n)*?(?=\n?</td>)' x.xml | tr '\0' '\n' | sed -n 2p
BBBB

real 0m0.003s
user 0m0.004s
sys 0m0.003s
2019/08/02(金) 23:38:32.60ID:cEuue6ob
こうしたらさらに速くなったわw
シェルスクリプト最強伝説

#!/bin/sh
a="
<td>
AAAA
</td>
<td>
BBBB
</td>
"

a=${a#*<td>}
a=${a#*<td>}
a=${a%%</td>*}
echo "$a"

$ time sh html.sh

BBBB


real 0m0.001s
user 0m0.001s
sys 0m0.000s
2019/08/02(金) 23:46:41.69ID:dUmy9lW0
>>487
スクレイピングする時にそんなコード毎回書くわけ?
2019/08/02(金) 23:58:58.92ID:2UnKye9C
a#*
a%% あたりがシェルスクリプト独自の難読パーツだが
覚えたら高速なのか...
2019/08/03(土) 00:25:50.69ID:i7fqO3Sj
>>489
どっかの書籍(確かオライリー)に
数字を考えて#は数字の前に,%は数字の後に付ける。
という連想から
#及び##は前から削る,%及び%%は後から削ると覚えるといいと書いてあった。
2019/08/03(土) 00:33:21.53ID:dYT3TwZL
自分は
キーボードの左側: # -> prefix
キーボードの右側: % -> suffix
で、削るんだっったっけ?残すんだったっけ?
結局毎回調べるという体たらく
2019/08/03(土) 00:40:18.71ID:9AEx1UEu
>>490
thanks
493デフォルトの名無しさん
垢版 |
2019/08/03(土) 00:57:31.70ID:37D8ZUar
>>482
ブラウザでF12キーでコンソール開いて、
var q = (xml, query) => new DOMParser().parseFromString(`<xml>${xml}</xml>`, 'application/xml').querySelector(query).innerHTML.trim();

var text = q(`
<td>
AAAA
</td>
<td>
BBBB
</td>
`, 'td:nth-of-type(2)');
console.log(text); //=> BBBB

xmlとしてのパースだから、
q(`<chinko>AAAA</chinko><chinko>BBBB</chinko>`, 'chinko:nth-of-type(2)');
とかでも大丈夫。

一方htmlとしてもパースできるけど少なくともtableタグは補わなきゃならんね↓
var q = (html, query) => new DOMParser().parseFromString(html, 'text/html').querySelector(query).innerHTML.trim();

var text = q(`
<table>
<td>
AAAA
</td>
<td>
BBBB
</td>
</table>
`, 'td:nth-of-type(2)');
console.log(text); //=> BBBB
2019/08/03(土) 03:42:42.10ID:eOXqQaf9
>>490
> 数字を考えて#は数字の前に,
あー、ナンバーサインか

俺は、コメントだから頭につけるって覚えてたわ
%は同じく100%の%で後ろって覚えてたけど
2019/08/03(土) 04:43:13.91ID:i7fqO3Sj
>>494
俺含め日本人には#42みたいなのは馴染み薄いよね…
まあ「全く知らない概念」ではなかったから
とりあえず#は前,%は後,というように覚えられたけど。
コメントっていうのはいい案だと思う。
シェルスクリプトを書いている全員が把握できる概念だから。
2019/08/03(土) 05:33:16.75ID:20yQPXqo
ナンバナィン?

#はスーパーユーザで%はcshだな
2019/08/03(土) 06:07:39.94ID:l2kKbyZy
シェルスクリプトの#と%はなんとなく使えてるが正規表現の前後読みは未だに無理ポ
2019/08/03(土) 06:23:53.55ID:i7fqO3Sj
正規表現の割と新しめの拡張は
既存のメタ文字と被らないようになってるから類推しにくい記号になってしまってる場合が多い。
…まあ出典とかなくて俺の予想だけどw

最近だと「名前空間」的な概念が登場して\p{Kata}みたいな書き方が増えてきて助かる。
覚えるの簡単!
2019/08/03(土) 08:10:24.89ID:GWDLl7Iz
なんのこっちゃと思ったら.NETか
[:Katakana:]でいいんじゃないか。すでにあるからわかりやすいし
思惑でそうしてないんだろうけど
2019/08/03(土) 09:10:18.89ID:i7fqO3Sj
>>499
いや\p{Kata}っていう正規表現が使えるのはかなり広範な言語よ
少くともICUバインディングがあれば使える筈。
2019/08/03(土) 09:11:02.22ID:i7fqO3Sj
逆に.NETでUnicodeロケールの正規表現が使えるとは思いもよらなんだ
2019/08/03(土) 09:42:41.49ID:9AEx1UEu
...| perl -pe 's{" [^"]+ "}{ $& =~ s/ /-/gr }xeg'|...
awk でもできるかもしれないけどこの正規表現が便利
"text with blank space" の中だけ空白を-で詰め物するのに使っている

空白があると正常に動作しないコードの前パイプに挟む
2019/08/03(土) 10:30:59.00ID:i7fqO3Sj
>>502
なんかコマンドの引数の仕様とかを利用して
POSIXの範囲で実装できそう。
もちろんperlで十分だけど。

abc def "text with blacket" dee
に対して
abc def "text-with-blacket" dee
ってい出力を返す訳だから
for str in abc def "text-with-blacket" dee; do
printf '%s\n' "$str" | tr ' ' '-'
done | tr '\n' ' '
とか?
あ,駄目だこれだと"が戻ってこねーw
2019/08/03(土) 11:33:18.72ID:63RDVzrz
無理やり

echo 'abc def "text with blcket" dee' |
sed -E 's:^(.*)"([^"]*)"(.*)$:printf "%s\\"%s\\"%s\n" "\1" $(echo "\2"|tr " " "-") "\3":e'
2019/08/03(土) 11:35:32.45ID:l2kKbyZy
$ echo やまだヤマダ山田 | grep -oP "\p{Katakana}"




-o使うと改行されるのね
2019/08/03(土) 12:22:48.42ID:63RDVzrz
スペース区切りでよければ

$ echo やまだヤマダ山田 | grep -oP "\p{Katakana}" | xargs
ヤ マ ダ
2019/08/03(土) 13:09:38.57ID:H1MpioV8
>>485
何百ページもパースするの?
Ruby でも十分早いと思うけどなあ
2019/08/03(土) 13:55:12.22ID:dYT3TwZL
40秒で支度しな
509デフォルトの名無しさん
垢版 |
2019/08/04(日) 17:11:27.60ID:d0z5l48N
俺だったらperl使って全部読んで長い一行として扱って抜き出すか、または XML::Simple モジュール使って変数に展開してから取り出すかするかな。

つまり、シェルスクリプトは使わない。やってやれないことはないと思うが複雑怪奇なものになりそうなので。
510デフォルトの名無しさん
垢版 |
2019/08/04(日) 17:12:43.83ID:d0z5l48N
あ、リロード忘れて書いたら山盛りで他の書き込みが・・・

俺の書いたことは忘れてくれ。
511デフォルトの名無しさん
垢版 |
2019/08/04(日) 17:13:02.34ID:arZQ1GVT
【小沢が育てた刺客】 山本太郎「政権を仕留める」
http://lavender.5ch.net/test/read.cgi/giin/1564896780/l50
512デフォルトの名無しさん
垢版 |
2019/08/04(日) 18:10:11.11ID:d0z5l48N
丸くても刺客
2019/08/04(日) 18:11:50.20ID:M00OQnGm
40秒で刺客しな
514デフォルトの名無しさん
垢版 |
2019/08/04(日) 18:22:43.73ID:OC9PgLo7
PythonのBeautifulSoupだと、パーサーにCで書かれたlxmlを選べるようになってるんだが、
そういうの使えば、シェルの方が断然速いとはならないんじゃないかな?
PerlとかRubyにも似たようなのはあるでしょ。
2019/08/04(日) 18:40:40.05ID:zjBZp1dd
ディレクトリに、test01 〜 test99 ファイルがある時に、
test100, test101 と、ファイルを増やしていくと、

表示順が、test20, test21 などよりも、
test100, test101 の方が、先に来るようになった

これらを数字順で表示するには、どういうフィルターを作れば良いでしょう?

まあ、すべてのファイル名を、test001 など、3桁表示に変えれば、解決するけど
2019/08/04(日) 19:18:29.22ID:ApCAdEzq
>>515
プレフィクスが一緒なら
そのプレフィクスと0パディングを切り取ってsortに掛ければいいんじゃないかな。
で並び換えたものにプレフィクスと%0dを追加する。

ファイル名じゃなくてすまんが↓こんな感じ?
$ <<. sed 's/test0*//1' | sort -n | while read line; do printf 'test%02d\n' $line; done
test99
test100
test21
test01
test20
test101
.
517516
垢版 |
2019/08/04(日) 19:38:16.75ID:ApCAdEzq
改良。あとsort -nって0埋め関係ないんだな。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html#tag_20_119_04

ls -1 test* | sed 's/^test//' | sort -n | xargs -I @ printf 'test%02d\n' @
2019/08/04(日) 19:45:40.73ID:ZVJM9ExE
>>515
GNUのsortなら-Vオプションがあるけど...
ls | sort -V
あるいはtest[0-9]*のファイルだけなら
ls | sort -t t -k 3n
とか(汚いけど)
2019/08/04(日) 20:01:45.96ID:hlZDnb3L
>>515
ls -v
2019/08/04(日) 20:02:42.33ID:/i7K4ZYC
>>515
GNU coreutils の ls コマンドなら -v オプションで version sort してくれる

$ ls -v test*
$ man ls

-v natural sort of (version) numbers within text
2019/08/04(日) 20:05:19.04ID:KSih4AJE
となるとMacは切り捨てだな
2019/08/04(日) 20:06:51.77ID:ZVJM9ExE
おお、lsにも-vオプションあったっけ
523515
垢版 |
2019/08/04(日) 21:06:16.73ID:zjBZp1dd
>>518
GNUのsort、-V オプション
ls | sort -V

これは便利!
2019/08/04(日) 21:11:25.12ID:WhAPGaK9
sort --help には
-V, --version-sort 自然な (バージョン) 数字順でソートする

って書いてあるけどさ、これセマンティクスバージョニングでの
比較にちゃんとなってるの?正確な仕様がわからん
2019/08/04(日) 21:14:26.03ID:ApCAdEzq
なんにせよ可搬性ないからあまり使わんほうがいい
526デフォルトの名無しさん
垢版 |
2019/08/04(日) 23:41:22.05ID:fspxWXLG
シェルスクリプトに可搬性期待するなって結論出たろ
2019/08/05(月) 00:49:19.74ID:uR0Am4u5
bashごと持って行けばいいんじゃね?
他のインタプリタ系の言語ってみんなそうしてるっしょ?
2019/08/05(月) 00:58:52.07ID:lQJxfKJu
>>526
馬鹿だなぁ。sortはシェルスクリプトじゃないよ。
sortコマンドだよ。可搬性がないのはsortコマンドだよ。
シェルスクリプトで実装すれば可搬性があるよ
2019/08/05(月) 01:59:22.26ID:053u+cPb
sortは-hもよく使うな
du -hc * | sort -hみたいに
2019/08/05(月) 02:53:17.73ID:IFzEkeeB
>>527
sortコマンドはBash組込みコマンドじゃないから関係ないんじゃ…
2019/08/05(月) 04:07:47.17ID:RegSSUKZ
busyboxをスクリプトに同梱して、
全部これに解釈させればいいじゃん
ashに加えて、よく使うコマンドも一緒についてくる
2019/08/05(月) 04:23:15.10ID:IFzEkeeB
いいじゃんと言われても…いいね。としか答えようがないw
2019/08/05(月) 06:43:25.45ID:IFzEkeeB
exitコマンドってexit $?とやってやらなくても前に実行したコマンドの終了コードを見てくれるんだな。
ずっとexit $?ってやってたわw
2019/08/05(月) 07:20:51.08ID:O6CFE/yb
if $? でやるより
&& || で分岐したほうが らしい 感じにならないか?
2019/08/05(月) 08:03:05.75ID:IFzEkeeB
>>534
ああいや。
埋め込みシェルスクリプト(←なんて呼べばいいのか知らんけど
実行形式のファイルで冒頭に書かれてることがある
そのファイル自身を伸長するシェルスクリプトのこと)
で使ってたのよ。
#!/bin/sh

< "$0" sed -n '5,$p' | unar -
exit $?
こっからZIP
↑みたいに。
2019/08/05(月) 11:46:23.87ID:MNXFY7cg
tputの存在理由はわかるが
現実的な問題として、どういう場合にtput使ってよかったって思える?
もうエスケープシーケンス決め打ちでよくね?
2019/08/05(月) 12:52:22.28ID:IFzEkeeB
clearコマンドがPOSIXで定められていないのをいいことに実装されていない環境がある。
そのときにtput clear。
2019/08/05(月) 13:19:56.72ID:MNXFY7cg
> 実装されていない環境がある。

「現実的な問題」っていうのはその実装されてない環境なんて、
今どきあるの?って話なんだよ。
2019/08/05(月) 13:23:05.75ID:MNXFY7cg
clearが実装されてない環境より
tputが実装されてない環境のほうが多くて、
tputを使うと逆に動かない環境の方が多くなっちゃう
例えばbusyboxとかalpine linuxとか
2019/08/05(月) 13:31:42.54ID:O6CFE/yb
which clear >/dev/null 2>&1 && echo has || echo 404
両対応書いておけばいい
2019/08/05(月) 14:26:42.83ID:MNXFY7cg
/usr/share/terminfoの中を見てみたが、
シンボリックリンクを抜かして1700ものファイルがあった。

なるほどこれは大変だ。だがその中でどれだけのものが使われているのだろうか?
またどれだけ違いがあるのだろうか?ほとんどは細かい(殆ど使われない)
機能の違いでしか無いのではないか?

大抵は色を変えるぐらいしか使わないだろうし、
それ以上使っても画面サイズとカーソル移動ぐらいだろう。
数パターンしか違わないのであれば、独自対応も可能だろう。

実用レベルで考えるとtputを使うことは、使わないよりもデメリットが大きい気がしている。
2019/08/05(月) 14:33:25.56ID:IMjI9HmJ
vt100, xterm 以外設定した覚えがないな
2019/08/05(月) 14:47:57.15ID:MNXFY7cg
おそらく端末名の後ろは細かいバリエーションだろうからと削ってみたら789種類にまで減った
それでも数が多すぎるかつこんなの誰も使ってないやろと思ってしまって
何が違うのか把握する気が起きないレベル

でもinfocmpとか便利だな。よし俺の中で方針が決まった。
もしこれらの端末に対応しなければいけない自体になったら、
プログラムで直接tputを使用するのではなく、tputと同じ引き数で関数を実行しますから、
それで出力するエスケープシーケンスは設定ファイルで書き換えられるって方式にしよう。

さしあたって、現状、色を変えるだけしかやっとらんのだがtput使う必要あるのかな?
2019/08/05(月) 14:55:51.10ID:uR0Am4u5
なんであるものを使わないんだろう
二段階認証おじさんみたいな頭の構造なんだろうか
2019/08/05(月) 15:27:49.43ID:MNXFY7cg
> なんであるものを使わないんだろう
書いたでしょ? tputコマンドがない環境が現実としてある。
2019/08/05(月) 15:54:00.38ID:MNXFY7cg
簡単なスクリプトを書いて、とりあえずcolsについて
データベースに登録されてる1700端末をすべて調べてみたが
すべてが 0x31 0x33 0x31 0x0a だった

boldだと非対応を除いて892端末。44パターン。結構違いがあるな
setafだと340端末、11パターン

まあtputを使うほうが楽だってのはわかるけど、エスケープシーケンスが違うのは
マイナー端末だろうし、数の割にパターン数は限られているので
完璧を求めたいなら別だけど使う環境で動けば良いわけで、tputを使用するのは過剰な気がするな。
2019/08/05(月) 15:55:50.50ID:IMjI9HmJ
tputがない環境って例えば何?
2019/08/05(月) 16:04:49.48ID:MNXFY7cg
む、/lib/terminfo/ 以下にも定義ファイルがあるのか
xterm-256colorがないのに使えると思ったら
まあ +40個しか変わらんけど
2019/08/05(月) 16:05:10.32ID:MNXFY7cg
>>547
書いたんだから上見ろ
2019/08/05(月) 16:11:29.93ID:IMjI9HmJ
まあいいけど日記はブログで書けや
2019/08/05(月) 16:18:56.02ID:MNXFY7cg
ブログねーしw ここはみんなのらくがき帳だ
2019/08/05(月) 18:58:04.34ID:7Al1V6ob
シェルスクリプトマスターの皆様
xxxxNN.txtというファイルが大量にあります(xxxxの部分はファイル名、NNの部分は0〜99の連番)
NNの部分が50未満ならxxxx50.txtにNNが50以上ならxxxx99.txtに一括でリネームしたいのですがやり方教えてください
2019/08/05(月) 19:10:26.82ID:AegVyuQi
xxxx の部分はファイルによって異なるって前提でOK?
2019/08/05(月) 19:15:29.15ID:7Al1V6ob
>>553
YES
2019/08/05(月) 19:19:16.45ID:MNXFY7cg
無理に頭の体操的なことをせずに、こんな感じでいいでしょ?

for file in *; do
 name=${file%[0-9]}
 name=${name%[0-9]}
 num=${file#$name}
 [ $num -lt 50 ] && num=50 || num=99
 mv "$file" "$name$num"
done
2019/08/05(月) 19:27:32.93ID:7Al1V6ob
>>555
ありがとうございます
早速試してみます!
2019/08/05(月) 19:28:09.53ID:MNXFY7cg
早速試すとか言ってるが、
適当に書いたからどうなっても知らんぞ。
2019/08/05(月) 21:05:22.75ID:O6CFE/yb
>>552
ファイル名に数字がまざってなければ
例ば[a-zA-Z]だったら
dry run は
| perl -pe 's{ \d+ }{ $& < 50 ? 50 : 99 }ex'
2019/08/06(火) 08:47:13.20ID:fNxvG1AN
ほとんど気にすることないと思うんだけどさ
みなさんが今まで携わってきたシステムでshが/bin/shにないシステムってあった?
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap10.html
ここによると/bin/shは既定されてない→つまり必ずしもあるとは限らない
みたいなんだけど、そんなシステムあるかね?

Solarisとかなら…と思ったけど/bin/shだったし。
2019/08/06(火) 10:09:19.90ID:9obbnMlM
Androidには/bin/shがないとか聞いたことあるな
2019/08/06(火) 10:19:48.23ID:4kzCwlOl
Androidはそもそも/binも/usrも無いな
mkshが/system/bin/shにある
2019/08/06(火) 10:27:23.06ID:9obbnMlM
Androidの環境ってよくわからん。
busyboxは採用して無くて、昔はtoolboxだったのが今はtoyboxを採用している。
しかしtoyboxのシェルであるtoyshは完成して無くてmkshを使っている。
という理解であってるんだろうか?
dockerfileないんかな?
2019/08/06(火) 17:00:21.88ID:g73t6D+3
Androidはヘッドレスでは立ち上がらんのじゃね?
昔見た限りだとinitスクリプト中でコケるんじゃないかと
2019/08/07(水) 00:56:40.08ID:3XS5MIC7
Toyboxなんてものがあるのか。
2019/08/07(水) 01:43:15.26ID:WK8NJ3/V
diffみたいに二つのファイルを開いて、一行ずつ交互に比較できないかな?
bash依存禁止で
566デフォルトの名無しさん
垢版 |
2019/08/07(水) 01:49:50.14ID:r57RWdCS
diff使えばいいじゃん
2019/08/07(水) 01:57:20.41ID:QJETJeRx
diff のアルゴリズムは有名だから
あとはもっと具体的にどうさせたいのかによりそう
2019/08/07(水) 02:03:50.19ID:WK8NJ3/V
誰がdiffしたいっていったよ?
2019/08/07(水) 02:43:40.37ID:fPg/gK/3
paste コマンド使うとか。見づらいけどw

$ paste -d '\n' file_a file_b
2019/08/07(水) 02:47:37.40ID:WK8NJ3/V
一旦質問を忘れて

同時に二つのファイルを開いて処理したい
2019/08/07(水) 02:48:31.68ID:WK8NJ3/V
処理の内容は自由に変えられる
2019/08/07(水) 02:56:33.93ID:fPg/gK/3
他のスクリプト言語を使う方が幸せになれる様な気がする
2019/08/07(水) 03:19:53.88ID:prHDAaSE
>>568
こんな奴に誰が答えたいと思うだろうか?
2019/08/07(水) 03:26:49.06ID:arV/Dy+D
またいつもの奴か
2019/08/07(水) 03:43:34.68ID:3XS5MIC7
どうしてこう知識のない奴ほど傲慢なんだろうか。
2019/08/07(水) 06:41:35.91ID:5FNsDR6i
POSIXシェルのみで全て書くという縛りプレイが好きなんだろうw
POSIXは最低限のインターフェースを規格化しているだけで、結局はプラットフォーム別に書くしかないのが現状だからな
bashがあるならbashで書けばいい
GNU拡張が使えるなら使えばいい
あるもんは使えばいいんだよ
可搬性の幻想に囚われると逆に生産性が落ちる
2019/08/07(水) 06:56:03.49ID:5FNsDR6i
>>570
そんなの何やりたいのかで答えは変わってくるだろ
漠然とした質問には漠然とした回答しか返ってこないぞ
2019/08/07(水) 07:11:20.44ID:aj+f89Vu
>>575
パソコンの大先生にありがち。知識は少しはあると自負のアンバランスからだな
2019/08/07(水) 08:36:36.73ID:QJETJeRx
awk で丸飲みしちゃえ
1ファイル1配列

メモリ節約なら
1行ずつ読むのをシンクロさせる
2019/08/07(水) 11:22:21.65ID:WK8NJ3/V
>>575
ほんとそれなw
できるのに、知識ないやつほどぐだぐだとレスをする
答えられないのを質問者のせいにする

exec 3<file1.txt
exec 4<file2.txt

read -r file1<&3
read -r file2<&4
echo "$file1 $file2"

read -r file1<&3
read -r file2<&4
echo "$file1 $file2"
2019/08/07(水) 11:28:44.82ID:3XS5MIC7
重症だなこりゃ
2019/08/07(水) 11:31:15.75ID:WK8NJ3/V
ちなみに>>580
一回目のechoはファイルの1行目、
二回目のechoはファイルの2行目が
ちゃんと表示されるからなw

お前ら勉強してちゃんと質問に答えられるようになれよ
中途半端な知識で満足するな
2019/08/07(水) 11:36:26.97ID:5FNsDR6i
>>581
覚えたてで見てほしくてしようがないんだよ
生暖かい目で見守ろうやw
2019/08/07(水) 11:37:40.18ID:WK8NJ3/V
などと、質問には答えずに
それでも悔しいからか、レスだけはするようで
585デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:41:40.99ID:9POPBXN5
すげえ嫌な感じの方法思い付いた。

まず二つのファイルの行数だけ wc -l で調べ、小さい方を max に入れておく。
n=1 にしてから max までループさせて、ループの中で awk を使って NR==$n の一行を双方のファイルから抜き出してそれぞれ別の変数に入れる。

なんてことをすると2つの(またはそれよりも多くの)ファイルから1行抜き出して何かをする事は可能だ。
しかし行が長くなればなるほど無駄な処理が増えて時間が掛かることは言うまでもない。
大変効率の悪い方法だ。
2019/08/07(水) 11:48:42.74ID:5FNsDR6i
>>582
それやりたいなら普通はpaste使うけどな
2019/08/07(水) 11:48:48.99ID:WK8NJ3/V
>>585
その効率の悪い方法を実装するとして、wcもawkもいらんのでは?
行数を数えるのも、特定の行を読み込むのもシェルスクリプトだけでできるし。

>>580のやり方、同時に2つのファイルを開いて処理する方法で
実現できないような場合には使えるかも。ファイルのサイズが小さいなら問題にならないし
588デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:48:50.45ID:9POPBXN5
>>580
おお。それでできるな。
589デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:51:13.86ID:9POPBXN5
>>586
あ、そうだね。
区切り文字とうするかだけの問題か。
2019/08/07(水) 11:53:37.08ID:WK8NJ3/V
>>586
> それやりたいなら普通はpaste使うけどな
残念ながらpasteでは自由な処理ができない

例えば、1つ目のファイルに書いてある命令を解釈しながら
2つ目のファイルを読み込んだり、他の処理をしたりとかね。
2019/08/07(水) 11:56:37.01ID:WK8NJ3/V
で、POSIXで簡単にできることを、答えられずに
他の言語でやれとか、自由な処理をしたいっていうのに
それを理解しない答えを返してる奴ら
質問者の俺自身に、完璧な答えを出された気持ちはどう?w
2019/08/07(水) 11:57:46.26ID:WK8NJ3/V
またいい問題を思いついたら、質問(?)してやるから
じゃーねーw
2019/08/07(水) 11:57:52.31ID:5FNsDR6i
>>590
だからやりたいことを先に言えよ
お前はシェルスクリプトの前に質問の仕方から勉強しろ
2019/08/07(水) 12:00:28.63ID:WK8NJ3/V
>>593
同時に二つのファイルを開いて処理したい
って言った。
処理の内容は自由に変えられる
って言った。

同時に二つのファイルを開く以外のなにも条件として出してない
それができれば、いろいろと応用が効く

特定のことしかできないdiffやpasteでは
処理の内容が変えられないだろ
2019/08/07(水) 12:03:18.97ID:5FNsDR6i
>>594
>>593
596デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:04:06.23ID:9POPBXN5
>>591
なんで自分でわかるのに質問したのか謎
2019/08/07(水) 12:06:48.70ID:5FNsDR6i
>>596
>>583
2019/08/07(水) 12:08:56.79ID:fPg/gK/3
うーん、、、こんな感じ?

$ paste -d '\n' file1 file2 | xargs -d '\n' -n 2 | sh

file1 と file2 の内容例

file1:
====
ls
cp
mv
====

file2:
====
.
x y
y z
====
599デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:15:06.92ID:9POPBXN5
あー。「どうだ俺はこんなにできるんだすごいだろう」みたいな。
じゃあ本当にやりたかった事は複数ファイル処理ではなくて自分の能力自慢か。
人から認められて承認欲求を満たしたいってことでもあるかな。
いつも人からバカにされてるから何かで人をバカにしたいというのもあるかも知れない。
合掌。
2019/08/07(水) 12:15:09.78ID:5FNsDR6i
>>598
後出し要件からするとそんな感じ
また要件変わると思うw
2019/08/07(水) 12:17:59.15ID:WK8NJ3/V
>>596
> なんで自分でわかるのに質問したのか謎

質問した時点では知らなかったよ?w
2019/08/07(水) 12:19:12.78ID:WK8NJ3/V
>>598
後出しじゃない用件を言うと、
処理したい内容を自由に変えられないといけない

要件は同時に二つのファイルを開いて
いろんな処理をしたいってことだけ

ま、もう答えは出したがw
2019/08/07(水) 12:21:45.21ID:WK8NJ3/V
>>599
最初に用件をちゃんといってるのに、例をいうとその例しかできない方法を出すし
その質問にたいする曲解を潰していくうちに、その時間で自分で調べて解決できてしまうんだから
どうしろっていうんだw
2019/08/07(水) 12:22:22.45ID:WK8NJ3/V
やっぱ「自決しました」で終わらせたほうが良かったか?
605デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:32:00.78ID:9POPBXN5
>>603
普通にわからなくて質問していてやがて自分でわかった場合、普通はそれまでに答えてくれた人に対するお礼をするしこういう方法で出来ましたと自分のやったことを書く。
君の場合なぜか答えてくれた人に対する感謝の念がない。書かれたことが間違いや見当外れのことであっても普通は書いてくれたというだけで感謝するものだ。
しないとするなら少なくともその質問は質問に偽装された何か別のものだ。
2019/08/07(水) 12:36:21.05ID:5FNsDR6i
>>604
teratailとかSOで叩かれてこい
2019/08/07(水) 12:37:21.72ID:WK8NJ3/V
>>605
いい加減、客様は神様です。はやめたほうが良いよw
608デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:42:23.91ID:9POPBXN5
>>607
言っている意味がわからない。何か特殊な宗教でも信奉しているのかね?
2019/08/07(水) 12:45:25.69ID:WK8NJ3/V
>>608
回答者のほうが偉いみたいな考え方。
質問者と回答者は対等です。
610デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:00:34.72ID:9POPBXN5
>>609
対等じゃないよ。金を出す側と受け取る側と同じだもの。同じわけがないじゃん。
君はなんでそんな現実と食い違う思想を持ってるんだ?それでは人とのトラブルになるだけで世の中渡っていけんだろう。
2019/08/07(水) 13:17:46.60ID:VwbuDBsd
>>610
どうやら日本の礼儀が理解できないようだ
今問題になっている隣国の人間なんだろう
2019/08/07(水) 13:23:21.21ID:WK8NJ3/V
日本の礼儀と隣国の話しかできないのが世界が狭いよな
613デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:27:24.72ID:9POPBXN5
>>611
何かを与えてくれたらお礼をするのは国に関係なくどこでも共通の礼儀だが、君はそれをしないばかりか与えてもらって当然と考えるとするならば、それは正に今の韓国と同じだね。
614デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:29:19.39ID:9POPBXN5
優遇して与えていた側に礼を言わないばかりか盗人猛々しいとでも言うかね?
2019/08/07(水) 13:31:40.13ID:WK8NJ3/V
ということで、質問に対して
答えを返した俺に感謝しろ
という話さ
2019/08/07(水) 13:37:09.23ID:5FNsDR6i
これ触っちゃあかんやつや
2019/08/07(水) 13:39:19.49ID:WK8NJ3/V
俺は別に自決しましたで終わらせても良かったんだが、
俺ができるってことを示さなければ、
シェルスクリプトで同時に二つのファイルを開けるってことも
知らなかったんだろうな
2019/08/07(水) 13:41:42.46ID:aj+f89Vu
>>616
それを触りすぎw
2019/08/07(水) 13:46:29.59ID:WK8NJ3/V
この先の人生、似たような問題に直面したとき、
今日の会話を思い出しながらも、なかったことにして
俺が回答したテクニックを使うのだろう
620デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:49:03.15ID:9POPBXN5
>>615
質問者は君自信だ。それに関しては君が君に感謝すれば良い。他の人は少なくとも同じ質問はしていないのだから君に感謝する必要はない。

という、普通の事が君にはわからないのか?発達障害か何かか?だったらしょうがないから形だけ他の人を真似て合わせろ。そうすれば無用なトラブルは減らせる。
2019/08/07(水) 13:51:39.12ID:WK8NJ3/V
ん?他の人って会話に参加してる人だけのことだと思ってるのか?
検索で見つけた人とかあるだろう。
相変わらず視野が狭いんだな。
2019/08/07(水) 14:04:14.01ID:WK8NJ3/V
検索した人は俺に感謝する。ここでレスしてたやつも同じ問題がでたとき
嫌々ながら俺に感謝する。ウィン♪ウィン♪ってやつではないか
623デフォルトの名無しさん
垢版 |
2019/08/07(水) 14:08:05.92ID:9POPBXN5
>>621
おだいじに。
624デフォルトの名無しさん
垢版 |
2019/08/07(水) 14:09:22.96ID:9POPBXN5
夏の暑さも酷なことをするもんだ。
2019/08/07(水) 14:11:08.56ID:WK8NJ3/V
エアコンもってないのか?
2019/08/07(水) 15:11:31.23ID:3XS5MIC7
どうでもいいけどアレを「完璧な回答」とか言ってる時点でお察しw
ファイルディスクリプタを使った方法にはPOSIXの範囲では解決できない重大な落とし穴がある。
まあ態々言わなくても分かるだろうから,明言はしないがw
2019/08/07(水) 15:23:56.01ID:3XS5MIC7
ああ一応分からん人の為にヒントをいうと,実は2018年あたりの過去スレで言及してる。
2019/08/07(水) 18:34:55.40ID:WK8NJ3/V
※その落とし穴がなんなのか言わないのは、わからん人のためよりも
俺に意地悪をすることを選んだから。結局それがそいつの本性なんだよ。
2019/08/07(水) 19:38:28.14ID:DcvmRDxD
{{"item1":["key1":"value1"]},{"item2":["key2":"value2"]}}
{{"item1":["key1":"value1"]}}
{}
{{"item1":["key1":"value1"]},{"item2":["key2":"value2"]},{"item3":["key3":"value3"]}}

みたいに中途半端なjsonがたくさん混ざっているファイルを

item1,item2,item3
value1,value2,
value1,,
,,
value1,value2,value3

のような綺麗なcsvで出力する方法ってありますか?
jqコマンドを使っても上手くいかず……
2019/08/07(水) 19:41:37.81ID:WK8NJ3/V
>>629
それ中途半端なjsonじゃねーよ
jsonlという形式だ。jsonエル
2019/08/07(水) 19:46:34.34ID:WK8NJ3/V
1行ずつループで回してもできそうだが、なんどもjqコマンドを呼び出すことになって
時間がかかりそうだから、
[
1行目 ,
2行目 ,
3行目 ,
4行目
]

みたいに変換して、jq一発にしたほうが速いだろうな。
そのやり方は、俺以外でも答えられるやろ?
2019/08/07(水) 22:04:49.28ID:fPg/gK/3
>>629
GNU awk 4.0.0 以降で

$ gawk -ijoin -vFPAT='"[^"]+"' '{
for(i=1;i<=NF;i+=3){
item[$i]=1
row[NR,$i]=$(i+2)
}
}END{
for(i in item){x[n++]=i}
n--
print join(x,0,n,",")
for(i=1;i<=NR;i++){
k=0
for(j in x){
r[k++]=row[i,x[j]]
}
print join(r,0,n,",")
}
}' data.jsonl
2019/08/08(木) 02:47:04.99ID:/tBUMiMq
これは、Ruby で、JSON.parse できない。
何や、この形式は?
{"item1":["key1":"value1"]}

[ ] の中に、{ } を入れたら、OK だが、
{"item1":[{"key1":"value1"}]}
634633
垢版 |
2019/08/08(木) 03:01:29.15ID:/tBUMiMq
https://jsonformatter.curiousconcept.com/

このサイトで、JSON の形式が正しいかどうかチェックしたら、エラーになった!

{"item1":["key1":"value1"]}
Error:Expecting comma or ], not colon.
2019/08/08(木) 03:55:09.53ID:10jj0QOT
>>632
すげえ!
口先だけの>>631とは全然違うわw
2019/08/08(木) 06:10:00.05ID:l7k6B2kQ
>>629
{{"item1":["key1":"value1"]}}
じゃなくて
{{"aaaa":["bbbb":"cccc"]}}
でも
"cccc" って表示されるけどOK?

あと {{"item1":["key1":"val\"ue1"]}}
みたいに " がデータに入ってる場合はあるの?

それと key1、key2、key3 ってキー名が変わるのは正しいの?

jsonlとしても正しくないけど、書き間違いじゃないの?
2019/08/08(木) 07:06:18.58ID:DLp++heI
>>629
これJSONじゃないしフォーマットおかしいってだけじゃね?
正しいJSONならjqだけでcsv変換できるぞ
638633
垢版 |
2019/08/08(木) 07:20:32.75ID:/tBUMiMq
JavaScript で、: は、オブジェクトの属性だろ。
だから、{ } 内でしか使えない

だから、1 はダメで、2, 3 はOK

1. {"item1":["key1":"value1"]}

2.1 {"item1":["value1"]}
2.2 {"item1":["key1","value1"]}

3. {"item1":[{"key1":"value1"}]}
2019/08/08(木) 07:25:15.97ID:l7k6B2kQ
フォーマットが不自然なんだよな。独自フォーマットなら
その仕様を言ってくれないと答えようがない。
例えば、そこに書いてあるキー以外も存在するのか?とか
改行はどうなってるのかとか
2019/08/08(木) 09:21:44.35ID:rLFqUIXU
>>629は「中途半端なjson」と言ってるから分かってる気はするけど、
半可通な上司か先輩がJSONを分かったつもりになってるだけで
仕様なんかちゃんと考えて無いと思うなw
2019/08/08(木) 10:06:35.63ID:X/CTiqlR
本物のjsonにしちゃえ
独自フォーマットする利点ないでしょ
2019/08/08(木) 11:39:13.74ID:/tBUMiMq
独自形式など、作るだけ無駄

パーサーを作るにも、特殊文字のエスケープ処理など、バグが増えるだけ!
2019/08/08(木) 11:47:10.43ID:FeKpuToe
昨日質問したものですが中途半端に書いてしまい申し訳ありませんでした
まだ勉強不足の学生でして……
こっちが正しいjsonと出力させたい内容です

{"aaa":{"bbb":["ccc"]},"xxx":{"yyy":["zzz"]},"あああ":{"いいい":["ううう"]}}
{"aaa":{"bbb":["ccc"]},"xxx":{"yyy":["zzz"]}}
{}
{"aaa":{"bbb":["ccc"]}}



aaa,xxx,あああ
ccc,zzz,いいい
ccc,zzz,
,,
ccc,,
2019/08/08(木) 11:47:20.30ID:FeKpuToe
jsonlですね
2019/08/08(木) 11:53:47.59ID:FeKpuToe
aaa,xxx,あああ
ccc,zzz,ううう
ccc,zzz,
,,
ccc,,

です
2019/08/08(木) 12:28:53.27ID:FeKpuToe
連レスすみません
例えばaaaとあああだけ抜き取りたい場合
さきほどのjsonlから

aaa,あああ
ccc,ううう
ccc,
,
ccc,

と表示させる方法も知りたいです。
全部表示させた後にawkで削除した方がいいのでしょうか?
2019/08/08(木) 12:42:36.15ID:X/CTiqlR
使いまわせるから
...|awk 'Xxx'
648デフォルトの名無しさん
垢版 |
2019/08/08(木) 12:46:24.42ID:0w2TiazL
>>643
学生なら先生に聞けばいいじゃん。
宿題?それでも先生に聞いていいんだよ。

まあ、ここでは丁度良いお題にもなるから良いかも知れないが、宿題の提出期限とかそちらの都合は無視されるよ。
2019/08/08(木) 12:56:15.36ID:PTwvjoI/
>>646

$ ... | cut -d, -f1,3
2019/08/08(木) 13:40:08.52ID:l7k6B2kQ
>>646
もとのデータが悪かっただけ。
jsonlだったらjqで普通に扱える。

echo "aaa,xxx,あああ";
jq -r '[.aaa.bbb[0], .xxx.yyy[0], ."あああ"."いいい"[0]] | @csv' data.jsonl

ダブルクォートがいらないなら、@csvをjoin(",")にする

こことか見れば良い
https://medium.com/veltra-engineering/jq-supports-json-to-csv-fb5c951a9575
2019/08/08(木) 14:01:33.05ID:SmETYGNQ
>>650
おおおおお!!!ありがとうございます!!!
自分がやったときは完全一致してないとエラーが起きてましたのでありがたいです
今後はROMってもっと勉強します
2019/08/08(木) 14:03:20.11ID:l7k6B2kQ
なるほどjqコマンドだけでやるにはこうすればいいのか

jq -r -s '["aaa","xxx","あああ"], (.[] | [.aaa.bbb[0], .xxx.yyy[0], ."あああ"."いいい"[0]]) | @csv' data.jsonl
653631
垢版 |
2019/08/08(木) 14:04:54.81ID:l7k6B2kQ
>>635
すげえだろ?
2019/08/08(木) 14:12:53.47ID:DLp++heI
なんだかなーw
2019/08/08(木) 14:16:46.09ID:SmETYGNQ
今調べてみたら
.aaa.bbb[]と入力していたので全部一致してないとエラーになってたっぽいです
.aaa.bbb[0]に変えている>>650では一致してないところも空欄で出力されてましたので求めるものでした
2019/08/08(木) 14:20:36.14ID:10jj0QOT
>>653
もしかして皮肉という概念をご存知ない…?
2019/08/08(木) 14:26:26.08ID:DLp++heI
>>655
それ配列ってことは要素数が1以上の場合もあるわけだよね
先頭だけでいいの?
2019/08/08(木) 14:29:47.06ID:SmETYGNQ
>>657
要素数は一つですので大丈夫です。
2019/08/08(木) 14:41:50.23ID:DLp++heI
>>658
問題ないならいいけど [0] より []? 使ったほうが良いよ
2019/08/08(木) 14:45:49.24ID:PRJfiUWC
bashって可変長引数で綺麗に処理できないの?

bash test.sh a b c d e
って打ったら
xaz,xbz,xcz,xdz,xez

bash test.sh a b c
って打ったら
xaz,xbz,xcz

って出るものを作りたいんだが$@を使って色々やっても
xa b c d ez,
って出力しかできぬ
661631
垢版 |
2019/08/08(木) 14:50:06.59ID:l7k6B2kQ
>>660
あんたが可変長引数を綺麗に勝利できないだけ

printf '%s,' a b c
a,b,c,
662631
垢版 |
2019/08/08(木) 14:50:53.94ID:l7k6B2kQ
printf 'x%sz,' a b c d e
xaz,xbz,xcz,xdz,xez,
2019/08/08(木) 14:55:38.24ID:X/CTiqlR
>>660
while [ $# -gt 0 ];
do
printf x
printf $1
printf "z\n"
shift
done


sh multi_arg.sh a b c d e
xaz
xbz
xcz
xdz
xez

\nいらなかったな
あと間に,でやるやつ必要か
そのへんpass
664631
垢版 |
2019/08/08(木) 15:01:30.29ID:l7k6B2kQ
ぶっちゃけ $@ を使ってどうやれば
xa b c d ez, が出せるんだろうって悩むレベルw
2019/08/08(木) 15:10:54.30ID:PTwvjoI/
$ set -- {a..e}
$ l=;for v in "$@";do l="${l}${l:+,}${v}";done;echo "$l"

for 文で "in" を省略すると "$@" が対象になるので

$ l=;for v;do l="${l}${l:+,}${v}";done;echo "$l"

としても可。
2019/08/08(木) 15:33:36.84ID:PTwvjoI/
いけね、x と z で挟むの忘れてたわ

$ l=;for v;do l="${l}${l:+,}x${v}z";done;echo "$l"
2019/08/08(木) 18:25:37.21ID:cY5mPUh7
>>660

これを1まとめの変数にする方法ってあるか?

bash test.sh a b c d 

って打つと↓を変数で使えるようにしたい(最後だけ,を外して)

xaz,xbz,xcz,xdz

ループさせて配列に入れて${test[@]}でxaz,xbz,xcz,xdz,
って出力させることならできたけど最後の,が邪魔で仕方ない
2019/08/08(木) 18:27:40.23ID:l7k6B2kQ
> これを1まとめの変数にする方法ってあるか?
あるに決まってるだろ。

自分でやり方を模索しろや

> 最後の,が邪魔で仕方ない

ならつかないようにするか消せばいいだけだろ
2019/08/08(木) 18:31:34.31ID:l7k6B2kQ
シェルスクリプト特有のテクニックがわからないならともかく
常識的なやり方すら見いだせないなら適性無いで
2019/08/08(木) 18:37:00.79ID:cY5mPUh7
マウント上等!教えてくれ!

${test[@]%,*}でいけると思ったが、これって配列じゃ無理なんか
悔しいねぇw
2019/08/08(木) 18:38:11.84ID:l7k6B2kQ
誰かが教えてやってるやろ
2019/08/08(木) 18:38:45.45ID:10jj0QOT
>>668
こいつ昨日の>>626か?
知識があるのは結構だが偏屈な理由でそれを教えようとしないのは目障りだからやめろ。
公共の場所だ,ちっとは考えて行動しろ。
もしも教えたくないのなら,最初から反応するな。
2019/08/08(木) 18:39:41.22ID:l7k6B2kQ
おいおい。IDみろよ。俺は重大な落とし穴があるで
教えんけどなー。みたいなことは言わない。
2019/08/08(木) 18:41:43.33ID:10jj0QOT
>>667
$ cat ./test.sh
eval -- "var=$(printf 'x%sz,' $@ | sed -e 's/,$//')"
echo $var
$ bash ./test.sh a b c d
xaz,xbz,xcz,xdz

どうぞ。
2019/08/08(木) 18:42:02.61ID:zA0vFDSV
シェルスクリプトにこだわっても意味内
単なる自己満足
2019/08/08(木) 18:43:40.32ID:l7k6B2kQ
>>674
evalいらねーだろ。その程度でいーばるーなよw
2019/08/08(木) 18:47:18.20ID:l7k6B2kQ
あと、eval の -- は POSIX準拠じゃない。 dashではエラーになるな。
2019/08/08(木) 18:49:50.48ID:l7k6B2kQ
それと $@(と$var)にダブルクォートがついてないのもマイナス点だな
2019/08/08(木) 18:52:26.35ID:PTwvjoI/
>>674
$ bash ./test.sh a "b c" d
xaz,xbz,xcz,xdz

となってしまうので、

var=$(printf 'x%sz,' "$@" | sed -e 's/,$//')

var=$(printf 'x%sz,' "$@" | head -c -1)
2019/08/08(木) 18:59:43.93ID:X/CTiqlR
多分配列つめこんで paste で糊付けしてくれる
paste はいわゆる join()のはず
2019/08/08(木) 18:59:47.03ID:l7k6B2kQ
sed呼び出すぐらいならParameter expansionを使ったほうが楽で速いだろう
2019/08/08(木) 19:04:50.27ID:cY5mPUh7
お前らありがとう

want="$(IFS=,; echo "${test[*]}"}"

ってやったら求めるものが出せた
2019/08/08(木) 19:09:09.68ID:10jj0QOT
>>677
bash前提のスクリプトなんですがそれは
2019/08/08(木) 19:09:41.31ID:l7k6B2kQ
カッコの対応がおかしい。
サブシェルに入れる理由がないわけじゃないが、これで処理終了なら遅くなるだけ
この程度でbash依存するのは無駄。長くなってるだけ
2019/08/08(木) 19:11:29.10ID:l7k6B2kQ
>>683
じゃあbash 2.05aとそれ以前でエラーになると言っておこう
2019/08/08(木) 19:14:12.37ID:l7k6B2kQ
${l}${l:+,} は俺もよく使うが、ループで毎回比較処理をすることになるし、
最後に末尾処理をしたほうが、速いんじゃないかなーって
常々思ってしまう。lが二回出てくるから1行が長くなることが多いし
2019/08/08(木) 19:53:16.22ID:l7k6B2kQ
試してみたけどやっぱりだ。最後に末尾処理するほうが速い。
dashやkshだと2倍ぐらい差が出る。
bashやzshはこういう処理が何故か遅くて差もあまり出ないけど
2019/08/08(木) 22:21:10.86ID:HFY26hHh
へんなこだわりだな
2019/08/08(木) 22:27:17.98ID:/tBUMiMq
Ruby では、Array#join で自動的に、最後の区切り文字を削除してくれる

ary = [ "a", "b" ]

p ary.join( "," )

#=> "a,b"
2019/08/08(木) 22:40:09.53ID:X/CTiqlR
そりゃそうだ joinは配列から文字列に変換するときに
間の糊付けをしてくれるのだから
2019/08/08(木) 23:05:36.97ID:PTwvjoI/
単純な join でセパレータが一文字なら定番の

$ (IFS=,; echo "$*")

で良いのだろうけど
2019/08/09(金) 01:09:56.64ID:err5h/zJ
無自覚なバカってほんと厄介だな
2019/08/09(金) 01:22:55.05ID:sB3SWfXZ
>>688
1行でできるから:+を使いたくなるけどね。
でも変数名が長いと見づらくなっちゃう。

余計なものをくっつけて、最後に削るのは一見無駄なことをしてるように思えるけど
そっちの方が速いってはっきりしたので、これからは気兼ねなく、
:+を使わない方法を使えるようになったよ

>>691
コマンド置換だと遅くなるよ。
IFS=,; echo "$*" でいいでしょ? IFSを戻したいなら戻せばいいだけだし。
それに変数に入れる場合、var="$*" だと最後の改行もちゃんと保存されるけど
コマンド置換を使うと消えてしまう。
2019/08/09(金) 01:27:47.18ID:sB3SWfXZ
>>691
> 単純な join でセパレータが一文字なら
という話が出たので、問題。

今回は a b c を xaz,xbz,xcz にしたいから IFS=, を使わなかったわけだが
それでもIFS=,を使うならばどうすればよいだろうか?

言い換えると、引き数 a b c を xaz xbz xcz にすればいいわけだが、
さてどうすればよいだろうか?
2019/08/09(金) 02:31:44.47ID:oVYwNj0v
そんな面倒なことをシェルスクリプトでやるのはやめる
客が7&いじゃなければ大丈夫だろ
2019/08/09(金) 02:45:58.64ID:err5h/zJ
日本語崩壊してて草
2019/08/09(金) 03:00:09.73ID:tip6m9df
>>667
$ var=$(printf "x${1}z";shift;(($#)) && printf ',%sz' "${@/#/x}")
2019/08/09(金) 03:18:20.23ID:tip6m9df
>>694
$ (set -- "${@/#/x}";set -- "${@/%/z}";IFS=,;echo "$*")
2019/08/09(金) 03:22:06.84ID:sB3SWfXZ
>>697
とっても無理矢理感があるなw

まず引き数がないときに、xzと表示されるバグが有る。
あと後半意味がわからんw

単純に && printf ',x%sz' "$@" でいいんでないの?
(($#))もいらんし
2019/08/09(金) 03:25:55.01ID:sB3SWfXZ
>>698
なるほど。bash依存だとそれができるのか。それは盲点だった。
書いてなかったけど、POSIX準拠の場合はどうなるだろうか?
2019/08/09(金) 03:43:31.73ID:tip6m9df
>>699
shift 後の $# が 0 以上だと成功になってしまうので引数が1個の場合、
$ set -- a
$ var=$(printf "x${1}z";shift&&printf ',%sz' "${@/#/x}")
$ echo "$var"
xaz,z

となってしまう。

一応、引数は1個以上を想定して、2個以上なら (($#))&& は不要なんだけどね
引数なしでも処理するなら、もっと酷くなるw

var=$((($#))&&{ printf "x${1}z";shift;(($#))&&printf ',%sz' "${@/#/x}"; })
2019/08/09(金) 03:46:25.07ID:tip6m9df
おっと、

var=$((($#))&&{ printf "x${1}z";shift;(($#))&&printf ',x%sz' "$@"; })

だね
2019/08/09(金) 03:55:40.01ID:sB3SWfXZ
ああprintfは引き数がない場合でも表示されるのか
2019/08/09(金) 04:24:13.39ID:err5h/zJ
>>673
仮に別人だとしても同じようなことしてるぞ。
自分で模索しろとか言って解法を提示していないにもかかわらず
ある程度要求を満たす解法が上がった瞬間それにケチ付けはじめてるじゃん。
もしもほんとうに「自分で模索しろ」って思ってんなら黙っときゃいい話。
わざわざ人が答えを述べてからそれに乗っかるなんてマネする必要ない。
2019/08/09(金) 04:28:32.89ID:err5h/zJ
>>700
このコマンドラインをPOSIXに準じたものにするには
(愚直に言えば)単に${VAR/aaa/bbb}をprintf '%s' "$VAR" | sed -e 's/aaa/bbb/'
に変えればいいだけでは?

それかPOSIXの範疇で変数の置換展開を実現する方法を訊いているのか?
それじゃあ多分無理だ。
2019/08/09(金) 04:30:09.25ID:err5h/zJ
まあ尤もprintf sedなんていちいち呼び出すなんてバカなマネは普通しないが。
2019/08/09(金) 04:35:02.69ID:sB3SWfXZ
>>705
違うでー、引き数の a b c を xaz xbz xcz にする方法を
聞いてるんだぜー
2019/08/09(金) 04:36:42.97ID:sB3SWfXZ
このテクニックはいろいろと応用が効くのだ!キリッ!
2019/08/09(金) 04:39:32.46ID:yPcnAt2h
shiftを上手く使えば
N番目以降の引数だけ別の処理に使うことってできるよね?
あとbashの引数って10超えるとおかしくなるってマジ?
2019/08/09(金) 04:40:03.48ID:yPcnAt2h
10超えると→10個以上引数持たせると
2019/08/09(金) 04:40:29.97ID:sB3SWfXZ
>>709
嘘 ${10} を使えばいい。
(相当古いシェルは非対応だったりするらしいが)
2019/08/09(金) 04:44:59.16ID:sB3SWfXZ
引数をうまく扱うにはshift、
引数を高度に扱うにはevalを使う
2019/08/09(金) 05:33:56.10ID:err5h/zJ
>>707
じゃあこれでどう?
態々IFS弄ったり何度も置換したりする必要はない。
printf 'x%sz ' "$@" | sed -e 's/ $/\
/'
2019/08/09(金) 16:11:09.79ID:R8nkiB91
awkとか使ってtsvを別のtsvに挿入させる方法ってある?

hoge.tsv
a b e
1 2 5

huga.tsv
c d
3 4



hoge_huga.tsv
a b c d e
1 2 3 4 5

みたいな
2019/08/09(金) 17:22:23.99ID:tip6m9df
行と列をひっくり返す transpose っていう awk script を作って、

========
#!/usr/bin/awk -f

{for(i=1;i<=NF;i++) a[NR,i]=$i}
END{
for(j=1;j<=NF;j++) {
str=a[1,j]
for(i=2;i<=NR;i++) str=str" "a[i,j]
print str
}
}
========

$ paste hoge.tsv huga.tsv | ./transpose | sort -k1,1 | ./transpose
a b c d e
1 2 3 4 5
2019/08/09(金) 17:43:24.97ID:UutwPLbs
>>714
paste hoge.tsv huga.tsv | awk 'BEGIN{OFS="\t"}{print $1,$2,$4,$5,$3}'
a b c d e
1 2 3 4 5
2019/08/09(金) 18:18:03.48ID:err5h/zJ
>>715
こっちのやりかたのほうが汎用的だし個人的には好きかな。
2019/08/09(金) 18:25:29.43ID:UutwPLbs
(´-`).。oO(列の挿入なのに何故ソートするんだろう)
719デフォルトの名無しさん
垢版 |
2019/08/09(金) 18:26:02.71ID:X5pM/Zqg
>>716
awkのところcutでやろうとして失敗してる質問stackoverflowにたくさんあるね。
何度も提案されたが全部リジェクトされたんだとか。
https://stackoverflow.com/questions/1037171/forcing-the-order-of-output-fields-from-cut-command/#answer-1037260
2019/08/09(金) 18:42:56.05ID:xLAwVgGE
む。出遅れたか。気づいていたんだが書き込む時間がなかった。

>>716 と近いが、tsvなら入力をタブ文字にしたほうが良いだろう
でないとスペースまで区切りとして扱われる

paste hoge.tsv huga.tsv | awk -F"\t" -v OFS="\t" '{print $1,$2,$4,$5,$3}'
2019/08/09(金) 18:45:10.20ID:xLAwVgGE
>>718
それな。いかにも要求されてないことをやってるだろw
このスレ、例を出すと、その例を"だけ"に通用するコード書くやつ多いぞ
それを訂正するのに労力がかかるって言った意味わかるやろ?
2019/08/09(金) 18:48:55.70ID:xLAwVgGE
>>713
その答えもありだが、それはそれとして
引き数の a b c を xaz xbz xcz にするPOSIX準拠のテクニックって
あまり知られてないのか?
まさかこんなに出ないとは思わなかった。
2019/08/09(金) 19:01:27.20ID:xLAwVgGE
同時に二つのファイルを開くやり方も分かったことだし、
ついでにシェルスクリプトだけで実現するやり方を書いておこう

#!/bin/sh

exec 3<./hoge.tsv
exec 4<./huga.tsv

IFS=$(printf '\t')
until
 eof=1
 read -r col1 col2 col3 <&3 && eof=''
 read -r col4 col5 <&4 && eof=''
 [ "$eof" ]
do
 set -- "$col1" "$col2" "$col4" "$col5" "$col3"
 echo "$*"
done
2019/08/09(金) 19:03:15.21ID:R8nkiB91
>>720
おおおおおおありがてぇ!

区切りもタブ指定しないとyyyy-mm-dd hh-mm-ssとかがずれるよね
2019/08/09(金) 19:04:32.76ID:xLAwVgGE
>>724
また、てめぇぇぇぇか!
726デフォルトの名無しさん
垢版 |
2019/08/09(金) 19:10:00.87ID:X5pM/Zqg
GNU datamashってのがあんだね。
$ paste hoge.tsv huga.tsv | datamash transpose | sort | datamash transpose
とか。挿入じゃなくてソートだけど。
2019/08/09(金) 19:14:10.02ID:tip6m9df
ソートしたのは >>714 で hoge.tsv と huga.tsv の一行目の項目が辞書順に
並ぶ様に挿入する、って思ったんだよね
2019/08/09(金) 19:21:09.66ID:UutwPLbs
>>720
FSのデフォルトはスペースとタブだから指定する必要ないよ
2019/08/09(金) 19:21:36.74ID:err5h/zJ
なんかこのスレに書き込む質問者ってお客は神様だみたいな発想してる人多い印象がある。
多少の問題は自力で解決しろよって思うわ。
「その例"だけ"に〜」とか喚いてるけど,その「例」とやらがマズい例なのでは?とは1ミリも考えてなさそう。
いつも自分が正しい。問題の責任は他人にある。

まあスレの全員がそうじゃないけどね。極一部。
2019/08/09(金) 19:21:58.99ID:UutwPLbs
>>728
あーごめん
間違ったこれ取消w
2019/08/09(金) 19:22:34.09ID:xLAwVgGE
>>728
アホか、スペースとタブだからタブだけにするんやろw
2019/08/09(金) 19:25:33.15ID:xLAwVgGE
>>729
例っつーのはな、本題があって、それを補足するためのものなんだよ。
本題が本当にやりたいこと、

お前>>714本題の文章「awkとか使ってtsvを別のtsvに挿入させる方法ってある?」
読んで、ソートしたいって思うか?

お前は「いつも自分の解答が正しい。問題の責任は質問した他人にある。」
と考えてるんやろ?
2019/08/09(金) 19:27:56.83ID:UutwPLbs
(´-`).。oO(勘違いしたって言ってるんだからもうええやん)
2019/08/09(金) 19:28:06.46ID:xLAwVgGE
>>694の問題は本日24:00で締め切るでー
シェルスクリプトに詳しいと思ってる人、
挑戦してみてやー
2019/08/09(金) 19:29:12.17ID:xLAwVgGE
>>733
スレ更新してから書き込むまでに、34秒以上かかっただけだよw
2019/08/09(金) 19:33:01.55ID:OjVO+GBn
主気取り
2019/08/09(金) 19:34:19.38ID:xLAwVgGE
しゅ‐き【主気】
?名? そのものがいつも持っている運気。⇔客気(かっき)。〔夢渓筆談‐象数・一〕
738デフォルトの名無しさん
垢版 |
2019/08/10(土) 00:01:07.05ID:L+B8OP2P
はい、24:00締め切りでーす。

> 引き数 a b c を xaz xbz xcz にすればいいわけだが、
> さてどうすればよいだろうか?

解答

for i in "$@"; do
 set -- "$@" "x${i}z"
 shift
done
739デフォルトの名無しさん
垢版 |
2019/08/10(土) 00:04:08.85ID:L+B8OP2P
別解

for i in "$@"; do
 set -- "$@" "x${i}z"
done
shift $(($# / 2))
2019/08/10(土) 00:14:02.13ID:6d2gRK68
なんかシラケちゃったな
741デフォルトの名無しさん
垢版 |
2019/08/10(土) 00:14:33.81ID:L+B8OP2P
知らんがな
2019/08/10(土) 01:26:32.09ID:lTTXvTcQ
なんか対抗するつもりはないけど俺の回答のほうが何やってるか分かりやすい気がする…。
まあトリッキーなシェルスクリプトを書くのは個人の自由だけど
743デフォルトの名無しさん
垢版 |
2019/08/10(土) 01:56:14.18ID:L+B8OP2P
>>742
こんなのトリッキーのうちに入らんでしょ。
シャルスクリプト特有の書き方ってだけ

POSIXの範囲ではシェルスクリプトで使える配列は
パラメータ引数しか無い。その貴重な配列を使いこなせば
bash依存もせずにすむよ
2019/08/10(土) 02:44:27.27ID:x6+Jkr/9
bashでいいじゃん
bash動かないようなクソ環境なんかないだろ今時
2019/08/10(土) 02:48:00.53ID:6d2gRK68
POSIX原理主義者の彼にはそんな煽りは通用しない!
2019/08/10(土) 02:51:21.01ID:L+B8OP2P
そのとおり。Debianがdashを使ってるのだ。どうしようもない。
2019/08/10(土) 02:52:20.68ID:L+B8OP2P
あとAlpine Linuxとかな
2019/08/10(土) 02:58:22.15ID:lTTXvTcQ
>>743
うむ。トリッキーと書いたのは失敗だったな。
ちょっと勘違いを生んでしまった。
繰り返すけどあなたの解答を否定する気は全くないし,自分の解答が一番だなんて思ってないけど
引数「a b c d」を「xaz xbz xcz」に変換するにあたって
「手続き型言語としてのシェルスクリプト」を考えたときに
「引数に順次同じ変換を施して→余計なものを置換する」ほうが
「引数の仕様を利用してfor文を回す→(置き換えられた)引数として利用」
よりも単純かなぁと思っただけ。

あと(問題文に書いてないので推測するしかないが)引数自体はそのまま残したい場合もあるだろうから
引数を置き換えてしまう方法だと不本意な結果を招くかもしれないとも思った。
それこそ「引数を置き換えて新たな引数として利用したい」という要求ならばfor文とsetコマンドを使った方法が
いいんだろうけども。

ところで>>713がBash依存という話だけど
sed -e 's/ $/\
'
↑これってBashでしか使えなかったっけ? sedで何かから改行に置換する方法。
一応The Open Groupの仕様書には
A line can be split by substituting a <newline> into it.
The application shall escape the <newline> in the replacement by preceding it by a <backslash>.
と書かれてるんだけど。
2019/08/10(土) 03:00:17.60ID:L+B8OP2P
bash依存っていうのは ${test[@]} とか printf ',%sz' "${@/#/x}" のことな
2019/08/10(土) 03:03:44.77ID:L+B8OP2P
>>713に関して言えば、
引き数の a b c を xaz xbz xcz にする方法を聞いてるのに
質問の答になってないねとしか言えないから
2019/08/10(土) 03:10:55.16ID:lTTXvTcQ
>>750
うん?
$ cat ./test.sh
#!/bin/sh

printf 'x%sz ' "$@" | sed -e 's/ $/\
/'
$ ./test.sh a b c
xaz xbz xcz
となって要求を満してそうなんだけども,違うのかな?
2019/08/10(土) 03:11:46.31ID:L+B8OP2P
>>694 再掲

> 今回は a b c を xaz,xbz,xcz にしたいから IFS=, を使わなかったわけだが
> それでもIFS=,を使うならばどうすればよいだろうか?
>
> 言い換えると、引き数 a b c を xaz xbz xcz にすればいいわけだが、
> さてどうすればよいだろうか?

>>738または>>739でパラメータ引数$@に入ってないと
IFS=,を使って xaz,xbz,xcz にすることができないだろ
問題をちゃんと読んでいれば、わかるはずのことだが
2019/08/10(土) 03:12:41.50ID:L+B8OP2P
はぁ、またわずかに書くのが遅れたw
2019/08/10(土) 03:35:54.66ID:6d2gRK68
$@ の中身が printable character だけなら GNU awk の SUBSEP 変数と同じ
様に IFS に '\034'(File Separator) を指定して

[ $# -eq 0 ] && exit 0
IFS=$(printf '\034');set -- $(printf "x%sz${IFS}" "$@")
IFS=,;echo "$*"

とか
2019/08/10(土) 03:42:31.75ID:L+B8OP2P
それだと引数に、"a b" が入ってるときにうまく動かない

あと先手を打ってるつもりなら、これを読むように
https://en.wikipedia.org/wiki/ASCII#Printable_characters
2019/08/10(土) 03:43:06.24ID:L+B8OP2P
訂正
それだと "a b" のように引数にスペースが入ってるときにうまく動かない
2019/08/10(土) 03:46:54.60ID:L+B8OP2P
間違えたw
2019/08/10(土) 03:50:33.54ID:6d2gRK68
set -- a "b c" d
IFS=$(printf '\034');set -- $(printf "x%sz${IFS}" "$@")
IFS=,;echo "$*"

とすると xaz,xb cz,xdz となるのだが、そういう事じゃなくて?
2019/08/10(土) 03:54:52.71ID:L+B8OP2P
>>758
うん。だから見落としてたw

そうだな。あとはサブシェルを使うから遅いのと、
それよりも、zshだと
$ ./test.sh a b c
xaz,xbz,xcz,
最後に,がつく
2019/08/10(土) 03:57:09.38ID:leF4BPLu
bash ならどれぐらい分かりやすく書ける?
2019/08/10(土) 03:58:27.60ID:lTTXvTcQ
ぽじっくすに拘ったりぜっしゅに拘ったり急がしやっちゃなw
2019/08/10(土) 04:01:38.59ID:lTTXvTcQ
>>760
Bashとか持ち出すとbash 2.xとか今現在どこでも使われていないバージョンのことも考えないといけなくなるぞw
Solarisでさえbash 4なのにw
2019/08/10(土) 04:04:22.25ID:lTTXvTcQ
因みに>>738>>739はset -uしてると引数が存在しない場合に古いシェルで動かない
2019/08/10(土) 04:04:55.05ID:6d2gRK68
>>759
zsh だと set -- $(printf "x%sz${IFS}" "$@") 後の $# の値が 4 になるのね
POSIX 的には $# == 3 になるのが正しい動作なのかね?
2019/08/10(土) 04:06:36.42ID:lTTXvTcQ
>>752
訊きたいんだけど,
引数を完全に置き換えてしまうことについてはどう思ってる?

再掲するけど
> (問題文に書いてないので推測するしかないが)引数自体はそのまま残したい場合もあるだろうから
> 引数を置き換えてしまう方法だと不本意な結果を招くかもしれないとも思った。

引数自体を弄くる方法だとこういうことになるのでは……?
2019/08/10(土) 04:08:24.77ID:lTTXvTcQ
>>752
例えば>>738でIFS=,を使った場合ってどういう挙動になるのが理想なの?
2019/08/10(土) 04:09:03.91ID:L+B8OP2P
>>761
> ぽじっくすに拘ったりぜっしゅに拘ったり急がしやっちゃなw

何いってんの? POSIX互換シェルにこだわってるだけだよ。
POSIXもdashもzshもbashもワケてない
POSIX互換シェルという一つのこだわりw
2019/08/10(土) 04:11:01.54ID:L+B8OP2P
>>763
> set -uしてると引数が存在しない場合に古いシェルで動かない

苦笑(知ってるw)

間違ってないが、具体的にどのシェルで動かないか言えるかい?
2019/08/10(土) 04:14:17.41ID:L+B8OP2P
>>764
> POSIX 的には $# == 3 になるのが正しい動作なのかね?
めんどくさくて調べてないな。

でもzshだけではなく、今は使われてないだろう古いシェルや
とあるシェルの古いバージョンでは4で、後のバージョンでは3になってたりするから
おそらく $# == 3 が正しいのだろう。

だが、現実として動かないシェルがある
POSIX互換シェルに拘ってるといったが、正確にはPOSIX互換シェルと名乗っている
現実に存在するシェルに拘っているというべきか
2019/08/10(土) 04:14:54.05ID:L+B8OP2P
>>766
>>694に書いてる
2019/08/10(土) 04:15:21.60ID:lTTXvTcQ
ZshってPOSIX互換を謳ってたっけ?
少なくとも公式ページ[zsh.org]にはそんな記述は見当らんが…。
もしかしてemulate -R shをPOSIX準拠モードとかだと思ってる…?
2019/08/10(土) 04:19:09.04ID:lTTXvTcQ
>>770
いやまって。マジで分からんわw
引数「a b c」を「xaz xbz xcz」にする過程でIFS=,を使う場面なんてあるか?
そして仮にあったとして
>>713>>738とでその時の挙動に違いがあるとは思えんのだが↓
もしかして
引数「a,b,c」を「xaz xbz xcz」にするとかそういう話か?
for i in IFS=, "$@"; do
set -- "$@" "x${i}z"
shift
done

echo "$@"
こんな風に?w
2019/08/10(土) 04:20:00.43ID:L+B8OP2P
>>762
Solarisは10まで(POSIX互換ではない)Bourne Shellが
デフォルトシェルだってのがいただけない
Extended Supportが2021年までらしい。
まあ俺はPOSIXじゃないからという理由で切り捨てることにしてるが
2019/08/10(土) 04:20:29.77ID:lTTXvTcQ
>>694
> 今回は a b c を xaz,xbz,xcz にしたいから IFS=, を使わなかったわけだが →分かる
> それでもIFS=,を使うならばどうすればよいだろうか?→そうだな,どうすればいいんだろう。

> 言い換えると、引き数 a b c を xaz xbz xcz にすればいいわけだが、→え?空白区切り?今IFS=,の話だよな??
> さてどうすればよいだろうか? →????
2019/08/10(土) 04:23:34.50ID:L+B8OP2P
>>772

>>694再掲 読める?

> 今回は a b c を xaz,xbz,xcz にしたいから IFS=, を使わなかったわけだが
> それでもIFS=,を使うならばどうすればよいだろうか?
2019/08/10(土) 04:26:01.61ID:L+B8OP2P
>>774
お前プログラマに向いてないよw
推論能力が圧倒的に不足してる

引数が、xaz xbz xcz の状態なら、IFS使って xaz,xbz,xcz にできるだろw

って言っても理解できないんだろうなw
2019/08/10(土) 04:28:59.25ID:YdwKfvKq
いつものクイズくん
2019/08/10(土) 04:29:01.72ID:L+B8OP2P
>>771
zshのマニュアルにはPOSIXという文字が50個以上存在する
これでPOSIXを意識してないとか考えられんわw
2019/08/10(土) 04:29:23.37ID:L+B8OP2P
>>777
呼びました?(別に隠してない)
2019/08/10(土) 04:35:32.28ID:6d2gRK68
>>778
Zsh is able to emulate POSIX shells, but its default mode is not POSIX compatible

なんて書いてあるから何か変数を設定しないとダメみたいだな
色々弄ってるけど $# が 3 にならんのぅ…ソースコード読むしかないかなw
2019/08/10(土) 04:38:16.54ID:L+B8OP2P
>>780
たぶんその挙動はバグで確定だと思うでw
2019/08/10(土) 04:41:34.35ID:L+B8OP2P
>>768の質問には答えてくれないのかな?
set -uしてると引数が存在しない場合に動かない古いシェルはなにか?
2019/08/10(土) 04:42:42.71ID:lTTXvTcQ
>>776
うんだってプログラマじゃねーもんw

寧ろその程度の能力でイキれるお前がプログラマっぽくねぇなw

こっちの類推能力も足りんかもしれんが
そっちの説明能力もかなり欠如してんぞw
2019/08/10(土) 04:43:21.02ID:lTTXvTcQ
>>782
すまんがその前に>>765に答えてほしい
2019/08/10(土) 04:44:17.65ID:L+B8OP2P
別にイキってないが、イキってるように見えるのは
俺じゃなくて、お前の問題でしょう? 普通のことなのにお前にはそう見えてしまう。
2019/08/10(土) 04:45:41.26ID:L+B8OP2P
>>784
何に答えればいいの?

引数を完全に起きかえたいなら置き換えればいいし
置き換えたくないならば、置き換えなければいいだけじゃん
2019/08/10(土) 04:49:56.25ID:L+B8OP2P
なんで>>765みたいな質問が来るのかを推測したが、
提示したコードはそれで「完成したコード」で
そのコードを修正した「応用」は存在しないとか思ってないか?
違うことをしたいならそれに応じて変えればよかろう?
2019/08/10(土) 04:50:45.96ID:lTTXvTcQ
>>782
>>786で一応答えを頂いたので,>>768への回答をば。
https://www.in-ulm.de/~mascheck/various/bourne_args/
ここの
These shells behave the old way and need ${1+"$@"}:
に色々載ってるぜ
俺が知らないシェルもあって勉強になったわ。
2019/08/10(土) 04:57:52.03ID:lTTXvTcQ
>>785
うーむ。自省という言葉を教えてあげたいw
まあある程度シェルスクリプトの能力はありそうだが
それ以外が致命的とお見受けするわ……。

ていうかシェルスクリプトの能力ってそんな高める必要ある?
>>713程度が書ければそれで十分。
より高度な,それこそJSONやXMLみたいな階層構造のある
「1行1データ」とは限らない形式のファイルを読み込みたけりゃ,
CなりPerlなりを使えばよろしい。
もしくはjqやらxmllintやらで適切に処理して
シェルスクリプトに掛ければよろしい。
2019/08/10(土) 05:00:56.32ID:L+B8OP2P
>>788
それを探してきたかw

じゃあそこに書いてない情報を。
poshは<0.10(8年前)ということになってるが、未だ最新版(9ヶ月前)の0.13.2でも修正されていない
だから「古いシェル」は実は間違い

バグ報告はでてるんだがねぇ

posh: set -u prevents using empty argument list
Date: Wed, 3 May 2017 12:24:01 UTC
Found in version posh/0.12.6
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=861743

posh can not use "$@" together with set -u
Date: Wed, 14 Nov 2018 10:00:01 UTC
Found in version posh/0.13.2
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=913718
2019/08/10(土) 05:03:11.51ID:L+B8OP2P
>>789
> ていうかシェルスクリプトの能力ってそんな高める必要ある?

俺がやりたいことを実現するのに必須だったから
自然と高くなっただけ
2019/08/10(土) 05:19:53.11ID:YdwKfvKq
>>789
無駄だろう、最初から偉ぶりたいのが目的なんだから
他人と同等になっただけでも負けとかなんとか思ってるのだろう
2019/08/10(土) 06:27:36.08ID:lTTXvTcQ
>>790
うーん。
まあそうなのかもしれないが
poshを「無意識に」使ってしまう環境なんてあるのだろうか?
例えば#!/bin/shが/usr/bin/bashにリンクされてる環境であれば,
BashのPOSIX互換モード特有のバグには注意しなくてはいけないし,
/bin/shの実体が/usr/bin/bashになってる環境は多いので,
多くの利用者が「今 自分が使っている/bin/shが実はBashだ」と意識することなく
POSIX shで正しく動く筈のシェルスクリプトを走らせることがあると想定できる。
でもposhが既定で/bin/shにリンクされてたりする環境があるとは思えない…。
2019/08/10(土) 08:53:06.96ID:x0rFB4wI
>>751
この書き方が分かりやすくて良いと思うんだけど何か問題あるの?
2019/08/10(土) 09:44:59.99ID:L+B8OP2P
>>794
その話はもう終わってる
2019/08/10(土) 09:50:56.01ID:L+B8OP2P
>>793
何が言いたいのかわからん。

set -uで動かないシェル(例 posh)があると言い出した(>>763)のはあんただろ?

なんで俺が書いたコードがset -uで動かないと言い出した本人が
set -uで動かないシェルを使う環境なんてあるとは思えないって言ってるんだよw
2019/08/10(土) 09:52:55.77ID:lTTXvTcQ
>>794
もう触れるな。
2019/08/10(土) 09:55:34.95ID:L+B8OP2P
>>796に対する返答は?
2019/08/10(土) 10:06:01.28ID:x0rFB4wI
引数を置換するってだけで何をぐだぐだ言ってるんだかw
2019/08/10(土) 10:15:01.29ID:L+B8OP2P
だから>>751は「引数を置換する」コードになってないだろ?
2019/08/10(土) 10:20:30.35ID:x0rFB4wI
オリジナルの引数を置換するのはプログラマーの本能が止めろと言っているw
普通は置換したもの別の変数に入れて使うよな
2019/08/10(土) 10:31:58.19ID:L+B8OP2P
>>801
そのルールを守りつつ、IFS=,でjoinするというテクニックを使って(必須です。カンマ区切りをするときに使用します)
引数 a b c (例です。引数の内容、個数は変わることがあります)から
xaz,xbz,xcz (例です。引数の前後にxとzをつけてカンマ区切りにするという意味です)
という出力を得るコードを書くところまでやるのが君の仕事。
それができれば一人前だ!
2019/08/10(土) 10:37:28.54ID:L+B8OP2P
「POSIX準拠で」をつけ忘れたなw
そこまで文脈読めてないやつじゃないだろうが
2019/08/10(土) 10:43:31.28ID:x0rFB4wI
マウントとらないと死んじゃう病気なのかw
2019/08/10(土) 10:47:01.43ID:L+B8OP2P
>>804


俺はシェルスクリプトではやらないが、
他の言語で引数を置換するのはやめろというのはわかるから
その理屈は間違いじゃないとして、じゃあそれをシェルスクリプトでやるには
どうすればいいだろうか?という新たな出題に変えただけだけど?

いや、できるでしょ?これ。
2019/08/10(土) 10:48:10.57ID:L+B8OP2P
もちろんトリッキーなコードになるだろうけど
(こういうのこそトリッキーというべきだろう)
2019/08/10(土) 10:49:05.37ID:x0rFB4wI
え?
だから>>751でいいじゃん
何か問題あるのか?
2019/08/10(土) 10:49:46.44ID:L+B8OP2P
>>807
自分でルールを守ってない

> 普通は置換したもの別の変数に入れて使うよな
2019/08/10(土) 10:51:11.39ID:x0rFB4wI
>>808
は?
だから出力を変数に入れて使えばいいんだろ
2019/08/10(土) 10:51:49.42ID:L+B8OP2P
それから >>751 に関しては
引数をIFS=,でjoinするならばどうすればいいだろうか?という
出題のルールを守ってないよねってことで>>694に反してる。
2019/08/10(土) 10:52:52.04ID:L+B8OP2P
>>809
また書くのが遅れたけど、>>751>>694のルールを守ってないのでだめなんだよ。
その話は終わったって言ってるでしょw
2019/08/10(土) 10:54:58.72ID:L+B8OP2P
>>809
「置換したものを別の変数に入れて」使わなければだめ
「出力したものを別の変数に入れる」のは自分で作ったルールに違反してるw
2019/08/10(土) 10:58:02.57ID:x0rFB4wI
やりたいことができればそれでいいじゃん
2019/08/10(土) 11:22:44.90ID:L+B8OP2P
「やりたいこと」は>>694に書いてあるとおり
「IFS=,でjoinするために引数を置き換える」がやりたいこと(解答はすでに出してる)

んで、新しい問題の「やりたいこと」は>>802に書いてあるとおり
2019/08/10(土) 11:44:27.56ID:x0rFB4wI
手段が目的化する典型的な例だな
そんな縛りプレイに付き合う気になれんな

で、後からコード出して
こんなのも分からんのか?大したことねえな
ってやりたいんだろ?

それはな、
その問題がつまらないから誰もやらないんだよw
2019/08/10(土) 12:08:44.58ID:Du6eKhDT
>>798
「コードがset -uで動かない」という発言と
「poshを「無意識に」使ってしまう環境なんてあるのだろうか?」という発言は
ほぼ矛盾しないと思うんだけど。

set -uで"$@"が空のとき失敗するシェルはposhだけじゃない。
>>788で示したリンク先を見てくれ。
なぜかあなたはposhに拘ってるけど(最近になっても解決してないからか?)。

poshに限った話じゃないのに,なぜかposhに限定して話を進めてるから困るわ。
2019/08/10(土) 12:09:45.60ID:Du6eKhDT
あ,ごめん。ID変わってるけど>>797とかです。
2019/08/10(土) 12:22:13.64ID:L+B8OP2P
>>816
あんたはposhが使われる環境があるとは思えないが
古いシェルが使われる環境はあると思ってset -uの話をしたってこと?

> bash-4.0.0 ... -4.0.27
> dash-0.4.6 ... -0.4.18
> all ksh88
> ksh93 until release t+20090501
> pdksh-5.1.3, -5.2.14
> mksh before R39 (as pdksh descendant)
> posh < 0.10 (as pdksh descendant)
> NetBSD 2 ff. /bin/sh
> all traditional Bourne shells

bash 4.0といえば2009年だね。10年近く前のシェルで動かないからって何?
そんなシェルのことまで考えろって言いたかったの?
2019/08/10(土) 12:23:33.86ID:L+B8OP2P
>>815
俺に出されるのが嫌なら、お前が先に出せばいいやんw
2019/08/10(土) 12:31:02.29ID:x0rFB4wI
>>819
問題がつまらないって言ってるだけだ
なんで俺が問題出さなきゃならんのよ
お題スレでも行けや
2019/08/10(土) 12:37:04.59ID:L+B8OP2P
な?日本語の読解力に問題があるやろ?

俺は>>815にレスをしていて、その>>815
> で、後からコード出して
と書いてあるように、"出す"のは"コード"という話をしてるのに
"問題"を出す話だと勘違いしてくる。

もうね。日本語のレベルでおかしいから、会話にならんのよ。
2019/08/10(土) 12:42:22.81ID:x0rFB4wI
>>821
お前の言葉が足りないだけだ
エスパー期待するなよアホ
2019/08/10(土) 12:43:50.43ID:L+B8OP2P
足りないなら足りない部分を指摘するべき。
自分で勘違いしておいて、後から足りなかったんだっていうなよw
2019/08/10(土) 12:46:05.58ID:x0rFB4wI
誤解されたくないならちゃんとした日本語書けや
2019/08/10(土) 12:48:05.67ID:x0rFB4wI
まあどっちでも同じことだけどなw
2019/08/10(土) 13:00:05.30ID:6d2gRK68
お前らいつ寝てるん?
827デフォルトの名無しさん
垢版 |
2019/08/10(土) 13:04:34.25ID:C/8mgJdF
プロのグラマーなら半球睡眠はコモンスキル
2019/08/10(土) 13:35:44.59ID:lTTXvTcQ
>>826
???「24時間働けますか?」
2019/08/10(土) 13:37:08.94ID:lTTXvTcQ
>>818
うん。
だって>>685でbash 2.xの話をしてるということは
少なくともBashがそのバージョンであった時代くらいまでは考えるべきなんでしょ?
2019/08/10(土) 13:40:51.55ID:4go3Z6Df
OSXのデフォルトシェルがBash3だったはずと思ったら、最新のOSXだとZshになってるんだな
ま、LTSの古いOSとか、BSD系だとBash4じゃないのも結構あってまだ動いてると思う
2019/08/10(土) 14:00:29.15ID:8bQWJq+q
実務だとプログラミングって才能とかよりどれだけ知識を蓄えてるかの方が重要だよね?
このスレに居る猛者はどうやって強くなったんすか
2019/08/10(土) 14:31:51.55ID:/e4xqllv
才能のないのはまず脱落する。
体力のないのもすぐ脱落する。
あとは下積みあるのみ。
2019/08/10(土) 14:39:24.77ID:lTTXvTcQ
シェルスクリプトの才能ってなに?
驕り高ぶらないこと?w
↑半分本気
2019/08/10(土) 14:42:35.88ID:PeAU5cUa
シェルスクリプトって5行以内で使うルールで使ってるけど
引数をたくさん使いたいっていう有用なケースってある?
2019/08/10(土) 16:16:23.61ID:L+B8OP2P
>>829
その時代まで考えることと、poshが最新版でも
直ってないことは矛盾しないんだがw
2019/08/10(土) 16:17:39.49ID:L+B8OP2P
>>834
引数に * を使いたいときw
2019/08/10(土) 16:22:27.62ID:L+B8OP2P
>>830
>>2にも書いてあるが、/bin/shの実体が何かわからん時代になったからな

>  FreeBSD ユーザーは /bin/sh の実体が ash なので注意。
>  Solaris, OpenBSD ユーザーは /bin/sh の実体が ksh なので注意。
>  macOS 10.15以降のユーザーは/bin/sh の実体が zsh なので注意。
>  android ユーザーは /bin/sh の実体が mksh なので注意。

bashで動けば良いんでしょ?という時代は終わった。
POSIX準拠で書かないと多くの環境で動かない。
2019/08/10(土) 16:56:21.94ID:62yvq4d3
多くの環境で動くための何を作っているのかね
2019/08/10(土) 17:00:18.98ID:lTTXvTcQ
840デフォルトの名無しさん
垢版 |
2019/08/10(土) 17:01:40.37ID:tdOS9ehT
>>834
複数ファイルに対して同一の処理をする時。
例えば特定の文字コードに変換するとか。
2019/08/10(土) 17:04:52.26ID:4go3Z6Df
クロスプラットフォーム必要なケースで、シェルスクリプトで作り込んだりしないよ
PerlかPythonか、Windowsも対応するならGoとか使う
2019/08/10(土) 17:10:57.28ID:L+B8OP2P
>>838
逆じゃね? 何かをシェルスクリプトで作ったとして
多くの環境で使うなら、多くの環境で動かんとだめでしょw
2019/08/10(土) 17:14:02.55ID:L+B8OP2P
>>841
例えば組み込み機器でPerlやPythonも入ってない、入れられないときはどうする?
シェルスクリプトはかろうじて使える(最初から入ってるから)
Goはバイナリがでかいから、空き容量も制限されてる組み込み機器には入れたくない
今はIoT時代ですよ(笑)
2019/08/10(土) 17:24:27.35ID:leF4BPLu
>>843
シェルスクリプトってすごいんだな
そんな組み込みでも走るとは
2019/08/10(土) 17:35:44.47ID:L+B8OP2P
>>844
組み込みLinux用に作られたBusyBoxっていうのがあって、
一つのバイナリに様々な外部コマンド(catとかsedとかwcとか)が詰め込まれてる。
そのBusyboxにashも組み込まれてる。

ただし様々な外部コマンドが組み込まれてるといっても、POSIX完全準拠を
目指しているわけじゃなくて、容量節約のためあまり使われないオプションを実装していない。
それでもシェル(ash)はPOSIX準拠になってる。

BSDなどでもそうなんだが外部コマンドはオプションが違うことがある。
オプションの違いでLinuxで動いたものがMacで動かなかったりするが
シェルスクリプトで実装していればそういうこともない。
2019/08/10(土) 17:37:10.25ID:L+B8OP2P
(Busyboxは組み込み用ではあるが、組み込みLinux用とは限らんかw)
2019/08/10(土) 17:46:25.47ID:6d2gRK68
(´-`).。oO(IoT機器で文字列くっつけたりTSVファイルを混ぜたりしているのか…
2019/08/10(土) 17:53:19.49ID:L+B8OP2P
そりゃすることもあるだろw

IoTはモノのインターネットの略なんだから
インターネットにあるものと連携してるよ。

TSVやCSVだけじゃなくJSONやXMLやYAMLも扱いたい
(簡易なことならsedなどで対応できるが)
849デフォルトの名無しさん
垢版 |
2019/08/10(土) 17:56:06.44ID:C/8mgJdF
やっぱりどこでも動くシェルスクリプトなんて幻想なんだね…
2019/08/10(土) 17:56:37.22ID:6d2gRK68
(´-`).。oO(心の声に反応しないで欲しい…w
2019/08/10(土) 18:04:41.45ID:L+B8OP2P
>>849
POSIX準拠でシェルスクリプトで書けば可能だって言ってんだろw
852デフォルトの名無しさん
垢版 |
2019/08/10(土) 18:30:59.43ID:SA5rOGgq
今現在でも世界中で書かれているシェルスクリプトの一体何%がPOSIX準拠なのか。
ま、実質幻想だね。
2019/08/10(土) 18:31:19.35ID:4go3Z6Df
まあ無理だね
2019/08/10(土) 18:38:02.19ID:6d2gRK68
(´-`).。oO(心は常に幻想を追い求める…原理主義者の業の深さよ…
2019/08/10(土) 19:05:33.96ID:blTYOOvx
具体性ゼロだな。単なる可能性想像上だけの話だな
多くは限られた環境しか使わんし、それで動けばいい、何か他で使うようなときに問題があったら考えようで十分だろな
使ってる環境(OS)にデフォで入っている汎用スクリプトもそのOSでしか動きませんというのもそんなもんだし
2019/08/10(土) 19:15:08.08ID:L+B8OP2P
例えば、gitはいろんな環境で使うが、35.7%がシェルスクリプトである

https://github.com/git/git
2019/08/10(土) 19:24:04.14ID:gKKk3ZAT
(´-`).。oO(いつからgitはPOSIXコマンドになったんだろう)
2019/08/10(土) 19:26:31.61ID:6d2gRK68
シェルスクリプトと言いつつ Perl もご使用の様子

https://github.com/git/git/blob/master/git-filter-branch.sh#L284
2019/08/10(土) 19:29:59.92ID:L+B8OP2P
35.7%っていってるんだから、探すまでもなく他の使ってるってわかるだろw
2019/08/10(土) 19:30:21.32ID:L+B8OP2P
>>857
gitがPOSIXコマンドだって誰も言ってない
2019/08/10(土) 19:34:35.69ID:6d2gRK68
少なくとも git-filter-branch.sh は perl がインストールされていない環境では
動作しない…それに、シェルスクリプトの表現能力が(他の言語に比べて相
対的に)低いために全体の占める割合が高くなってしまっているという可能性
も否定できない。別段それが悪いわけではないが。
2019/08/10(土) 19:49:03.72ID:lTTXvTcQ
gitコマンドの話(しかも実装の話)を延々とされても困るわ
2019/08/10(土) 19:51:14.48ID:L+B8OP2P
そりゃ具体例があるという話をされると困るやろなw
2019/08/10(土) 19:52:40.23ID:L+B8OP2P
じゃあ続いての具体例、rbenv。Shellが96.5%
https://github.com/rbenv/rbenv
2019/08/10(土) 19:56:39.76ID:6d2gRK68
shbang が全部 #!/usr/bin/env bash だな。個人的にはこの方がいいけどw
2019/08/10(土) 19:58:18.27ID:gKKk3ZAT
(´-`).。oO(gitを使うシェルスクリプトはPOSIX準拠じゃないだろ)
2019/08/10(土) 19:59:11.41ID:L+B8OP2P
gitを使うシェルスクリプトってなんのこと?
2019/08/10(土) 20:01:14.55ID:gKKk3ZAT
gitを呼び出すシェルスクリプト...
2019/08/10(土) 20:03:00.81ID:N6maMe0S
まさかと思ったが具体性のために git を出したのか。誰がそんなことを聞いているねん
ここにいるどんだけの人がそういう多くの人が使うのを書いているねん。今までのでもほとんど「私用」だろに
2019/08/10(土) 20:03:07.19ID:L+B8OP2P
gitを呼び出すシェルスクリプトの話は誰もしてない
2019/08/10(土) 20:04:38.53ID:L+B8OP2P
>>869
世界の話をするな。ここにいる人たちだけの話をしろ
俺たちの村の話だ。って言いたいわけ?
2019/08/10(土) 20:07:18.63ID:N6maMe0S
私用で限られた環境で動けばいいのならPOSIXにこだわる必要性はほぼゼロだな
そしてこのスレでの限られた人を除いては、あくまでも私用範囲といういたって普通の話だろう

だから、あなたがgitレベルの何を書いているのかね?そういう具体性。自分でそういうの書いていないのに?
2019/08/10(土) 20:20:07.09ID:N6maMe0S
>>865
結局彼は何を言いたいのかな?わけわからんなw
2019/08/10(土) 20:32:37.04ID:6d2gRK68
ワシもわけわからんw 具体例なら例の某POSIX原理主義者が書いた
ピュアシェルスクリプトの nkf 互換コマンドを出せばいいのに、って思う
2019/08/10(土) 20:40:24.97ID:N6maMe0S
それが nkf を置き換えるぐらいメジャーだったら出してたのかも
所詮お遊び趣味可能性を示しただけという認識なのかも
よく知らんけどそのスクリプトがどれだけ使われているのか
2019/08/10(土) 20:40:54.36ID:x0rFB4wI
例えばさ、リモートでHW情報(CPU,メモリ,ディスク...)を取得したいとするじゃん
プラットフォームも様々Linux, FreeBSD, mac...
これPOSIX準拠で書けるかって話

実装はsshでログインしてproc見てってやるじゃん
sshはPOSIXコマンドじゃないし
procはLinuxとBSD系で構成が違うから判断が必要

POSIXで担保できる可搬性には限界があるってことだ
2019/08/10(土) 20:44:39.21ID:6d2gRK68
>>875
確かに処理速度が遅すぎて全然使い物にならんかったよ…
本人は「遅くてもいいのだ、POSIXシェルがあればどこでも
使えるんだから」って強弁してたけどw
2019/08/10(土) 20:45:40.10ID:N6maMe0S
w
(そんなオチかよw)
2019/08/10(土) 20:49:13.37ID:lTTXvTcQ
どうでもいいけどgitやらrbenvやらって「POSIXシェルスクリプト」で書かれてんの?
そうじゃなきゃ彼の「世界中でPOSIX準拠のシェルスクリプトが動いてる!」って主張は
まったく支援されない,いや寧ろBashに依存したシェルスクリプトがrbenvという世界的な
プログラムで採用されてることによってその説は説得力を失なってるまである。

あ,「俺は『世界中でPOSIX準拠のシェルスクリプトが動いてる』なんて言ってない」なんて
くだらねー反論を先に封じておくと,
>>852に対して>>856を出した訳だから,
当然「シェルスクリプトの一体何%がPOSIX準拠なのか」に答えてる訳だからねぇ。
2019/08/10(土) 21:19:03.25ID:L+B8OP2P
>>874
> ピュアシェルスクリプトの nkf 互換コマンドを出せばいいのに、って思う
しらんけど、どうせ大部分がawk実装で、
シェルスクリプトで実装してないんだろ?
2019/08/10(土) 21:19:45.62ID:L+B8OP2P
>>879
> どうでもいいけどgitやらrbenvやらって「POSIXシェルスクリプト」で書かれてんの?

話ずれまくりw いろんな環境で動くことが重要って話だろ
2019/08/10(土) 21:23:38.65ID:6d2gRK68
>>880
いや、POSIXシェルの機能だけを使ってる。可搬性は高いが遅い。
2019/08/10(土) 21:31:01.53ID:N6maMe0S
いろんな環境で動くなにを書いているのだか...w
2019/08/10(土) 21:33:10.93ID:L+B8OP2P
>>883
思いつかない人のために、gitやrbenvという具体例をだしました。
2019/08/10(土) 21:35:17.53ID:L+B8OP2P
>>882
それがどこにあるのかしらんが、iconvがPOSIXなのでどうでもいいかなw
nkfなんて所詮日本語にしか対応してないし
2019/08/10(土) 21:35:31.35ID:eyby+BxV
意味わからん逃げだな
そんなに多くの人が使ってるようなの書いていたら言えるだろうに。具体的に
2019/08/10(土) 21:39:50.03ID:L+B8OP2P
>>886
もしかして俺が誰か特定したかったのか?
2019/08/10(土) 21:41:52.82ID:eyby+BxV
なにを言っているのか意味わからん
いろんな環境で動くがほぼ絶対なんだろう?そのいろんな環境で動くなにを書いているんだよという素朴な疑問
多くはいろんな環境で動くのを想定してなんていなく、自分の使う環境でしかとしか思わないからな
2019/08/10(土) 21:50:32.32ID:L+B8OP2P
>>888
> そのいろんな環境で動くなにを書いているんだよ

俺の個人的な便利ツール
2019/08/10(土) 21:52:52.92ID:L+B8OP2P
便利ツールは、俺が興味がある環境すべてで使う。
LinuxやBSDやmacOSや組み込み環境
Unixも興味あるがSorarisとMac以外は個人で使うのが難しいので残念
2019/08/10(土) 21:52:57.75ID:eyby+BxV
だったら、いろんな環境で動くがほぼ絶対はあんただけのことだな
2019/08/10(土) 21:55:49.46ID:L+B8OP2P
>>891
俺が和洋中すべての料理を食べるって言ったら、
これらの料理を食べるのは、俺だけってことになるんか?
2019/08/10(土) 21:56:20.44ID:lTTXvTcQ
被害妄想やばない?
894デフォルトの名無しさん
垢版 |
2019/08/10(土) 21:58:00.05ID:SA5rOGgq
問.今現在でも世界中で書かれているシェルスクリプトの一体何%がPOSIX準拠なのか

池沼の答え1.gitは35.7%がシェルスクリプトである。俺は問に答えた!

池沼の答え2.rbenvはShellが96.5%。これが具体例だ!

ぼく「・・・」
2019/08/10(土) 21:59:30.89ID:eyby+BxV
>>892
また意味わからんことを言い出す
いろんな環境で動くがほぼ絶対と聞いたら俺の個人的な便利ツールってんんだもん、そんなの「あなたの[限られた]環境」の話だろう

結局自分の趣味の話だけじゃないの(なにその>>890のもろ趣味ですは)
それを根拠に他人に押し付ける、他人のを否定するんじゃないよ
2019/08/10(土) 22:01:46.59ID:L+B8OP2P
>>895
お前、他の人が「個人的な便利ツール」を持ってないとでも思ってんのか?

なんで、俺一人から情報もらったら、
世界全部のことを知ったつもりになるのさw
2019/08/10(土) 22:03:58.32ID:L+B8OP2P
>>894
あのー?その問いに答えたつもりはないんですが?

>>855が「具体性ゼロだな。多くは限られた環境しか使わんし、それで動けばいい」っていうから
具体的に、いろんな環境で動かすツールを出したんですが?
2019/08/10(土) 22:04:32.77ID:eyby+BxV
>>896
意味わからん。なに言っているの?
特定な環境で動く個人的ツールの方が腐るほどあるだろうなんて理解できないの?個人的ツールだろ?意味わかって個人的ツールって使ってるの?
2019/08/10(土) 22:12:33.18ID:L+B8OP2P
>>898
だから、俺の個人ツールの話を聞いただけで、
POSIX準拠が必要なのは、世界中で俺だけだって判断してるのが
意味不明だって言ってるんだがw
2019/08/10(土) 22:18:08.74ID:eyby+BxV
根本的に何も理解できないのな
マルチプラットフォームを意識するスクリプトも当然あるし、そうじゃない特定の環境で動けばいいスクリプトも当然ある

あんたは前者ひとつと言うからおかしい。具体的にって聞いたら個人的ツールってことなので、全然いろんな環境で動くがほぼ絶対ではないってことだよ
というか逆に特定の環境で動けばいいの方が多数を占めているのが現実だろう。なぜかは自分で>>890で言っているようなもん

POSIX大好きいろんな環境で動くスクリプト書くのが好きってだけだな
2019/08/10(土) 22:24:37.93ID:L+B8OP2P
>>900
あのさぁ、俺はすべてのシェルスクリプトがPOSIX準拠するべきだなんて一言も言ってないんだが?
お前の思い込みだろ。俺がそう言ってるって。

俺は
POSIX準拠であれば、多くの環境で動く(事実)
俺が使ってる個人ツールは、多くの環境で動かしたい(事実)
俺の個人ツール以外でも、gitに含まれてるスクリプトやrbenvなど多くの環境で動かしたいものはある(事実)
としか言ってないの
2019/08/10(土) 22:27:45.82ID:L+B8OP2P
他にも俺が言ったことには、

外部コマンドはオプションが異なることがあるので、シェルスクリプトで実装すると、
その違いに振り回されなくてすむ

というのがあります。
2019/08/10(土) 22:37:35.17ID:eyby+BxV
>>830に対して>>837なんて言い出す、それも自分ではPOSIXでの人だからそうとられても仕方がないと思うけど
(>>830はbashとzshの違いだし、デフォルトシェルが変わるだけでbashにすればだけで済む話でもあって)

まあ、言う通りなら俺の読み違いってことだな、まあ、すまんかった...腑に落ちないがw POSIXで書く書かないは好きにしろってことなら、すまんかった
2019/08/10(土) 22:48:47.16ID:lTTXvTcQ
だいたいPOSIXに従ってないシェルもあるんだから
POSIXで書いたからといってどこでも動くわけじゃないし。

なんというか,ベンダ依存を嫌うあまりPOSIXに「依存」してしまってる感がある。
2019/08/10(土) 22:49:05.60ID:x0rFB4wI
ここってPOSIXシェル以外の話題もおkなんだよな
なのに、それはbash依存とか外部コマンド使ったら遅いとか押しつけがましいやつがウザいんだよ
そんなもん好きに書かせろやって感じだわ
2019/08/10(土) 22:50:33.71ID:AU+T1mdi
まったく言う通りでございますw
2019/08/10(土) 22:56:44.56ID:L+B8OP2P
> 最新のOSXだとZshになってるんだな
という話に続いて、他のOSではいろんなシェルが使われてるという話をすることに
なんの問題があるのかわからんが?

bashをインストールするのが大変な環境もあるんだし
POSIX準拠の範囲でできるなら、POSIX準拠でやればいいだろ。対して手間もかからんし。
逆にオプションの違いで動かんことに対応する方が手間なんだよ。

上の方でも出てたけど、sort -Vで動くウェーイってやってたらmacOSで動かんのだろ?
(ぐぐって確かに動かんというような記事ばかりだが、最新のmacOSだと対応してる気もするw)
2019/08/10(土) 22:58:46.81ID:AU+T1mdi
結局POSIXで書けって言ってるだろうに。ふらふらしてんなあ
2019/08/10(土) 23:01:39.84ID:L+B8OP2P
>>904
> だいたいPOSIXに従ってないシェルもあるんだから
> POSIXで書いたからといってどこでも動くわけじゃないし。

もっといい案があれば採用するが?
条件後出しするなって言われそうだから条件

組み込み機器など含めてソフトウェアを追加するのが困難なシステムでも動く
コンパイルはもとより、クロスコンパイル環境も不要
この条件でできるだけ多くの環境で同じように動く
2019/08/10(土) 23:02:36.58ID:L+B8OP2P
>>908
どこをどう読めば、お前は命令されてるように感じるんだ?w
2019/08/10(土) 23:04:12.98ID:AU+T1mdi
>POSIX準拠の範囲でできるなら、POSIX準拠でやればいいだろ。対して手間もかからんし。
誰に向けて書いているの?
2019/08/10(土) 23:04:27.98ID:L+B8OP2P
補足

> この条件でできるだけ多くの環境で同じように動く
これは多くの"種類"の環境っていみな
世の中Windowsばかりだろという反論は筋違い
2019/08/10(土) 23:05:05.76ID:L+B8OP2P
>>911
する必要もないのに、bashに依存してる人
2019/08/10(土) 23:05:18.04ID:6d2gRK68
なんかシラケちゃったな
2019/08/10(土) 23:05:34.13ID:AU+T1mdi
それがだろうが。自分で何を書いているのかわかららないの?
2019/08/10(土) 23:06:03.29ID:L+B8OP2P
>>915
だからそれってなんだよw
2019/08/10(土) 23:06:21.63ID:AU+T1mdi
一貫性がないね。言質とられても逃げるだけだね
2019/08/10(土) 23:06:45.91ID:L+B8OP2P
ずっと同じこと言ってるだろw
2019/08/10(土) 23:08:20.30ID:AU+T1mdi
別にbashに依存してもいいだろう?それでそのスクリプトの実行に問題がなければ
>俺はすべてのシェルスクリプトがPOSIX準拠するべきだなんて一言も言ってない
と相入れないね
2019/08/10(土) 23:09:10.56ID:L+B8OP2P
唐揚げにレモンをかけると美味しくなりますよって言ったら、
「俺にレモンをかけろと命令したな!ムキー」って怒るような
話が通じない人が多いw
2019/08/10(土) 23:10:11.18ID:AU+T1mdi
わからんけど、複数が「?」と思ってるのだよ。よく考えような
2019/08/10(土) 23:11:23.84ID:L+B8OP2P
>>919
bashに依存してもいいだろ。というと
POSIXのすることのメリットは矛盾しないからねw

「bashに依存してもいいだろ」はお前の主観で、
POSIX準拠で作ることのメリットは客観的なもの
客観的事実に、主観で反論しないでください
2019/08/10(土) 23:11:53.50ID:L+B8OP2P
>>921
そうだと良いね(笑)
2019/08/10(土) 23:12:31.18ID:AU+T1mdi
それもPOSIX好きな主観だとは気づかないのね
2019/08/10(土) 23:13:23.36ID:L+B8OP2P
>>924
「POSIX好き」は主観
そのPOSIX好きの俺が述べてるPOSIX準拠のメリットは客観
2019/08/10(土) 23:14:17.64ID:L+B8OP2P
あと11レスで今日一日でこのスレの1/10を俺が占拠したことになる。
お前ら、レス頑張れ!
2019/08/10(土) 23:14:26.20ID:AU+T1mdi
結局何を言いたいの?POSIXで書け、できるだけそう書けと言いたいの?
2019/08/10(土) 23:15:52.78ID:L+B8OP2P
>>927
POSIX準拠で書けば、メリットがあるので、
POSIX準拠で書く話をしましょう。
ネタがなければ、私が時々問題を出しますよ

興味がない人は見なくていいです。
レスもしなくていいです。
2019/08/10(土) 23:16:41.85ID:AU+T1mdi
すべてのシェルスクリプトがPOSIX準拠するべきだ
との違いがわからんな
2019/08/10(土) 23:19:56.39ID:6d2gRK68
     ∧∧  ミ _ ドスッ
     (   ,,)┌─┴┴─┐
    /   つ.  終  了 │
  〜′ /´ └─┬┬─┘
   ∪ ∪      ││ _ε3
            ゛゛'゛'゛
2019/08/10(土) 23:23:45.46ID:L+B8OP2P
>>929
Javaで書けばいろんなOSで動きます。

と言ったからって、ドライバまでJavaで書けと言ってるんだ!
なんて思いますか?
2019/08/10(土) 23:27:18.24ID:AU+T1mdi
ドライバがJavaで書けるなら書く人もいるだろう。そんなOSがあれば
不適切よくわからん例えだな

結局
すべてのシェルスクリプトがPOSIX準拠するべきだ
と言ってるのね。好きにしろではなくてPOSIXを強く勧める押し付けがましく
2019/08/10(土) 23:29:21.42ID:L+B8OP2P
>>905
少なくとも5年前から

> □A. お約束
> 1. 特記なき場合は #!/bin/sh がデフォルトです。この場合可搬性に注意し、
>  Traditional Bourne Shell もしくは、POSIX 相当のスクリプトでお願いします。
>  bash / zsh / ksh / ash / dash や OS 等に依存する場合は、明示しましょう。
>  良く分からない方は、使用している OS を書いておけば OK です。是非ご参加下さい。

https://peace.5ch.net/test/read.cgi/unix/1415634843/
2019/08/10(土) 23:30:20.34ID:L+B8OP2P
>>932
> ドライバがJavaで書けるなら書く人もいるだろう。

そう思うのが普通ですよね?
「書けと命令したんだ!ムキー」ってなる方がおかしい
2019/08/10(土) 23:31:49.03ID:AU+T1mdi
自分だって否定されたらそうなってるように見えるけど?
2019/08/10(土) 23:32:16.77ID:L+B8OP2P
>>932
Javaで例えれば冷静になって、
> ドライバがJavaで書けるなら書く人もいるだろう。
っていうわけだよね

でも、POSIXで書けばいろんなOSで動きますって言うと、頭に血が上って
> すべてのシェルスクリプトがPOSIX準拠するべきだ
> と言ってるのね。好きにしろではなくてPOSIXを強く勧める押し付けがましく

っていう感想に変わっちゃうんだよねw
2019/08/10(土) 23:33:23.10ID:L+B8OP2P
俺が「POSIXで書けばいろんな環境で動きます。」って言ったんだから

「POSIXで書けるなら書く人もいるだろう。」って言えばいいだけなのにw

Javaの場合みたいに!
2019/08/10(土) 23:36:17.65ID:AU+T1mdi
全然わかってなくて、そのレスは酷い。なにか揚げ足とってよろこんでいるように見えるけどw
問題なければいいよどうでもというのと、問題なくてもメリットがあるからこっちに「決まってる」という違い
2019/08/10(土) 23:37:50.32ID:L+B8OP2P
メリットを言うと「こっちに決まってる」という文章が書いてあると
勝手に脳内で補完してるんですか?
2019/08/10(土) 23:38:26.61ID:L+B8OP2P
Javaのメリットを言いました。
メリットがあるから、こっちに「決まってる」と?
2019/08/10(土) 23:40:37.90ID:AU+T1mdi
>POSIX準拠の範囲でできるなら、POSIX準拠でやればいいだろ。対して手間もかからんし
>する必要もないのに、bashに依存してる人
自分で何を言ってきたのか忘れたの?
2019/08/10(土) 23:41:50.08ID:L+B8OP2P
>>941
それだと俺が言ったことを復唱しただけだよw

だからなに?
2019/08/10(土) 23:42:48.99ID:AU+T1mdi
ソコからなんだけど。そんな直前レスに対しての揚げ足とり的なじゃなくw
2019/08/10(土) 23:45:04.58ID:AU+T1mdi
結局いろいろ逃げてるけど、本心としては
すべてのシェルスクリプトがPOSIX準拠するべきだ
なんだろに。それもただ言ってみただけなのね、なぜか複数が見る掲示板でw
まあいいや
2019/08/10(土) 23:45:09.53ID:L+B8OP2P
>>943
言うべき言葉は何も見つからなかったの?中身がなにもないんだけど?
2019/08/10(土) 23:45:53.29ID:L+B8OP2P
>>944

>>901より
> あのさぁ、俺はすべてのシェルスクリプトがPOSIX準拠するべきだなんて一言も言ってないんだが?

明確に否定してんのに、お前何いってんの?
2019/08/10(土) 23:46:08.90ID:AU+T1mdi
正直なにを言い出してるのだかと困惑からだよ
2019/08/10(土) 23:46:21.22ID:L+B8OP2P
お、100レスいったでー(笑)
2019/08/10(土) 23:46:38.90ID:x0rFB4wI
次のスレタイに【POSIX限定】って付けとけよ
アンチ除けになっていいと思うぞ
2019/08/10(土) 23:46:51.76ID:AU+T1mdi
>>946
とてもそうは見えないという結論だな。俺の結論だから気にしなくていいよw
2019/08/10(土) 23:47:16.77ID:L+B8OP2P
950を取った俺が次スレを建てるぞ!

シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
2019/08/10(土) 23:47:33.55ID:L+B8OP2P
のがしたorz (笑)
2019/08/10(土) 23:48:57.21ID:AU+T1mdi
>>949でよろしくねw
2019/08/10(土) 23:49:36.20ID:L+B8OP2P
覚えてたらな
2019/08/10(土) 23:59:39.51ID:6d2gRK68
そういや 【POSIX】 sh系互換 シェルスクリプトスレ ってのがあるやん
2019/08/11(日) 00:00:12.33ID:GFStkW/c
え?どこに?
2019/08/11(日) 00:01:16.28ID:GFStkW/c
ほんとだ!見逃してた! 次スレの関連リンクに追加しといたよ

【POSIX】 sh系互換 シェルスクリプトスレ
https://mevius.5ch.net/test/read.cgi/tech/1535195112/
2019/08/11(日) 00:02:01.46ID:vE4Lr4uN
ほんとだw
2018/08/25
って、つい先日かと思ったら一年前かw
2019/08/11(日) 00:02:46.24ID:vE4Lr4uN
スレ建ててくれたけど、どうかあちらを有効に使っていただきたい
2019/08/11(日) 00:03:02.68ID:lm+uP+yI
あるのかよw
これで棲み分けできるな
2019/08/11(日) 00:03:08.16ID:dSI5JGW8
一年も放置されててよく削除されなかったなw
2019/08/11(日) 00:05:11.80ID:GFStkW/c
住処が二つになった!ドンッ!!
2019/08/11(日) 00:10:56.97ID:GFStkW/c
ここはPOSIX準拠じゃないスレも対応?
fishとかの話題もどんどん扱うってことかな?
2019/08/11(日) 00:13:32.87ID:GFStkW/c
fishってPOSIXと互換性はかなり低かったと思うんだが、
最終的に高い互換性を持たせるつもりなん?


https://www.excite.co.jp/news/article/Cobs_1862541/
> POSIX互換シェルとの互換性向上のために&&、||、!をサポート

fishの設計理念5原則(翻訳):使いやすさのための数々の気遣い
http://fish.rubikitch.com/design-document-ja/
> 可能な限り上記の目標を崩すことなく、fishはPOSIXの構文に従うべきです。
2019/08/11(日) 00:14:43.26ID:vE4Lr4uN
最近では PowerShell なんてもあったり
どんどん扱うとかそういうんじゃなくて、そう否定するのはいないんじゃないかな
知らんけど
2019/08/11(日) 00:15:10.68ID:GFStkW/c
http://fish.rubikitch.com/design-document-ja/

> ・ヒアドキュメントは パイプライン で echo コマンドを使うこととほとんど変わらないので不採用です。
> (訳注:「string trim 複数行文字列リテラル」でも代用可能)
> ・サブシェルとコマンド置換とプロセス置換はとても類似性が強いです。fishは コマンド置換 のみをサポートしています。
> それ以外はブロックまたはpsub標準シェル関数 で実現できます。
> ・別名定義 と シェル関数 の双方を持つことは混乱を招きます。特別にどちらも制限と欠点があるからです。
> fishの関数はいずれの構文の欠点も存在しません。
> ・POSIXのクオートの仕様は馬鹿げています!とくにシングルクォートは!!

やっぱ互換性はないと考えたほうが良いか
2019/08/11(日) 00:25:40.31ID:GFStkW/c
おい、ついてこいよw
せっかくPOSIX以外の話もしてるんだから
2019/08/11(日) 00:27:49.34ID:vE4Lr4uN
なんで「誰もが」興味があると思うのか
2019/08/11(日) 00:29:16.73ID:GFStkW/c
関数定義の構文も違ってるみたいだ
https://fishshell.com/docs/current/tutorial.html#tut_functions
2019/08/11(日) 02:09:43.49ID:EariAe7h
>>714-732
Ruby で作った

require "csv"

options = { :headers => true, :col_sep => "\t" }

table_1 = CSV.read( "hoge.tsv", options ) # 読み込み
table_2 = CSV.read( "huga.tsv", options ) # 読み込み

CSV.open( "hoge_huga.tsv", "w", options ) do |csv| # 書き込み
csv << %w(a b c d e) # header

table_1.zip( table_2 ).each do |one, two|
csv << [ one[ "a" ], one[ "b" ], two[ "c" ], two[ "d" ], one[ "e" ] ]
end
end
2019/08/11(日) 02:44:21.08ID:GFStkW/c
>>970
勘違いしてるぞ。明確に書いてはないかもしれんが a b c d e はヘッダじゃなくてデータだ。
eachは不要。あといつになったら、その古いハッシュの書き方をやめるんだ?

訂正版
require 'csv'

options = { col_sep: "\t" }

table1 = CSV.read('hoge.tsv', options)
table2 = CSV.read('huga.tsv', options)

CSV.open('hoge_huga.tsv', 'w', options) do |csv|
table1.zip(table2) do |one, two|
csv << [one[0], one[1], two[0], two[1], one[2]]
end
end
2019/08/11(日) 03:58:29.22ID:FACDvm3m
偉ぶりたい満々やな
2019/08/11(日) 04:23:39.41ID:GTeyRs5o
長いと大変そう
ruby にもこういうのありそう

DB<8> @a = qw(a b e)
DB<9> splice @a, 2, 0, qw(c d)
DB<10> print @a
abcde
2019/08/11(日) 04:38:47.36ID:++HFlOfG
>>973
それがRubyにはPerlやJavaScriptみたいなspliceがないんだよね
でも今回は、挿入するだけだから、 csv << one.insert(2, *two) が使えるね
順番をもっと柔軟に変えたいってなると面倒だけど
975デフォルトの名無しさん
垢版 |
2019/08/11(日) 05:27:14.15ID:oR4Xkpxd
>>660
そういやこんなのはいかんの?
てか、こういう答え既に出た?

#!/bin/sh

cf=0
for f
do
 if [[ cf -eq 0 ]]; then
  cf=1
 else
  echo -n ','
 fi
 echo -n "x${f}z"
done
echo ''
2019/08/11(日) 16:04:36.86ID:++HFlOfG
>>975
echo -n はPOSIX準拠ではない。が、メンテナンスが続いている最新シェルはすべてサポートされている
と思っていたんだが、上の方で出てるboshが対応してなかったわw
やっぱりprintfを使うのが一番なんだろうな
2019/08/11(日) 16:19:01.34ID:++HFlOfG
改めて調べ直してみたら、yashも-nに対応してなかった。
echo -n aaa ってやったら、 -n aaa って出力される。
単純な出力以外printfばっかり使ってたから忘れてたw
2019/08/11(日) 16:34:27.13ID:++HFlOfG
>  if [[ cf -eq 0 ]]; then

bash依存する必要がないのに、bash依存してる例
2019/08/11(日) 16:44:43.77ID:k+c7cOcw
重箱の隅が気になって仕方がないのね
そういうのは原理主義者としか思えないけどw
適切なスレが別にあるとわかったんだからそっちでどうぞ
980デフォルトの名無しさん
垢版 |
2019/08/11(日) 16:45:13.10ID:2JPwQqrg
やっぱりどこでも動くシェルスクリプトなんて幻想なんだね
2019/08/11(日) 16:52:18.97ID:lm+uP+yI
bash で書くならシェバンで明示するべし

#!/usr/bin/env bash
2019/08/11(日) 17:03:10.35ID:k+c7cOcw
間違いはそこだよなあ。単に
#!/bin/bash
と書こうとして、うっかり
#!/bin/sh
にしてしまった感じかな
2019/08/11(日) 17:34:07.21ID:++HFlOfG
>>979
debianはbash依存をなくすのに苦労したらしいからね。

https://wiki.ubuntu.com/DashAsBinSh
> The major reason to switch the default shell was efficiency.
デフォルトシェルを(dash)に変更する理由は効率性です。

> Programs should be written to the standard,
>and if they use extensions they should declare them;
プログラムは標準で書くべきである。拡張を使うなら宣言しなさい。
正しい言葉だ。

拡張を使う理由がないのに効率性を落とす意味ないからね。
2019/08/11(日) 17:41:28.14ID:++HFlOfG
>>980
どこでも動くために、POSIXに準拠することの大切さがわかるよね。
2019/08/11(日) 17:42:11.13ID:++HFlOfG
>>982
うっかりじゃなくて、無知だと思うよ。
知ってる人が指摘してあげないとね。
2019/08/11(日) 17:46:23.18ID:k+c7cOcw
傲慢だな。そうじゃないと今までの自分のレスが馬鹿みたいだから...
知らないのかもしれないが、/bin/sh が bash の場合、ちゃんとは動かない

てか、あっちのスレを行けよ
2019/08/11(日) 17:49:05.08ID:k+c7cOcw
ああ、/bin/sh が bash で、しかも、bash が 3.x の場合かもしれない
/bin/sh が bash であっても、#!/bin/sh だと>>975のスクリプトはうまく動かないのはね。なので、うっかりとしか思えんな
2019/08/11(日) 17:50:38.09ID:++HFlOfG
> /bin/sh が bash の場合、ちゃんとは動かない

だからちゃんと動かないコードを直すべきでは?
/bin/shはdash, bash, ash, ksh, zsh, mksh のいずれかの可能性がある(他にもあるかもしれない)
2019/08/11(日) 17:51:46.41ID:k+c7cOcw
>>982って言ってるだろ
/bin/sh が bash であっても、#!/bin/sh だと>>975のスクリプトはうまく動かない
ね。詳しく正しくは
2019/08/11(日) 17:57:05.79ID:++HFlOfG
>>987
全角スペースは見やすくするために流石にわざとだとして、
>>975のスクリプトはbash 2.x以上であれば動くよ。確認済み。
(bash 1系の環境は作ってないのでわからん)

Debian、Ubuntuであれば /bin/sh じゃ動かないので
手元のMacかな?それで試しただけだろうね。
2019/08/11(日) 17:59:38.45ID:++HFlOfG
>>989
/bin/shのシンボリックリンクの実体がbash、
つまりposixモードの話をしてるのかもしれないけど、
posixモード(set -o posix)であっても [[ ]] は認識しちゃうからね。

bashのposixモードは、挙動の違いをposixに合わせるだけで
posixにはない拡張機能を無効にすることはないみたい。
2019/08/11(日) 18:01:22.10ID:++HFlOfG
なので>>989が何を言いたいのかわからんね。
具体的に、どういう理由でbashで>>975が動かないのか
どのようなエラーが出力されるのかを言えば
説得力も出ると思うよ。

レス待ってるねw
2019/08/11(日) 18:01:36.14ID:k+c7cOcw
#!/bin/sh
てか、sh とコマンド打って起動してでも、echo -n hello は -n hello と表示されるんだなあ。うちのはw
type echo しても echo is a shell builtin だしね。てか、/bin/echo は -n が効くやつだけど
2019/08/11(日) 18:02:28.72ID:k+c7cOcw
ちなみに、bash --posix で起動しても echo -n hello は -n hello にはならん、なぞww
2019/08/11(日) 18:07:05.61ID:++HFlOfG
> echo -n hello は -n hello と表示されるんだなあ。
POSIXのechoには-nはないからね。-nに依存するコードを書いてはいけない。
POSIX準拠で書く理由が増えたね。
2019/08/11(日) 18:07:37.64ID:k+c7cOcw
誰かさんも使ってると言っていた環境なんだけどなw
$ which sh
/bin/sh
$ ls -l /bin/sh
-r-xr-xr-x 1 root wheel 618480 5 4 16:05 /bin/sh
$ sh --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
$ sh
$ echo -n hello
-n hello
$ exit
exit
$ bash --posix
$ echo -n hello
hello$
2019/08/11(日) 18:08:18.76ID:++HFlOfG
ま、案外
> /bin/sh が bash であっても、#!/bin/sh だと>>975のスクリプトはうまく動かない
の理由は全角スペースが入ってるからだったりしてねw
2019/08/11(日) 18:08:27.92ID:k+c7cOcw
>>995
自説の繰り替えしだけか。しょうもない
2019/08/11(日) 18:09:01.47ID:k+c7cOcw
>>997
よく読めよ。都合が悪くて妄想モードか?
2019/08/11(日) 18:09:45.54ID:lm+uP+yI
1000!
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 40日 19時間 5分 18秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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