シェルスクリプト総合 その31at TECH
シェルスクリプト総合 その31 - 暇つぶし2ch617:デフォルトの名無しさん
19/09/12 18:46:23.43 i3mmqxJn.net
exec 2> >(tee -a stderr.log >&2)
後ろの>&2ってどんな意味なんです?

618:デフォルトの名無しさん
19/09/12 18:46:26.98 Um0WsLAR.net
bashが必要になるようなものはそもそも選択する言語が間違ってると思う

619:デフォルトの名無しさん
19/09/12 19:42:51.04 WUiTiHRA.net
>>608
stderrのをだから(サブシェル内の)stderrに出力、それが無ければstdoutに出力
あんまそれほど意味はなさげのような気がするけど

620:デフォルトの名無しさん
19/09/12 20:41:45.14 WUiTiHRA.net
インタラクティブ、もしくは、それ以下のスクリプトでサブシェルのstderrの先を変えようにも変えようがないし、やるならその前でしかなと、意味はなさげと思ったが、
それが入っているスクリプト起動時にリダイレクトする場合には意味があるか。(コンソールへの)stderrいらないから捨てるとか
hoge.sh
#!/bin/bash
exec 2> >(tee -a stderr.log >&2)
...
./hoge.sh 2> /dev/null
>&2があるので、(コンソールへの)stderrはうまく捨てれる

621:デフォルトの名無しさん
19/09/13 17:57:13.42 DBJTu1IU.net
bashのプロセス置換機能を活用して、シェル作業やスクリプト書きを効率化する
URLリンク(sechiro.haten) blog.com/entry/2013/08/15/bash%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%BD%AE%E6%8F%9B%E6%A9%9F%E8%83%BD%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%B7%E3%82%A7%E3%83%AB%E4%BD%9C%E6%A5%AD%E3%82%84%E3%82%B9
そのスクリプトの出処はここだな
出力のプロレス置換ってこう使うのか
入力のプロセス置換はよく使ってるけどそっちはどうもな

622:デフォルトの名無しさん
19/09/14 14:53:58.72 pQ8OW4Ak.net
プロレス乙

623:デフォルトの名無しさん
19/09/14 15:54:17.46 tdzCu94K.net
プロミスの間違い

624:デフォルトの名無しさん
19/09/14 17:27:42.22 niUt0I6q.net
サラ金市ね

625:デフォルトの名無しさん
19/09/15 16:58:31.20 BxQhi0/5.net
grepは自身で上書きすると中身空になるけど回避方法ある?要はspongeなんだけども

626:デフォルトの名無しさん
19/09/15 17:06:24.59 b8Gz5Yn9.net
data=$(grep ~); echo "$data" > ~

627:デフォルトの名無しさん
19/09/15 17:10:14.49 riyG3w3b.net
>>612
こんなのが出たので見るのを止めた。

この接続ではプライバシーが保護されません
sechiro.hatenblog.com では、悪意のあるユーザーによって、パスワード、メッセージ、クレジット カードなどの情報が盗まれる可能性があります。詳細
NET::ERR_CERT_COMMON_NAME_INVALID

628:デフォルトの名無しさん
19/09/15 17:13:13.56 b8Gz5Yn9.net
>>618
お前のパソコンなんかおかしくなってるぞw

629:デフォルトの名無しさん
19/09/15 17:15:19.48 b8Gz5Yn9.net
ハッテンブログじゃなくてはてなブログだな

630:デフォルトの名無しさん
19/09/15 17:18:49.85 LMFjfaUx.net
hattenblogこわい

631:デフォルトの名無しさん
19/09/15 17:28:57.92 4TgO8+RX.net
5ch では、はてなブログのURL を貼ってはいけない!
書き込み禁止画面が出ずに、いきなり吸い込まれて、
アクセス禁止になるようにしてあるから、超危険!
同様に、twitter の長いURL にも、吸い込まれるものがあるらしい
そこだけ、全角などに変換した方がよい。
hatenblog

632:デフォルトの名無しさん
19/09/15 17:32:44.42 4TgO8+RX.net
>>612
のURL は、証明書エラー!
HTTPS の証明書が切れてる!

633:デフォルトの名無しさん
19/09/15 17:37:11.76 4TgO8+RX.net
>>612
hatenblog
そもそも、上ははてなブログじゃない!w
a が無い
はてなブログは、
hatenablog

634:デフォルトの名無しさん
19/09/15 17:40:16.44 4TgO8+RX.net
>>612
hatenblog に、a を追加したら、ちゃんと見れた!
はてなブログは、
hatenablog

635:デフォルトの名無しさん
19/09/15 17:40:54.01 h836vV7+.net
URLリンク(sechiro.)hatenablog.com/entry/2013/08/15/bash%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%BD%AE%E6%8F%9B%E6%A9%9F%E8%83%BD%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%B7%E3%82%A7%E3%83%AB%E4%BD%9C%E6%A5%AD%E3%82%84%E3%82%B9

636:デフォルトの名無しさん
19/09/15 18:39:06.79 QquDNTIJ.net
URLリンク(sechiro.%68atenablog.com)

637:デフォルトの名無しさん
19/09/15 20:14:01.28 riyG3w3b.net
>>619
スマホのChromeなんだけどね。おかしいのかね?よくわからんが。

638:デフォルトの名無しさん
19/09/15 20:17:20.74 riyG3w3b.net
>>621
あ、そういうことか。
たしかに無事開いてしまったら何か違う世界を見てしまいそうで怖いアドレスだなw

639:デフォルトの名無しさん
19/09/16 19:53:43.50 vTAkg/qq.net
16進数(最大二桁 0xFF)から8進数に変換したいんですが
bcを使う以外にsedなどを使った方法とかありますかね…?
$ printf 'obase=8;ibase=16;%s\n' 'FA' | bc
もしあれば,bcは16進数のアルファベットが大文字じゃないといけないし,
POSIX標準とはいえUbuntuとかには既定で導入されてないしで,
あまり使いたいくないんです(わがままですいません)

640:デフォルトの名無しさん
19/09/16 20:12:04.01 Zn9wpmWA.net
printf '%o\n' 0xfa

641:デフォルトの名無しさん
19/09/16 21:17:46.43 U9mfWlHU.net
8進数にパーミッション以外の使いみちなんてあったのか…

642:デフォルトの名無しさん
19/09/16 23:39:17.58 LCUbae2V.net
>>630
hex=fa
oct=$(( ($hex >> 6) * 100 + ($hex >> 3 & 0x7) * 10 + ($hex & 0x7) ))
# oct=$((0x$hex >> 6))$((0x$hex >> 3 & 0x7))$((0x$hex & 0x7)) 3桁固定版
echo "$oct"
出力が必須でない場合(変数に入れて処理する場合)は
oct=$(printf '%o\n' 0xfa) よりも速いはず

643:デフォルトの名無しさん
19/09/16 23:43:56.37 LCUbae2V.net
他にも case を使って書けるはず
最大0xFFなら
case $value in
01) ~
02) ~

[fF][eE])
[fF][fF])
esac
とかねw
たかだか256+α行。頑張ればFF の一桁ずつ処理すれば行は減らせるだろう。

644:デフォルトの名無しさん
19/09/16 23:46:42.80 LCUbae2V.net
>>633訂正
× oct=$(( ($hex >> 6) * 100 + ($hex >> 3 & 0x7) * 10 + ($hex & 0x7) ))
○ oct=$(( (0x$hex >> 6) * 100 + (0x$hex >> 3 & 0x7) * 10 + (0x$hex & 0x7) ))

645:デフォルトの名無しさん
19/09/17 00:06:22.06 IA1rgq5F.net
>>632
posixの範囲ではprintfで16進数から文字に変換することが出来ない
printf '\101' # => A
printf '\x41' # bashは変換できるが、dashでは変換できない
バイナリデータの処理など、文字コードを使って処理する必要がある場合は
8進数を使うほうが良い

646:デフォルトの名無しさん
19/09/17 00:09:45.15 IA1rgq5F.net
8進数よりも16進数の方が使い勝手が良いのにパーミッションが8進数なのは、
当時はまだ16進数が発明されてなかったからだったりするのかな?
シェルスクリプトもそうだけど、なんか古い時代は8進数しかなかった感じがする
それとも単なるビット数を節約しただけなんだろうか?

647:デフォルトの名無しさん
19/09/17 00:18:14.43 kEXgFQM4.net
7ビット機だったような

648:デフォルトの名無しさん
19/09/17 02:12:04.50 sr4VPY0J.net
rwxで3ビットしか使ってない必要ないと思ったからだろう

649:デフォルトの名無しさん
19/09/17 04:55:24.40 KdPNzCQK.net
パーミッションの話じゃなくて

650:デフォルトの名無しさん
19/09/17 09:45:35.22 3tDP3W6T.net
>>634
ありがとうございます!

651:デフォルトの名無しさん
19/09/17 12:39:27.59 e1bW+EWq.net
>>637
>当時はまだ16進数が発明されてなかったからだったりするのかな?
どこでなにが「発明」を指して居るのかわからんが、コンピュータ業界コンピュータサイエンス(?)としては当時でも普通に16進数があっただろう。スイッチをパチパチしてマシン語を打ち込む当時のコンピュータでは打ち込むプログラムは16進数で書いてたようだから
Unix version 1 は 18ビットマシンの PDP-7 でから始まり、すぐに PDP-11 に移行したがその名残だろう、K&R C の文字リテラルでは8進数表現しかできないのとかは、また、K&R C の影響じゃね
PDP-7 は 18ビット= 3 3 3 3 3 3 で表した方書いた方がきりがいいからそれが普通のような感じだったんじゃね、今でもパーミッションは3ビットに収まっているので3ビット区切りで表した方が書いた方がわかりやすいのと同じように

652:デフォルトの名無しさん
19/09/17 12:48:38.39 N6BvjGdd.net
昔はなぜか 12bit 15bit 18bit 24bit 36bit あたりのマシンが多い

653:デフォルトの名無しさん
19/09/17 13:26:02.16 e1bW+EWq.net
そうなの。見物したスイッチをパチパチしてマシン語を打ち込む当時のコンピュータは16bitだったから、PDP-7(というかPDP-11の前までのDEC)が異端かと思ったw

654:デフォルトの名無しさん
19/09/20 09:32:25.18 pw3H64dJ.net
16進数から8進数への変換って↓
$ hex=fa; printf '%o' $((0x$hex))
↑こういうのだとPOSIX違反?

655:デフォルトの名無しさん
19/09/20 13:37:02.90 fQRmEVoK.net
POSIXは知らんが、 古いzsh? は $((0x$hex)) が使えなくて $((16#$hex)) だった気がする
もしくは $((011)) が zshでは8進数にならなくて $((8#11)) と書かないといけない
という問題だったかもしれない。まあ忘れたw

656:デフォルトの名無しさん
19/09/20 15:46:33.91 pw3H64dJ.net
ふむ。ということは今であればほぼ問題ないという訳か。
thx

657:デフォルトの名無しさん
19/09/20 18:40:57.99 YblgUZDU.net
>>644
基本的にメインフレームってカテゴリのコンピュータはCPUも自社設計だったので
8bit単位じゃなく自分たちの使いやすいbit数だった
ザイログとかモトローラのCPUを使っていると基本的に8bitの整数倍になる

658:デフォルトの名無しさん
19/09/22 22:42:51.90 UP8ZY9Jm.net
symlnkのフォルダからファイルをmvすると実体パスの方で移動するけどmvの仕様?

659:デフォルトの名無しさん
19/09/22 22:58:25.61 wuCdbk0L.net
移動なら実体を移動しなきゃ移動しないだろう、ファイルシステム的に

660:デフォルトの名無しさん
19/09/22 23:05:40.23 QKufl6gy.net
例えば/a/b/cがあって、/x/yが/a/bを指すとする。
cd /x/y; mv c ..したときにcが/x/cじゃなくて/a/cになるという話なら仕様。
実際はcd /x/yの時点でカーネル的には既に/a/bに移っている。
pwdして/x/yと表示されたり、プロンプトに/x/yと出たりすることがあるのは、シェルがそう見せているだけ。
外部コマンドを呼んだ時点で/x/yにいるという情報は伝わらない。

661:デフォルトの名無しさん
19/09/22 23:22:54.08 dHMqf7rP.net
シェルによっては今いるディレクトリをシンボリックリンクのままPWD環境変数に出力するから、外部コマンドでも>>651の場合に/a/bではなく/x/yにいると分かることもある
だからmvでもやろうと思えば環境変数によって動作をかえて/x/cに移すこともー応可能ではある
ただ普通はそういう危なっかしい動きはしない

662:デフォルトの名無しさん
19/09/23 00:58:42.07 XnqhgXWR.net
なるほど
~/dir/foo.txtがあって、dirのリンクを~/Desktop/dir_linkに作ったんだ
んでdir_linkからmv foo.txt ../したらDesktopになくてあれってね
シンボリックリンクはあくまで別名だって念頭に置かないといつかやらかしそうだなぁ

663:デフォルトの名無しさん
19/09/23 13:44:18.78 uT43KuRv.net
シンボリックリンク自体はカーネルっていうかファイルシステムの機能であって
シェルの機能じゃないよね?
シンボリックリンクされたディレクトリへの移動やその表示が、シェルの機能?

664:デフォルトの名無しさん
19/09/23 14:55:36.41 16gV8N0U.net
シンボリックリンクはただのファイルで、APIが機能を提供してるだけだろう
ハードリンクはファイルシステムの機能だろうが

665:デフォルトの名無しさん
19/09/23 15:20:14.51 0wgm+uqt.net
シンボリックリンクはPOSIXで決まっているが、
シェルスクリプトとは関係ない。
シェルとも関係ない。すれ違いだ。
シェルスクリプトの話をしろ。

666:デフォルトの名無しさん
19/09/23 15:43:16.78 PpvL3bdr.net
シンボリックリンクもハードリンクもファイルシステムの機能だ

667:デフォルトの名無しさん
19/09/23 15:44:56.02 mZE+d06B.net
ドヤァ

668:デフォルトの名無しさん
19/09/23 16:01:07.98 16gV8N0U.net
>>657
どこまでをファイルシステムかと言うのかだが、論理矛盾とかリンク切れとかあってもなんも関係ないのだから低レベル=どのファイルシステムでフォーマットする?というファイルシステムのファイルシステムではないな
そのレベルではファイルとフラグを提供しているにすぎない
APIも含めたOSがアプリケーションに対しての提供するファイルシステムといえばファイルシステムだろうが

669:デフォルトの名無しさん
19/09/23 16:41:43.41 aoth6Tve.net
まぁ、いずれにしても、ここではスレ違い

670:デフォルトの名無しさん
19/09/23 16:58:42.91 COQ8/G13.net
シンボリックリンクやハードリンクはOSの機能
ファイルシステムはそれを実装するだけ
(FATのように実装してないものもある)

671:デフォルトの名無しさん
19/09/23 17:01:20.42 PpvL3bdr.net
アホばっかw

672:デフォルトの名無しさん
19/09/23 17:09:58.15 fWeAQpZu.net
自戒か

673:デフォルトの名無しさん
19/09/23 17:22:55.59 qNyZUwSM.net
ファイルシステムはOSの提供する1つの機能だろ

674:デフォルトの名無しさん
19/09/23 20:09:09.12 uT43KuRv.net
いつからカーネルがOSに掏り替わった?

675:デフォルトの名無しさん
19/09/25 16:36:07.25 vuS5tsH7.net
カーネルってファイルシステム含まないでしょうが

676:デフォルトの名無しさん
19/09/25 17:26:48.60 Fy/ppuPa.net
子供がまだ食ってる途中でしょうが

677:デフォルトの名無しさん
19/09/29 15:56:27.36 kt1IDkk5.net
誠意って何かね

678:デフォルトの名無しさん
19/09/29 17:07:22.81 G1Omq4Sq.net


679:デフォルトの名無しさん
19/09/29 19:09:52.55 VaR9nylT.net
女だったらアレかもしれんが

680:デフォルトの名無しさん
19/09/29 19:22:34.45 CY5JaLwa.net
俺が定期的にお題を出してやらないとすぐクソスレ化するなw

681:デフォルトの名無しさん
19/09/29 19:31:49.84 cn7qdGIP.net
Oh, I like Japan.
Japanese are crazy. Ha ha ha.
Japanese are pigs, pigs, you know.
Moneys and they have small cocks you know short legs yellow monkeys.
Do you understand?

682:デフォルトの名無しさん
19/09/29 19:34:18.39 RIFVILY+.net
POSIXの話するから荒れて盛り上がるから誰かしてよ

683:デフォルトの名無しさん
19/09/29 19:34:36.19 RIFVILY+.net
POSIXの話すると荒れて盛り上がるから誰かしてよ

684:デフォルトの名無しさん
19/09/29 20:34:15.29 1ct4yMlj.net
POSIX準拠で固定小数点ライブラリほしいな
小数使うことは稀だけど、たまに無いとめんどくさい
exprは外部コマンドで遅いので却下w

685:デフォルトの名無しさん
19/09/29 20:53:22.53 UgGWrkoZ.net
bashって便利だけど計算部分だけマジでダサいな
1+1が
$((1+1))ってなんなんだよ

686:デフォルトの名無しさん
19/09/29 21:19:57.63 1ct4yMlj.net
どの言語にも言えることだけど、
ダサい部分ってのは互換性のためだよ
シェルスクリプトは外部コマンドを関数として呼び出せて、
そして外部コマンドに使える文字は、ファイルに使える文字と同じ
だから例えば@とか%とかいう文字でさえ、コマンド名として使える
だから、安易に記号を追加するわけにもいかないし予約語も増やせない。
$に関してはシェルスクリプト当初から特殊記号だったから
新たに特殊記号や予約語を増やすのではなく$を拡張するという方法を採用したのだろう
互換性は一番大事だからね

687:デフォルトの名無しさん
19/09/29 21:21:56.71 1ct4yMlj.net
補足
例えば「1 + 1」は、"1"コマンドを、+と1という引数で呼び出すという意味になるし
「1+1」だと"1+1"コマンドになる。
選択肢が限られるんだよね

688:デフォルトの名無しさん
19/09/30 06:57:25.74 Ceph+2oU.net
$ awk 'BEGIN {print 0.1+0.2}'
0.3
bcより使いやすい悲しみ

689:デフォルトの名無しさん
19/09/30 13:47:50.63 bgqbOy9v.net
POSIXの仕様書,
算術展開での(浮動)小数点演算は今度の2020年度改訂で一部解禁されるらしい。
ちなみに時を同じくして$'\n'←みたいな書式も解禁。
やったぜ。

690:デフォルトの名無しさん
19/09/30 14:14:05.05 gJLA2fQe.net
やったぜ。

691:デフォルトの名無しさん
19/09/30 14:57:01.11 seE3nGDx.net
石器時代かよワロタw

692:デフォルトの名無しさん
19/09/30 14:59:09.67 1VQTT5dv.net
生理がこないんですけど
どうしたらいいですか?

693:デフォルトの名無しさん
19/09/30 15:14:42.58 g4qimp0d.net
俺も生理来たことないわー

694:デフォルトの名無しさん
19/09/30 15:24:33.48 g4qimp0d.net
>>680
どこ情報ですか?

695:デフォルトの名無しさん
19/09/30 17:46:55.62 zGRcNdYK.net
もしもし、先生!もしもし!
だけどもねー、実はあのー、子供つくらないようにしてるんですよね、わたくしも本当に辛くてですね、子供には遺伝しないでしょうか?

696:デフォルトの名無しさん
19/09/30 19:45:29.40 bgqbOy9v.net
>>685
URLリンク(austingroupbugs.net)
こことか。

697:デフォルトの名無しさん
19/09/30 20:35:29.76 sHSicWZI.net
>>687
いや、小数の話

698:デフォルトの名無しさん
19/09/30 21:58:43.29 M1BD3UNk.net
しょうっすか…

699:デフォルトの名無しさん
19/09/30 23:03:44.06 qRuhgEzP.net
無理にシェルスクリプトだけで小数対応しなくても、
perl -e "print 0.2*0.3"
とか、いろいろやりようはあるからあまり必要性を感じない。

700:デフォルトの名無しさん
19/09/30 23:20:20.33 nI7iDoAi.net
>>690
大量に計算をするとプロセス呼び出しになるから遅いんだよ
$ time ksh -c 'for i in $(seq 1000); do n=$(echo "0.2*0.3" | bc -l); done'
real 0m1.921s
user 0m1.762s
sys 0m0.715s
$ time ksh -c 'for i in $(seq 1000); do n=$((0.2*0.3)); done'
real 0m0.009s
user 0m0.009s
sys 0m0.000s
たったの1000回でここまで差が出るからね

701:デフォルトの名無しさん
19/09/30 23:28:35.91 qRuhgEzP.net
意図と違うと思うが、
time perl -e '$j=0; for($i=0;$i<1000;$i+=1) { $j+=0.2*0.3; }; print $j'
とか、別にシェルスクリプトだけに頼らんでもなんとかなってしまうというか・・・・

702:デフォルトの名無しさん
19/09/30 23:29:54.18 nI7iDoAi.net
だから出来るできないの話はして無くて
遅いって話をしてる

703:デフォルトの名無しさん
19/09/30 23:35:15.29 1VQTT5dv.net
>>692
これで事足りるな

704:デフォルトの名無しさん
19/09/30 23:58:52.54 nI7iDoAi.net
perlは入ってない環境も有るのでその点でも駄目だしね

705:デフォルトの名無しさん
19/10/01 00:02:33.23 cNB/gbgI.net
>>679
これで事足りるな

706:デフォルトの名無しさん
19/10/01 00:27:03.86 rxcb8vGn.net
必須すぎやろw

707:デフォルトの名無しさん
19/10/01 01:47:40.69 SPlRKvH8.net
なになに縛りが好きなマゾなんだろうw

708:デフォルトの名無しさん
19/10/01 02:00:19.69 rxcb8vGn.net
そんな事する必要がないなら縛りって言ってもいいけど、
perlが入ってない環境は実際に存在するからね

709:デフォルトの名無しさん
19/10/01 02:09:56.58 ESup7bfu.net
awkも使えない環境で何やるんだよw

710:デフォルトの名無しさん
19/10/01 02:09:58.85 PTA8MEY/.net
>>679

711:デフォルトの名無しさん
19/10/01 02:36:49.10 eGCx9XC9.net
>>700
awkはbusyboxに入ってるよw

712:デフォルトの名無しさん
19/10/01 09:01:32.62 O2y9F


713:dCY.net



714:デフォルトの名無しさん
19/10/01 09:11:30.09 ZA6pNaC0.net
POSIXで縛るだけではPOSIX未満のbusyboxで動かなかったりするからね
可搬性を高くするにはPOSIXで規定されたコマンドであっても
なるべく使わないほうが良い

715:デフォルトの名無しさん
19/10/01 10:51:02.41 CGhZJwfl.net
どういうことなの…

716:デフォルトの名無しさん
19/10/01 11:09:51.43 ZA6pNaC0.net
ここはシェルスクリプトのスレ
つまり可搬性とはシェルスクリプトの話をしてる。
シェルスクリプトではよく外部コマンドを呼び出す
しかし外部コマンドはOSによって違う。
特に基本的なコマンドは、各OSでバラバラに作っていたり
独自の修正を入れており複数の実装があり微妙に動きが異なっている。
例えば、LinuxのsedとMacのsedでは使える命令が違う。
POSIX準拠のコマンド(もちろんオプションなども含む)で規定されてるものだけを
使っていれば可搬性はそれなりにあるが、それでも完璧じゃない。
例えば組み込みで使われるbusyboxはPOSIX準拠コマンドのサブセットが実装されてる。
だから本気で可搬性を高くしようと思えばPOSIX縛りでも不十分。
POSIX準拠のコマンドが信じれない。という前提にたてば
思い切って外部コマンドすら呼び出さない、完全にシェルスクリプトだけで
実装するのがもっとも可搬性が高い。
もちろん限界は有るので実際には出来る限りシェルスクリプトで作って、
外部コマンドは必要最小限、必要に応じて互換性を吸収するようにラッパー関数を作る。
ということになる。

717:デフォルトの名無しさん
19/10/01 15:50:14.87 P1455Lxu.net
可搬性に異常に拘っているのは一人か二人しかいないけどな
可搬性に拘ってないというレスにも可搬性を押し付ける

718:デフォルトの名無しさん
19/10/01 16:28:55.36 9fvqkmcJ.net
認めろよ。
シェルスクリプトに可搬性などない。
どこでも動くシェルスクリプトなど幻想。

719:デフォルトの名無しさん
19/10/01 16:40:08.47 8eIOCDAd.net
hoge () {
echo "Hello"
}
for i in $(seq 1000); do
hoge
a=$(hoge)
done
myfunc と a=$(myfunc) の実行時間の差はなんなん?標準出力を横取りするためだけにしてはコストが高いかな
簡単に思いつくのは横取りするためパイプでで別プロセスにしなきゃとかかな?

720:デフォルトの名無しさん
19/10/01 16:46:56.18 O2y9FdCY.net
それBashでやってない?
試しにKshでやってみて。(俺環かもしれんから,速度比較は晒さない)

721:デフォルトの名無しさん
19/10/01 16:52:40.16 /6RuW8/Q.net
perlが入ってない環境ってそれは入れる必要ないんだろ
一から構築していくならそれでいいけど

722:デフォルトの名無しさん
19/10/01 16:54:32.38 8eIOCDAd.net
なるほど。ksh(だけが?)がなんか賢いかな。zsh他も差がある

723:デフォルトの名無しさん
19/10/01 17:07:00.59 cNB/gbgI.net
perlが無い環境があるからどうのこうの言うけど
kshが無い環境があるからは言わないんだなw

724:デフォルトの名無しさん
19/10/01 17:10:13.56 8eIOCDAd.net
違う人じゃね?同一人物だったらアレだけどw

725:デフォルトの名無しさん
19/10/01 18:59:48.82 8eIOCDAd.net
>>712
zsh他も差があるは、>>709で体感できる差があるが正しいか
kshでも差があるね。ループ数増やせば体感できるほどの差となるね

726:デフォルトの名無しさん
19/10/01 19:16:54.12 fust4gpU.net
>>709
forkだよ。$( ) の部分がサブシェルになってて
多くのシェルではサブシェル = 別プロセス生成で実装されてる。
そのおかげでサブシェルの中でcdを実行したり変数を使ったりしても
呼び出し元は汚染されたりしない
kshはサブシェルの実装が最適化されていて
全てではないが、サブシェルの部分を同一プロセスで実行する。
独自で状態の保存と復帰を実装してるのだろう。
URLリンク(codeday.me)
kshは速いと言っちゃ速いんだが、その(複雑な?)仕組みのせいで
バグのもとになってたりする。ということを書いてあるページが
有ったんだがどこか忘れた。

727:デフォルトの名無しさん
19/10/01 19:25:21.59 fust4gpU.net
遅い原因の本質は標準出力のキャプチャじゃないから
この二つでも違いがでる
hoge () {
 :
}
for i in $(seq 1000); do
 hoge
 (hoge)
done
>>715
> kshでも差があるね。ループ数増やせば体感できるほどの差となるね
そうなんだよね。サブシェルのコストは以外と大きい。
だから変数に入れて使うことが目的とした関数は以下のように
グローバル変数を使って返したほうがずっと速いわけさ
hoge () {
RET=Hello
}
for i in $(seq 1000); do
hoge
a=$RET
done

728:デフォルトの名無しさん
19/10/01 19:26:55.18 8eIOCDAd.net
>>716
内部関数なのにってとこがね&普通の他の言語とはやはり違うな(まあ当然だが)という(内部汚染とかこれの本題ではないっすよ)
zshはkshを習ってだけど、ちょこちょこ習えてないなあ。kshの否定面のレスだけど、kshは人に優しいとこもあるとも思うw
a=0
ls | while read line; do
[ "$line" = 'hoge' ] && a=1
done
[ a -eq 1 ] && ...
っていう見た目他の言語的では当たり前のがちゃんと動くというwまあ、異端だけど
とりあえず、どうしようもないそういうものということでいいのね。どうも

729:デフォルトの名無しさん
19/10/01 19:30:13.87 8eIOCDAd.net
>>717
せっかくですが、ちょい本題とは違うかな。そりゃ () は...
なんで内部関数なのにサブシェルになんのかねん、他の言語的感覚ではという
まあ、内部関数だろうと、() と同じで $() もサブシェルになるということをおっしゃっりたいのでしょうけど
どうも

730:デフォルトの名無しさん
19/10/01 19:37:54.80 fust4gpU.net
>>719
> なんで内部関数なのにサブシェルになんのかねん、
考え方が違う。
コマンド置換$( ) は「サブシェルを使用して実行する」という"仕様"なんだよ
なんでサブシェルになるのか?ではなく仕様でサブシェルにすると決まってる。
ただし別プロセスにするとは決まっていない。だから子プロセスとかいう既存の
名前ではなく、新たにサブシェルという用語を作った。
サブシェルの仕様としては、「サブシェル内で行った変数などの変更は呼び出し元には伝わらない。」
などがあるが、それを実現してるなら別の別プロセスでなくてもよい。
だけど別プロセスにするほうが実装が簡単だから多くのシェルではサブシェル=別プロセスになってる。

731:デフォルトの名無しさん
19/10/01 19:41:25.43 8eIOCDAd.net
>>720
その続きなどを読んでよ。言われていることはすでに書いてあるんですけど
どうしようもないという結論が得られたのでw、
結局、こんなことにもそれなりの差があるんだから「常時それも無条件で」実行時間の差があるなんて気にするなんて無意味だなと
なにかそれが問題になったときに気にする対応すればいいだけだなという。のをそもそも言いたかったw

732:デフォルトの名無しさん
19/10/01 19:44:28.64 fust4gpU.net
>>718
> 内部関数なのにってとこがね
他の言語の場合、(基本的に)関数内の変数の変更は呼び出し元に反映されない。
つまりローカル変数になってるだろ?
それと同じなんだよ。POSIXの範囲ではlocalもtypesetもないから
シェルスクリプトにはローカル変数がない
ように思えるが、実はサブシェルを使うからローカル変数は必要ない。とも言える。
ローカル変数を実現するためのサブシェルと言える。
サブシェルの仕様としてローカル変数は必須の機能だが、別プロセスにするのは必須ではない。
サブシェル(別プロセス)と捉えるから仰々しくなってるが、
変数のローカル化と考えれば、内部関数内の変数をローカル化するってだけだから
「内部関数なのに」とは思わないだろ?

733:デフォルトの名無しさん
19/10/01 19:51:56.19 8eIOCDAd.net
>>722
なにを教えてくれてるのか教えたいのかわからないです
内部変数?内部変数環境のことは言ってないです。他の言語でもの(内部)関数を呼ぶその返り値を使うって話なんですけど
内部変数云々ならhogeもサブシェルにしなくちゃじゃないですか?内部関数という言葉が悪かったならすまんすですけど

734:デフォルトの名無しさん
19/10/01 19:52:05.05 fust4gpU.net
>>718
そのコードに関しては
ls | {
 a=0
 while read line; do
  [ "$line" = 'hoge' ] && a=1
 done
 [ a -eq 1 ] && ...
}
こう書けばいいって事がわかってから悩むことはなくなったなw
上記をさらに発展して、関数化すれば以下のようになる。
hoge() {
 a=0
 while read line; do
  [ "$line" = 'hoge' ] && a=1
 done
 [ a -eq 1 ] && ...
}
ls | hoge
そうするとa変数は実質ローカル変数として扱ってるんだから
スコープ的にはこっちのほうが適切だと気づくだろう

735:デフォルトの名無しさん
19/10/01 19:53:21.70 fust4gpU.net
>>723
> 内部変数云々ならhogeもサブシェルにしなくちゃじゃないですか?
使い分けるんだよ。
ローカル変数化したいならサブシェルを使う。
そうでないならサブシェルを使わないって。

736:デフォルトの名無しさん
19/10/01 19:56:56.36 8eIOCDAd.net
>>725
なんか教えたがりのようですけど、ちょっと無理があるかなと
あくまでも「他の言語的感覚では」が前提、それとは違うというのの確認でしかないんですけど
使い分けるとかそもそも内部変数の話はしてないんですよ

737:デフォルトの名無しさん
19/10/01 20:00:53.41 fust4gpU.net
>>726
他の言語感覚って言うけど、
じゃあお前いくつ言語しってんの?って話だよ。
狭い言語の知識=言語の全てって思ってるだけさ

738:デフォルトの名無しさん
19/10/01 20:02:16.96 8eIOCDAd.net
そもそものそもそもは、bcの毎回起動するのに時間がかかるというので、せっっかくの標準で暗黙的にもマルチプロセスなのでサーバ&クラアント的に起動しとけばいいんじゃねと
trap 'exec 8>&-; exec 7>&-; rm -f from-server to-server' EXIT
mkfifo from-server
mkfifo to-server
exec 8<> to-server
exec 7<> from-server
< to-server bc -l > from-server &
calc () {
echo "$*" > to-server
read result < from-server
echo $result
}
てのを書いたのよ、単なる興味的にどれだけのコスト削減できるのかを試し確認するために。で、この一連の(他の言語的には)思ってもいなかったとこでコストがあるなと。その確認だけだよ。で、やっぱり>>721のようなことだなとw

739:デフォルトの名無しさん
19/10/01 20:02:43.57 8eIOCDAd.net
>>727
はいはい

740:デフォルトの名無しさん
19/10/01 20:09:04.89 fust4gpU.net
>>728
どの言語でも、その言語を知らなければ、その言語特有の所でコストがかかるってだけだ
だからちゃんとその言語を知らなければいけない。

741:デフォルトの名無しさん
19/10/01 20:10:22.49 8eIOCDAd.net
はいはい。知っていることを延々と言われても。それも聞いてもいないのに

742:デフォルトの名無しさん
19/10/01 21:09:03.88 /EdGAgHY.net
>>726
つうか、お前の感覚の話なんか誰にもわからんだろ。
だから、馬鹿だと言う前提で説明してるだけじゃん?
それすら理解できないってことはやはり馬鹿なんだなぁと思うばかり。

743:デフォルトの名無しさん
19/10/01 21:21:30.07 T/R8ZN8b.net
ろくにシェルスクリプトのことを知らないから聞いてみた。
親切に教えてくれる人がいた。
……何が不満なんだ?

744:デフォルトの名無しさん
19/10/01 21:25:17.92 8eIOCDAd.net
何がお怒りのなのかさっぱりですけどw

745:デフォルトの名無しさん
19/10/01 21:31:30.87 8eIOCDAd.net
よくわからないが、他の言語で
func()

a = func()
で、こんな差があるのなんて、他にどの言語あるの?俺は知らない少々他の言語を知っているが
てか、そういうのは普通は「使えない」からそうならないようにするし、そもそもシングルプロセスを前提のが多いだろうから、他の一般的な言語でシェルスクリプトのようなのはちょっと思いつきません
func がまあ普通の速さなので、a = func もなんか他の方法があるのかなと。無いという確認はとれてお礼も言っているのになあ>>718
関係ない(知っていることを)ことを延々とでいい加減してくれというのはあったけどw

746:デフォルトの名無しさん
19/10/01 21:52:27.77 fust4gpU.net
すべての言語はそれぞれ違っているんだが、
同じ言語がほしいのか?

747:デフォルトの名無しさん
19/10/01 21:57:08.01 Ueonb/Q5.net
みんな違って
 みんないい
  まつお

748:デフォルトの名無しさん
19/10/01 22:01:17.19 8eIOCDAd.net
>>736
相変わらずだね。何を言いたいのかさっぱり
返り値を使う(関数)使わない(サブルーチン)でコストがこんなにあるって話なのに

749:デフォルトの名無しさん
19/10/01 22:14:23.82 8eIOCDAd.net
そうだ、ksh(zsh)ならreadでと思ったら、逆に遅くなるのね
hoge | read a
サブシェルになるのはhoge。kshはパイプでもパイプを使わずになんちゃらを使ってなんとかかんとかwとかあったからちょっと期待したのに
あれだな、そもそもシェルスクリプトの関数の返り値はreturnでの実行ステータスしかない、それ以外の形態(テキスト)は考えていませんからこんな感じにしかなりませんってとこか

750:デフォルトの名無しさん
19/10/01 22:58:18.96 9HRGRt02.net
for ループは、while よりも遅いだろ。
bash も、dash よりも遅いだろ
ループでは、for, bashを使わない方が速い

751:デフォルトの名無しさん
19/10/01 23:34:09.29 DttT1lmW.net
returnが返り値ってw
あれはエラー情報だろ
例外と同じ。

752:デフォルトの名無しさん
19/10/01 23:35:42.98 DttT1lmW.net
パイプで処理をつなげていくシェルスクリプトにおいて
返り値=出力なんだよ
出力を読み取って、処理して出力する
そういう基本がわかってないだけ

753:デフォルトの名無しさん
19/10/01 23:53:15.78 8eIOCDAd.net
return
なんすけど。returnの意味知ってる?とかいう。いや、しつれい
エラー情報でもない、単なる終了ステータス。exit ではないのは、まあ、関数だからと、exit と区別がつかないからかなw

754:デフォルトの名無しさん
19/10/01 23:59:02.30 8eIOCDAd.net
function name () { }
が、POSIXではないのは(これからも採用されないかも?採用するの?)というのは、関数じゃねえー、所詮コマンドだなというとこかなと思ったりしてみたり、今回w
>>742そのレベルで馬鹿にできるのはあなたがそのレベルと言っているようなもんかなとw
てか、return なのにそれを返り値と見るのを頭から否定するのは、いままでの同一人物としか思えないんだけど。シェルスクリプトは知っているがシェルスクリプトしか知らないシェルスクリプトにだけ拘るw

755:デフォルトの名無しさん
19/10/02 00:19:13.78 DWeKr+Az.net
>>743
returnの意味は「帰る」
何かを戻すという意味はない

756:デフォルトの名無しさん
19/10/02 00:20:54.57 238K9SSk.net
マジで言ってるの?もっと勉強しよう、他人にアタるならw

757:デフォルトの名無しさん
19/10/02 00:20:59.41 DWeKr+Az.net
アセンブラでもreturn(RET)がある。
これも戻るという意味なだけ
呼び出し元に何かを戻すという意味はない

758:デフォルトの名無しさん
19/10/02 00:23:56.96 238K9SSk.net
アセンブラでもマクロアセンブラはあったりするけどな
戻り値をどういう形態で(どのレジスタにとか)という決まりであれば
>呼び出し元に何かを戻すという意味はない
マジで言っているの?アホらしい

759:デフォルトの名無しさん
19/10/02 00:25:12.52 DWeKr+Az.net
>>748
「マジでいってんの」しか言ってないよなw
returnを翻訳してみろ。戻るという意味しかない

760:デフォルトの名無しさん
19/10/02 00:26:09.34 DWeKr+Az.net
URLリンク(pubs.opengroup.org)
returnの説明にも、nは終了ステータスと書いてある。
return valueとは書いていない

761:デフォルトの名無しさん
19/10/02 00:30:13.30 238K9SSk.net
言うならアセンブラでなくて機械語だな。ほんとにしょうもない知識自慢
>>749
>returnを翻訳してみろ。戻るという意味しかない
マジで言ってるのとしか言えんやん。「return なんとか」とか普通にあるぞ?
>>743 にreturnしか書いてないからか?なんかしょうもないなああwなんかしょうもないけど、だったらなんかすまんな
>>750
関数として見たらだよ。すでにそういうことは>>743,744で言っているんだけど
所詮コマンドだなで終わってるよ

762:デフォルトの名無しさん
19/10/02 01:32:56.67 o4tQ0hze.net
>>735
よく分からないで批判する癖は辞めた方が良い

763:デフォルトの名無しさん
19/10/02 01:35:11.54 o4tQ0hze.net
>>751
機械語にreturnに類する語は出てこないぞ?

764:デフォルトの名無しさん
19/10/02 01:35:40.52 238K9SSk.net
「よくわからない」が何を指しているのか「よくわからない」だろう?
また単なる「語」に食いつくwいつものかとしか思えません

765:デフォルトの名無しさん
19/10/02 01:36:26.76 238K9SSk.net
>>753
イミフ。機械語は01だからな。そんな話はしてない
やっぱりいつものかw

766:デフォルトの名無しさん
19/10/02 01:39:39.82 238K9SSk.net
同一人物かどうか知らんが、>>742から同じ人物としてしまう、もうw
同じ「レベルw」でしかも同じ姿勢としか思えないので。もう十二分にそのレベルwを自ら率先して晒してしまったので>>744の後半で正解だったなと
あとはもう「教えてww」やんない

767:デフォルトの名無しさん
19/10/02 01:53:53.42 o4tQ0hze.net
いつもの妄言を喚いて自分の敵は一人だと思い込んでる痛い奴だったか

768:デフォルトの名無しさん
19/10/02 01:55:39.44 238K9SSk.net
敵www
そういう姿勢だったのね。そうだよね、あなたはw

769:デフォルトの名無しさん
19/10/02 02:46:06.49 JFJLbhDm.net
IDが変わっても判別しやすいのはいいこと
ぼんやりしてて助かる

770:デフォルトの名無しさん
19/10/02 02:51:03.64 o4tQ0hze.net
>>758
いやおまえ、オレと関係ない人を同一人物扱いしてんじゃん

771:デフォルトの名無しさん
19/10/02 02:58:29.05 238K9SSk.net
>>760
>>756をよーく読もうな。読めない?
>>753は何を言いたいの?
機械語は01だからreturnに対する語はないと言いたいの?ととって、ああまたかというw>>756なんだよ(よく読んでねw)
>機械語にreturnに類する語は出てこないぞ?
って、どういう意味?俺の理解とは別でならすまんかったちょっと続ける?

772:デフォルトの名無しさん
19/10/02 03:24:37.13 DWeKr+Az.net
知らないなら言わなければいいのにw
RET命令(Return from Procedure)
URLリンク(softwaretechnique.jp)

773:デフォルトの名無しさん
19/10/02 03:28:45.47 238K9SSk.net
>>762
なにを言いたいのかさっぱりなんですが、具体的に自分のお言葉でお願い
まさか、RETはあるがReturnは無いではないだろうし、さっぱりわからん
(そしてなんで同じやねん、その姿勢w)

774:デフォルトの名無しさん
19/10/02 03:43:25.73 DWeKr+Az.net
同じだだろ。何いってんの?
略だから違うんだって言いたいの?

775:デフォルトの名無しさん
19/10/02 03:44:26.53 o4tQ0hze.net
>>762
そしてそれはアセンブリ言語という..

776:デフォルトの名無しさん
19/10/02 03:46:58.80 DWeKr+Az.net
シェルスクリプトのreturnは終了ステータスを返すもので
これは他の言語の返り値ではないのは一目瞭然なんだがね
だからこそ $_ という変数(外部コマンドを呼び出した時の終了ステータス)で
アクセスできるわけだし
しらないならシェルスクリプトを勉強してくださいって言うしか無いな
なんならbashのドキュメント引用しようか?
return [n]
指定した返り値 n で関数を終了させます。 n を省略すると、返却ステータスは 関数内で最後に実行したコマン
ドの返却ステータスになります。 関数の外側で使われているが、 . (source) コマンドによるスクリプトの実行
中である場合、 シェルはそのスクリプトの実行を止め、 n またはスクリプト内で最後に実行されたコマンドの
終了ステータスを スクリプトの終了ステータスとして返します。 関数の外側で . によるスクリプトの実行中以
外に使われた場合、 返却ステータスは偽となります。 関数やスクリプトから実行が戻る前に、 RETURN トラッ
プ に設定されたコマンドが実行されます。

777:デフォルトの名無しさん
19/10/02 03:47:32.93 DWeKr+Az.net
>>765
その違いは今、重要なのか?w
returnの意味なんて言語によって違うって話をしてるんだが

778:デフォルトの名無しさん
19/10/02 03:49:09.36 238K9SSk.net
>>764
マジか
残念ながらが同一人物に見えるとやはりなお思ってしまうよw
マジか。そんなんで偉ぶるwなんの意味があるのだかさっぱり
そもそもマシン語ではない、アセンブリ=ニーモニックだし。ニーモニック命令は3文字にという昔の風習なだけだろうに
豆知識
そもそも、そんなRETでもいいけどReturnすらないCPUもある。POPしてジャンプという
なんだかなあ

779:デフォルトの名無しさん
19/10/02 03:55:47.57 238K9SSk.net
あら。なんかすまん、別人なのね
>>766
んー、なんで「知らない」前提なのかさっぱりわからん。一般的な関数の形態としての話だし、その言っていることは>>743,744で書いているのだけど(もちろんそんなことは前々から知っていての)
あくまでも関数の形態としてのreturn文ね。わからないかなあ
なにか俺は知らないを前提に書いているようだけど、なんで??

780:デフォルトの名無しさん
19/10/02 04:19:21.82 238K9SSk.net
ん??
ID:DWeKr+Az が頓珍漢に横入りしたのかwwなにをのたまっているのかだかな。もうあんたはいいよw同じこと繰り返してるし
>>768,769はID:o4tQ0hzeかと思って書いた
>>761はID:o4tQ0hze にご理解いただけたということでよろしいのですかね??

781:デフォルトの名無しさん
19/10/02 06:38:15.47 Ge1fP5ct.net
シェルスクリプトはシェルスクリプトだっていってんのに
俺は他の言語しか知らん。シェルスクリプトは他の言語じゃない!
といわれても、
うんじゃあ、シェルスクリプトを使えるように、シェルスクリプトの勉強をしましょうか?
としか言えんわなw

782:デフォルトの名無しさん
19/10/02 07:03:56.09 R26grXOk.net
アセンブラじゃなくて機械語だってすごいよなw

783:デフォルトの名無しさん
19/10/02 08:47:07.26 238K9SSk.net
>>771
どう読んで、そう思っているのか??
俺は他の言語しか知らん。シェルスクリプトは他の言語じゃない!なんてこれっぽっちも言ってないけど
他の言語の関数とはやっぱ違う他の言語の関数と同じようにはできないねというだけだが?端的には>>735と所詮コマンドということ
POSIXとしてもfunctionと名乗ってるけど、一般的=他の多くの言語のfunctionとは違うfunction、functionというよりコマンドだなやっぱちう
それがシェルスクリプトのfunctionで他の言語のfunctionとは違うって強く俺に言いたいんですかね?
いいよ、めんどくさいから読まなくても。レスするのもめんどくさいからw

>>772
まあ、そういう意味じゃないんだけどね(どういう意味のレスなのかイマイチだがw)
マクロアセンブラがあるようにアセンブラはどのようにもできる、やろうと思えば。縛りはそこじゃなくて、機械語だなという
また、機械語になんて関数なんて概念ないからねって話にも膨らむのになというw

784:デフォルトの名無しさん
19/10/02 09:15:47.03 gGwgwb6G.net
俺はたぬきしか知らないなんて言ってない!
みかんはたぬきとは違う!

785:デフォルトの名無しさん
19/10/02 09:19:32.36 R26grXOk.net
機械語に関数の概念が無いってすごいよなw

786:デフォルトの名無しさん
19/10/02 09:23:09.06 238K9SSk.net
めんどくせえなあ。とんちんかんな変すぎるレスいらんw
知らなかったのはサブルーチンとして使うのと関数として使うのにコストの差が思った以上にあったというだけだな。functionなんだからそんなに差が無いようになんかあるだろうと思い込みによる
それだけだよ
別にだから


787:関数のように使わないとも言わんし、いままでも使ってるし変わらずに使うけど



788:デフォルトの名無しさん
19/10/02 09:25:03.86 238K9SSk.net
>>775
無いよ。機械語を駆使して関数を作ってるっていう
機械語レベルの関数って?まあ、そんなCPUがもしかしたらあるのかもだが、知らんんなあ

789:デフォルトの名無しさん
19/10/02 09:39:55.43 238K9SSk.net
機械語にはサブルーチンはある。なきゃ困る(主にどこのアドレスに返ってくるのかのため)。単なるサブルーチンコール、引数の概念とかも無いw
引数も返り値(サブルーチン+返り値=関数)も、単なるmoveとかpushとかで「適当」なとこに入れての(主に高級言語(ほぼCだが)の仕様にあわせての)で、機械語の概念では存在しない
おしまい

790:デフォルトの名無しさん
19/10/02 10:11:40.69 caSqV8Sl.net
これマジ?

791:デフォルトの名無しさん
19/10/02 10:39:50.67 238K9SSk.net
この板にもあるだろうと思ったらあったし、
「関数」で検索したらアセンブリで関数というのを説明しているようなレスもあるやん
調べろよそのぐらいw

792:デフォルトの名無しさん
19/10/02 10:46:24.58 238K9SSk.net
ああ、すまん。勇み足だった。よく読んだらあんま詳しくはないかな
ある程度知っていての注意点ぐらいだった

793:デフォルトの名無しさん
19/10/02 10:51:24.96 238K9SSk.net
お詫びに探してきた
URLリンク(nw.tsuda.ac.jp)
興味があるなら、読もう。アセンブリの部分をも

794:デフォルトの名無しさん
19/10/02 10:54:19.14 caSqV8Sl.net
サンクス
読んでくるわ

795:デフォルトの名無しさん
19/10/02 11:01:36.56 vYvaxxoe.net
だいたいシェルスクリプトと機械語なんて超相性悪いから
シェルスクリプトの概念を例える別の言語として機械語(含むアセンブリ言語)は最悪の選択ではw
シェルスクリプトの標準・仕様書であるPOSIXも機械語には全く言及してないってか
適用範囲の節で明言してるし。
(つーかこの喧嘩って俺がkshの速度を持ち出したことが発端なんだな…
良かれと思って余計なこと言わなけりゃよかった)

796:デフォルトの名無しさん
19/10/02 11:18:14.46 238K9SSk.net
>>784
>シェルスクリプトの概念を例える別の言語として機械語
じゃないよ、そもそも言いだしたのは。俺じゃないけど。単にreturnという「語」のに絡みついてだけの>>747
まあ、機械語(=1対一でしかないアセンブラ)では当たり前なんだが、上記の通りに
てか、めんどくさいから読まないでしょ?レスするのめんどくさいよw

797:デフォルトの名無しさん
19/10/02 11:26:54.15 238K9SSk.net
>>784
>シェルスクリプトの標準・仕様書であるPOSIXも機械語には全く言及してないってか
>適用範囲の節で明言してるし
CPUによって全然違うし(CPUメーカーが作るもんでしょう)なあ。標準化なんてする範疇じゃないんじゃないかな
>kshの速度を持ち出したことが発端なんだな…
いや、違うよ。kshの件は早々に終わっているといえば終わってる。そんなのが全く関係ないとこでながながとなってるだけだな
その前の俺の思惑wからだな、長々としている原因は。強いて言えば

798:デフォルトの名無しさん
19/10/02 14:05:10.23 D8VruPt/.net
>>718 , >>719 が既に頭悪そうなんだよ。その辺りから見直したらいいんじゃないかな。

799:デフォルトの名無しさん
19/10/02 14:31:23.77 238K9SSk.net
よくわかんないなw

800:デフォルトの名無しさん
19/10/02 17:06:22.98 em13adMU.net
ファイル名に()が入ってるやつをリネームしようとしたら
Syntax error: "(" unexpected
と言われる・・
ファイル名から()取り除いたらうまくいきました
どうすればよいでしょうか

801:デフォルトの名無しさん
19/10/02 17:19:25.51 ccSnb7w3.net
touch "foo()bar" で作れたからそれかな
あるいは 正規表現のできるrenameツールに任せちゃう
URLリンク(paiza.io)
URLリンク(pastebin.com)
~/bin/rename.pl dry s/foo../foo/ foo\(\)bar
foo()bar => foobar
~/bin/rename.pl run s/foo../foo/ foo\(\)bar

802:デフォルトの名無しさん
19/10/02 20:34:07.49 9nRFYl/a.net
>>789
file="aaa (bbb) ccc"
mv "$file" "aaa"
シェルスクリプトでは引数の変数は""でくくるもんだ
常識だからな
shellcheckでチェックしろ

803:デフォルトの名無しさん
19/10/02 20:52:22.16 56vpBHGI.net
>>789
ファイル名をシングルクォートまたはダブルクォートで括る。またはそのようにシェルが特別な解釈をしてしまう文字の直前に \ を入れる。

804:デフォルトの名無しさん
19/10/03 00:15:58.71 SqD9WxB/.net
空白絡みで便乗質問です。
スクリプトがあるディレクトリを変数に入れるために、よく、
BASEDIR=$(cd $(dirname $0); pwd)
みたいなの書くと思うんですけど、
スクリプトを呼び出す際の相対パスや絶対パスに空白があっても大丈夫な場合はどう""をつければいいんでしょうか。
いつも試行錯誤するんですけどうまくいかなくて空白禁止にしちゃってます。

805:デフォルトの名無しさん
19/10/03 00:16:32.35 SqD9WxB/.net
大丈夫な場合→大丈夫にしたい場合、です。

806:デフォルトの名無しさん
19/10/03 00:41:53.26 kXokk7Ss.net
dirname "$0"じゃダメな理由はなに?

807:デフォルトの名無しさん
19/10/03 00:56:16.10 WHDqtNcX.net
"$(dirname "$0")" じゃない

808:デフォルトの名無しさん
19/10/03 02:58:37.36 DFQVUXe/.net
>>793
BASEDIR=$(cd "$(dirname "$0")"; pwd)

BASEDIR="$(cd "$(dirname "$0")"; pwd)"
↑これは不要
"引数"として渡す場合に必要。
変数への代入は引数ではないので不要

809:デフォルトの名無しさん
19/10/03 07:38:56.48 vim6DLSQ.net
>>790
ありがとうございます
今のところThunarに標準昨日の一括リネームでなんとかなりました
>>791,792
ls: 'aaa (bbb) ccc.jpg'にアクセスできません:
みたいな感じになりましたね

810:デフォルトの名無しさん
19/10/03 08:37:13.31 /bA39X9L.net
小数の計算がPOSIXで標準化されるって本当?
これどうにかしてほしいんだが
$ zsh -c 'echo $((0.1+0.2))'
0.30000000000000004
固定小数点をサポートしてくれよ。

811:デフォルトの名無しさん
19/10/03 09:12:38.31 BSBvRGI4.net
各言語での 0.1 + 0.2 の結果
URLリンク(0.30000000000000004.com)

812:デフォルトの名無しさん
19/10/03 09:41:30.99 T62xH6xP.net
言語というよりはどういうライブラリ使っているかの問題だと思うが

813:デフォルトの名無しさん
19/10/03 09:46:51.64 wbZFe5vy.net
きちんと0.3返す言語は
分子と分母の2つ記録するから速度は遅くなる
遅いシェルスクリプトの選択した方法は正しい

814:デフォルトの名無しさん
19/10/03 09:50:59.70 /bA39X9L.net
いや、誰が浮動小数点数的な答えを求めてるのよ?
誰も数学的に間違った答えなんか求めてないでしょ?

815:デフォルトの名無しさん
19/10/03 13:46:15.91 oxXSy4fC.net
固定小数点なんて採用することはないな
提案してみろ、まずはStandard C Libraryとして

816:デフォルトの名無しさん
19/10/03 14:46:29.02 Fw9k5QN4.net
>>801
ライブラリというより、内部での浮動小数点の形(float,double,long doubleのどれか。いまどきfloatは無いか)、および、いつ丸めてるかだけじゃね
>>800のも大体は結局はCでの結果でしかないだろう。デフォのdoubleの結果がほとんどだろう
例えば、awkは問題ないように見えるが。2.3 / 0.1 = 23 だが、int(2.3/0.1) = 22 になるのも

817:デフォルトの名無しさん
19/10/03 14:56:31.03 gitagY/F.net
>>805
いや、だからライブラリだろ。
同じ言語でも内部表現に関する決まりのない言語なら例えばBCDで保持するようにしてそれ用のライブラリで計算や10進文字列変換したって構わないんだからな。

818:デフォルトの名無しさん
19/10/03 15:03:35.77 Fw9k5QN4.net
そういうある意味特殊なことをしようとする意志のがあればな
結局はCなんだよどういう言語でもああいう部分は。そしてCがそうだからただそうなだけ。わざわざ言うようなことをするのは極めて少ないだろ
浮動小数点がIEEEで決められてる正規なものだし。特殊なプログラムを使えということだよ=シェルとかに求めるのは現在のコンピュータ界隈では無理筋だな

819:デフォルトの名無しさん
19/10/03 15:08:16.36 wbZFe5vy.net
perl か何かに任せておけ
#!/usr/bin/env perl
use bigrat;
my ( $ss, $F, $ISO ) = (@ARGV);
unless ( defined $ISO ) { $ISO = 100 }
my %shutter_speed = (
30 => -5,
25 => -14/3,
20 => -13/3,
......
);
printf "%s\n", 0/1 + $shutter_speed{$ss} + $F_number{$F} - $ISO_number{$ISO};
ただし perl bigrat だと
0/1 +
を抜くと型が整数処理されるというわけのわからん挙動するケースがあったから
別の言語がいいけど

820:デフォルトの名無しさん
19/10/03 17:47:54.90 vTPkh0Cq.net
>>807
浮動小数点とIEEE754は同じ意味じゃないから語弊が生まれるよ。
文字コードとUTF-8ぐらいの関係だろう。
そして大抵の小数を扱えるプログラムがCでIEEE754に準拠した浮動小数点による取り扱いをしてるって意見は、全然同意できないな。

821:デフォルトの名無しさん
19/10/03 18:03:01.77 NYKgu9W2.net
1. 数学的には正しくない。
2. 速度のために正確さを犠牲にしている。
3. 誰も間違った答えは望んでいない
仕様だから~とかいう話じゃないんだよね。
本当はみんな正しい答えが欲しい。
シェルスクリプトに速度は重要じゃないんだから
正しい答えのほうが便利だろ

822:デフォルトの名無しさん
19/10/03 18:39:51.77 K4DSf+RO.net
ほとんど近似値でたりるし必要なら自分でつくるなりすればとしか思わないよ

823:デフォルトの名無しさん
19/10/03 18:40:45.48 Fw9k5QN4.net
>>809
浮動小数点とIEEE754は同じ意味じゃないって?何を言いたいのかわからん
IEEE準拠じゃない独自のがあると?今時はFPUでやってるもんだし、速度なんぞを犠牲にしてまでもそういうのを「わざわざ」をやっている=それがウリになるからすぐに探せるんじゃないかなあ?
>>810
コンピュータサイエンス的にはそんなのはない=シェルスクリプト作る人も、そんな目新しいことをわざわざしないだろうとしか思えんな、いくらそう言っても

824:デフォルトの名無しさん
19/10/03 20:14:25.67 A9ow2usS.net
>>811
0.1+0.2が0.3にならなくてもいいよっていう業界を教えてくれ

825:デフォルトの名無しさん
19/10/03 20:20:38.23 gitagY/F.net
適当なところで丸めりゃ良いんだからいいじゃねえか

826:デフォルトの名無しさん
19/10/03 20:23:06.87 Fw9k5QN4.net
少数なんて大体でしかないなんて常識だと思ってたのにな。少数使わないでも結局できたりするので、また、固定少数でも結局工夫が必要なのには変わりないので
なんでそんなに少数の正しさに拘っているのだか、どういう業界でそういうのをしかもスクリプトオンリーで書かなきゃならないって想像できないな

827:デフォルトの名無しさん
19/10/03 20:30:23.62 KR7C+a5e.net
>>813
必要なら用途に合うもん使えよ

828:デフォルトの名無しさん
19/10/03 23:39:56.70 5pSilKMJ.net
気が付いたら少数を使うことがほとんどなくなった
利子の計算ぐらいだが、これは何桁で計算を打ち切るか
あらかじめ決めておく。安易に double とか使わない

829:デフォルトの名無しさん
19/10/03 23:43:58.79 6kVVAM38.net
簡単なシェルスクリプトしか書けんが何が覚えとけって言語ある?
s以外のsedの機能をようやく覚えたけどコマンドは文字列操作系で手一杯だわ
やっぱりperlの呪文覚えるしかないか

830:デフォルトの名無しさん
19/10/03 23:49:00.65 wbZFe5vy.net
パイプが強烈だから文字列処理に強い perl でしょ
オブジェクト指向はいらない

831:デフォルトの名無しさん
19/10/04 00:41:14.19 jIZSSFYe.net
>>818
JavaScript

832:デフォルトの名無しさん
19/10/04 00:43:47.35 jIZSSFYe.net
>>817
それな。何桁で計算を打ち切るだと、どこで誤差が出るか想定しやすいが
doubleとかだと、桁数小さくても誤差が出るから、想定しづらいんだよね。
シェルスクリプトは型が文字列しか無いんだから、
内部の都合である数値型には影響されてほしくないな

833:デフォルトの名無しさん
19/10/04 01:20:38.52 5l5U7bxj.net
>>812
文字コードってのは文字に番号を割り振って取り扱いますよ、という概念。
浮動小数点も一緒で、有限の長さの小数を、小数点の位置を自由にすること
(仮数部と基数部で表現する)ことで表しますよって概念。
各ベンダーが独自に実装したら不便極まりないから文字コードにおけるUnicode(とかUTF-8)と同様IEEE754という標準がある。
浮動小数点演算、と言ったときにそれは一概にIEEE754内部表現を用いた演算とはならない。
URLリンク(ja.wikipedia.org)任意精度演算 の方式の中にはIEEE754でない浮動小数点表現を取り扱ってるものだってあるだろう。
BCDで小数が扱えるライブラリだってそう言うのが多いと思うよ。
IEEE754の仕様の浮動小数点演算で十分な場合は、CPUに便利命令が用意されてて1桁ずつ計算とかしなくても
一発で計算が求まるからIEEE754の浮動小数点は使われている、というだけでしょ。
浮動小数点っていう大きい概念がどういったものかってのと、IEEE754はその概念を実現するための一例でしかないってのを、
Wikipediaなり読み込んで理解したほうが良いと思うよ。
ほんと、文字コードとUTF-8は同じものだ、って言ってるぐらいトンチンカンだから

834:デフォルトの名無しさん
19/10/04 01:34:09.77 N11Kz3K2.net
>>813
セブンイレブンとか

835:デフォルトの名無しさん
19/10/04 01:44:25.75 eSKeLXlH.net
>>818
1-liner、パイプ、CSV・テキスト処理、クローラーなら、可読性が高い、Ruby !
Perl のような謎のような記号は少ない

836:デフォルトの名無しさん
19/10/04 03:06:51.70 gCVTKDJQ.net
>>822
他のが無いというのではなく、実際に使われている多くはというのだよ
実際に使われているのはどれだけあるの?わざわざ使ってるのならそれは意味があるのだから、そうナニか書いてあってすぐにわかるだろうという。例えばbcのように
URLリンク(ja.wikipedia.org)
多くのプロセッサなどの~ から書いてある通り。Javaがそうでないように書いてあるが、
URLリンク(www.ibm.com)
同様に、java.math.BigDecimal が提供する任意精度の10進数もアプリケーションで使用されることは少ないため、開発者に無視されているケースがほとんどです
しかし整数を中心としたプログラムに、突如、整数以外の表現が出てくることがあります。たとえば、JDBCではSQLDECIMAL 列の優先変換形式としてBigDecimal が使用されます
なんてある意味それを表しすぎなくらい(まあ、ここは作る側ではなく使う側を言ってるけど)
CPUに便利命令ってFPUに対するのこと?一発で計算が決まるからという簡単だからとかじゃなくて、FPUがあるのはハードで支援用意しないとそもそも浮動小数点は重い演算だからなんだけど
>文字コードとUTF-8は同じものだ、って言ってるぐらい
いや、言ってないけど、なにか思い込みが激しいね。IEEEが利用されないのも普通という考え方もそうだが

837:デフォルトの名無しさん
19/10/04 03:13:49.05 gCVTKDJQ.net
>>825
>Javaがそうでないように書いてあるが
ああ、違ったしつれい。IEEE 754 を必須か
使ってないってどれだ?どういう理由でという思いがあって、おおと思ったんだけど

838:デフォルトの名無しさん
19/10/04 04:25:45.39 jIZSSFYe.net
もうさ、ハードで固定小数点数演算できるようにしたほうが良いんじゃね?
時代的にさ

839:デフォルトの名無しさん
19/10/04 05:02:19.85 Lr70dHDq.net
BCDはCPUで支援してた(そういう命令があったが)ようだが、無くなったっぽいという
BCDは速度的に有利な側面があるからわざわざそれ専用に用意しなくてもで無くなったかもしれない

840:デフォルトの名無しさん
19/10/04 07:56:41.21 sZOtDaP2.net
>>827
お前さんがこだわるほど他の人は必要だと思ってない。あったら便利なケースもあるかも知れんがコストなどに見合わないから誰もやらない。

841:デフォルトの名無しさん
19/10/04 08:55:49.66 UTOwlhyp.net
消費税の話もあるし、固定小数点は重要だよ

842:デフォルトの名無しさん
19/10/04 11:44:19.51 VMw2vpri.net
固定小数点演算なんて整数演算と同等だからわざわざハードで実装しなくても問題ない

843:デフォルトの名無しさん
19/10/04 14:32:11.23 hcjI0QEW.net
>>818
そのままPerl覚えれば良い。
というのは、昔からあってあちこちで使われており、だいたいの Linux distribution はデフォルトでインストールされるような言語であるため。
インストールや環境整備で悩まなくて済む。後からモジュールを追加するとしても最初からrpmファイルがあったり、なくてもCPANを利用して簡単にインストールできる。
歴史が長く昔から使われて来たのでモジュールも沢山あり、またそれを解説しているサイトも多い。

844:デフォルトの名無しさん
19/10/04 14:36:19.79 hcjI0QEW.net
>>824
知らない言語を見ればどれも謎の記号だらけに見えるとは思うけどね。
まあでもPerlは確かに多いかな。なるべく使わないようにも書けるが。

845:デフォルトの名無しさん
19/10/04 14:37:02.99 5wfXTPgW.net
alpine linuxでperllインストールされてないんだが?

846:デフォルトの名無しさん
19/10/04 14:42:01.29 hcjI0QEW.net
>>831
そうそう。整数計算後に割って桁合わせすれば良い。

847:デフォルトの名無しさん
19/10/04 14:42:43.80 hcjI0QEW.net
>>834
そうか。まあそういうのもある。

848:デフォルトの名無しさん
19/10/04 14:43:52.73 M3k51a5A.net
必要ならインストールすれば良いだけだ

849:デフォルトの名無しさん
19/10/04 14:59:17.54 5wfXTPgW.net
余計なものに依存したくない

850:デフォルトの名無しさん
19/10/04 17:13:04.07 /U6oHgYD.net
そりゃお前の趣味だからな
perlを使いたいならインストールする
当たり前の話だよな

851:デフォルトの名無しさん
19/10/04 21:55:54.53 a0HWEhLa.net
perlを使いたいわけじゃないからなぁ

852:デフォルトの名無しさん
19/10/04 22:57:45.34 eSKeLXlH.net
Perl, Python2・3 は最初から、入っているけど、
Ruby も、apt で、簡単にインストールできる
ただし、Ruby 2.3 ~ 2.6 で、プログラマーが、新しめの書き方をしていた場合に、
古いバージョンで動かないことがあるかも

853:デフォルトの名無しさん
19/10/06 09:16:44.91 XBuBF2Rc.net
全員がsudo権限あるわけじゃないしな・・・

854:デフォルトの名無しさん
19/10/06 09:44:40.51 462kqzf/.net
perlなんて普通に入ってるからな
Solaris、AIX、HP-UX、FreeBSD、Ubuntu、Centos、Redhat、Fedora
俺が触ってきたシステムではデフォルトで入ってたな
入ってない方が少数派だろ

855:デフォルトの名無しさん
19/10/06 11:20:12.25 NnE09bAt.net
少数派だが入ってない

856:デフォルトの名無しさん
19/10/06 11:24:56.60 kChpVj98.net
所属する研究室のMFにも入ってねーな。
Bシェルとかは(もちろん)入ってるけど
そういう点で言えばPOSIX準拠のシェルがあるようなシステムにはPerlも入っていて
PerlもないようなシステムにはPOSIX準拠シェルもないのかも知れんw

857:デフォルトの名無しさん
19/10/06 12:03:22.79 NnE09bAt.net
だからAlpine linuxにはPOSIX準拠のシェルは入っているが
Perlは入ってないんだって。
いい加減Perl依存やめようぜw

858:デフォルトの名無しさん
19/10/06 12:15:46.78 rthNV3zo.net
俺達もそろそろPOSIX汚染から脱却しようぜ

859:デフォルトの名無しさん
19/10/06 12:17:46.00 NnE09bAt.net
>>847
じゃあ言い出しっぺのあなたから、POSIXが含まれてる
LinuxやBSDやUnixやMacやWindowsを使うのをやめてください

860:デフォルトの名無しさん
19/10/06 12:21:19.21 rthNV3zo.net
そもそも使ってないし

861:デフォルトの名無しさん
19/10/06 12:28:35.75 NnE09bAt.net
サーバー側で使われてる

862:デフォルトの名無しさん
19/10/06 12:38:20.58 462kqzf/.net
相変わらずPOSIX原理主義者が張り付いてるんだな
日本は信教の自由はあるが強要するのは犯罪だ
他人を巻き込まないで1人でやってろよ

863:デフォルトの名無しさん
19/10/06 12:54:03.04 NnE09bAt.net
だからPOSIX原理主義じゃないってw
Alpineはbusybox使ってるからPOSIX未満なんだよ

864:デフォルトの名無しさん
19/10/06 13:05:31.69 462kqzf/.net
お前はperl使いたくないんだろ?
お前の自由だし好きにすればいい
それを他人に押し付けるなと言っている
俺は普通にperlを使う
俺の自由だし好きにする
以上

865:デフォルトの名無しさん
19/10/06 13:12:15.17 rthNV3zo.net
        ∧∧  ミ _ ドスッ
        (   ,,)┌─┴┴─┐
       /   つ.  終  了 │
     ~′ /´ └─┬┬─┘
      ∪ ∪      ││ _ε3
               ゛゛'゛'゛

866:デフォルトの名無しさん
19/10/06 13:16:18.11 NnE09bAt.net
誰もPerl使うなって言ってないだろ。
Perlが入ってない環境があるという
事実を言ってるんだが

867:デフォルトの名無しさん
19/10/06 14:00:34.35 mC4FM69a.net
>>845
そのミッドフィールダーってなに?

868:デフォルトの名無しさん
19/10/06 14:56:55.93 VRfDnOhz.net
マネーフォワードだろ。

869:デフォルトの名無しさん
19/10/06 17:41:58.00 3lXqNGxa.net
容量削減のためにPerlだけ抜くのも変だしそれ目的なら他のも入ってないのでは?

870:デフォルトの名無しさん
19/10/06 21:01:12.68 TprJMO+0.net
まぁないものどうこう言っても始まらない
ただwin のiE6とかのようにubuntu以外は淘汰されていくだろうから
最終的には問題ないんじゃない?

871:デフォルトの名無しさん
19/10/06 21:15:53.96 /W6lnfS0.net
Linuxはdistributionごとに色々目的が違うからPerl入ってないのがあっても特に不思議はない。
AndroidのベースのLinuxにも入ってないし、普通はそこでは必要とされない。

872:デフォルトの名無しさん
19/10/06 21:31:35.20 1e7RWsdc.net
AndroidをLinuxとして使ってるのはどれだけいるのかと

873:デフォルトの名無しさん
19/10/06 22:18:30.79 +aq+gJyQ.net
それ向けの端末エミュレータとかシェルスクリプト編集実行とかは結構種類あるけどね
割合は少ないだろうね

874:デフォルトの名無しさん
19/10/07 02:35:02.37 qQU+qyu9.net
そういう人はperlも必要なら入れるな。perlに限らず

875:デフォルトの名無しさん
19/10/07 08:39:27.35 4YPUQoiH.net
>>818 Python やっとけ。 perl は成仏させろ

876:デフォルトの名無しさん
19/10/07 12:58:26.99 lSqRbxbA.net
PerlはCの如くしぶとく残ってしまうと思うなあ。

877:デフォルトの名無しさん
19/10/07 14:23:04.89 MItW4Ls8.net
sedやawkを忘れたんで代わりにperlを使うことが結構ある

878:デフォルトの名無しさん
19/10/07 15:51:12.82 Wc5EJs/z.net
perl -peをsed代わりに使ってるだけでperl自体には興味ないや
正規表現しか出番ないし使う機会がないんだよね
awkとかgrepとかどうせ他のコマンドも


879:覚えなきゃならんし



880:デフォルトの名無しさん
19/10/08 14:32:15.36 C04IGCd6.net
>>865 残ることは残るだろうけど、誰からも見捨てられてる状態で生き延びていても学ぶ価値はない。
プログラミング言語人気トップ8、過去15年間で安定 - 例外はPython
2019/10/07 14:16 後藤大地
URLリンク(news.mynavi.jp)
TIOBE Softwareから、2019年10月のTIOBE Programming Community Index (PCI)が公開された。
TIOBE PCIは、複数の検索エンジンの検索結果から、対象となるプログラミング言語がどれだけ話題に
なっているかをインデックス化したもの。(中略)
TIOBE Softwareは発表の中で、毎年新たなプログラミング言語が登場しているものの、TIOBE
Programming Community Indexのトップ8は過去15年間でほとんど変化していないと説明した。
Perlが消えてPythonに入れ替わったことや、Objective-Cが消えてSwiftに替わったというのが大きな
例外で、それ以外に大きな変動はないと指摘している。
ただし、プログラミング言語の分野に関してはいくつかの傾向があるとして、その例としてPHPやPerlから
Pythonへ移っていること、新しいプログラミング言語としてDart、Scala、Lua、Rust、Kotlin、TypeScript
などが人気上昇の渦中にあることなどを説明している。
10月TIOBE Programming Community Index / 円グラフ
URLリンク(news.mynavi.jp)

881:デフォルトの名無しさん
19/10/08 15:00:13.27 dg9qT1Hg.net
Perlはsedやawkと同じ位置で見ないとだめだよ
シェルスクリプトを書くときにsedやawkのように使う道具のひとつ
もちろんシェルスクリプトをまるごとPerlのスクリプトに置き換えてもいいけどそれは別の話
Perlを排除するのは武器を一つ捨てるようなもので損してるよ

882:デフォルトの名無しさん
19/10/08 15:03:58.28 4CpPhkv4.net
汎用言語としてはpython の時代に移ったかもしれないが
文字処理言語としてはいまだ現役

883:デフォルトの名無しさん
19/10/08 15:16:45.62 wc9EJfFY.net
>>869
と言ってもお前、sedやawkが使えないから
perlを使ってるだけやん。
お前の問題であって、perlである必要ないやん

884:デフォルトの名無しさん
19/10/08 15:49:08.88 dg9qT1Hg.net
俺当然sedもawkも使えるんだけど?
awkで複雑になる処理をPerlで可読性高く楽に書いてるってだけ
あんたも使える道具をうまく選べばいいんでPerlを知らなくても気にするな

885:デフォルトの名無しさん
19/10/08 16:39:54.73 9VgyN7XE.net
「Perlの方が楽に書ける」なんていうのは個人の嗜好に依存してて,ほとんど無根拠に近い。
もしPerlの「素晴しさ」とやらを報しめたいのなら,もっと客観的な事実―導入率・実績云々―を提示したほうがいいよ。
尤も,俺に言わせればAWKのほうが〜Perlのほうが〜なんていう議論とも呼べない喧嘩それ自体くだらねぇけどな

886:デフォルトの名無しさん
19/10/08 17:07:54.66 uaD7+k1O.net
>>872 sed もawk も使えるならPython を使えばいいじゃん。
お前がPythonを使えないだけだろ。

887:デフォルトの名無しさん
19/10/08 17:13:16.90 gh1TIWVl.net
python使ってわざわざ長いコード書いてどうするの?
sed -e 's/ABC/XYZ/' file1.txt
python -c 'import sys,re; [print(re.sub("ABC","XYZ",l,1),end="") for l in sys.stdin]'

888:デフォルトの名無しさん
19/10/08 18:40:06.69 4CpPhkv4.net
gnu sed なら -e すら省けるんだよな

889:デフォルトの名無しさん
19/10/08 18:40:15.32 g


890:O+Oxfwr.net



891:デフォルトの名無しさん
19/10/08 19:07:13.65 /hvysQLZ.net
pythonはワンラインにはあまり向かんのは同意。
フリーフォーマットじゃないんで当たり前といえば当たり前か。

892:デフォルトの名無しさん
19/10/08 19:30:38.22 vS76WaY3.net
宗教戦争は自分の信じるものが正しく、それ以外は認めないという非寛容が原因で始まる

893:デフォルトの名無しさん
19/10/09 02:18:53.91 CaMm18My.net
python ワンライナーに挑戦 ~ 初心者のお勉強 m(_ _)m - Qiita
URLリンク(qiita.com)
闇Pythonista入門(Pythonワンライナーのテクニック集) - Qiita
URLリンク(qiita.com)
杓子定規にするからこうなる
知恵比べはまた別の課題だろうに

894:デフォルトの名無しさん
19/10/11 19:00:05.85 QtmRuluN.net
case $value in
*-*=*-*)
esac
こんなふうに、*が複数ある場合の動きとかちゃんと仕様化されてるの
どのシェルでも同じように動く?

895:デフォルトの名無しさん
19/10/11 19:51:09.99 5TKzffM3.net
「されてるの?」
なのか
「されてるの(だ)」
なのか。

896:デフォルトの名無しさん
19/10/11 22:19:25.99 EZwTHuUV.net
>>881
URLリンク(pubs.opengroup.org)

897:デフォルトの名無しさん
19/10/12 11:56:42 6fabclhr.net
>>883
意味がわからん

abbb 、という文字に対して、a*b はマッチするのが正しいの?
aに続く残りのbは*で全部消費されるんじゃないの?


$ sh -c 'case "a-b-c-b-c-b-c" in (a*b*c) echo ok; esac'
$ sh -c 'case "a-b-c-b-c-b-c" in (a*b*c*b*c) echo ok; esac'
$ sh -c 'case "a-b-c-b-c-b-c" in (a*b*c*b*c*b*c) echo ok; esac'
すべてokってでる

どういうアルゴリズムなのかわからない

898:デフォルトの名無しさん
19/10/12 13:05:32.76 19ZHiYan.net
Perlの正規表現なら最長マッチがデフォ

899:デフォルトの名無しさん
19/10/12 17:15:42 1KIHwFcK.net
IPアドレスもgreedyが基本だな。

900:
19/10/13 14:15:24 wtTHifIn.net
ワイルドカードもだよね

901:
19/10/15 20:13:38 tkdZ32xn.net
>>884
感覚的に分かりやすい
URLリンク(media.theync.com)

902:デフォルトの名無しさん
19/10/16 03:31:59 Pvq8peJ9.net
>>888
グロ

903:デフォルトの名無しさん
19/10/16 08:08:38.68 9/jaba51.net
変数名を変数で指定できるのは欠陥じゃねえ

904:デフォルトの名無しさん
19/10/17 13:11:40.29 huR1Dm0j.net
はー、すげー。yashの実装に感動した
getopts "ab" OPT -ab
echo "$OPT $OPTIND" # => a 1:2
getopts "ab" OPT -ab
echo "$OPT $OPTIND" # => b 1:3
getopts "ab" OPT -ab # exit status = 1
echo "$OPT $OPTIND" # => ? 2

905:
19/10/17 16:55:00 PM8kIYTO.net
if ls "*.txt" > /dev/null 2>&1
then
echo "OK"
else
echo "NG"
fi

まったくうまくいかない
なぜ単なるファイルの存在確認だけにこんな苦労するのか

906:
19/10/17 17:04:24 z1/RyPhF.net
ファイルの存在確認なら、-fを使えばいいだろ?

907:
19/10/17 17:05:16 e7ZwLQTq.net
# # ls *txt && echo ok || echo bad
ls: '*txt' にアクセスできません: No such file or directory
bad

# # touch foo.txt
# # ls *txt && echo ok || echo bad
foo.txt
ok

こんな要領か?

908:
19/10/17 17:05:47 z1/RyPhF.net
あ、ディレクトリに *.txt があるかどうかってことか?

909:
19/10/17 17:08:50 PM8kIYTO.net
>>893
ところがワイルドカード使うと途端に何も引っかからなくなる

910:
19/10/17 17:09:26 PM8kIYTO.net
>>895
そうです

911:
19/10/17 17:10:05 z1/RyPhF.net
getopts vs getopt だけどさ、
BSDにおいてgetoptのメリットって何?

BSD版のgetoptはロングオプションに対応してないし、
引数にスペースが入ったらうまく行かないし
使い勝手悪いと思うんだが。

もしかして最初に作られたのがgetoptで
それを改良してgetoptsがシェルビルトインとして作られた。
(その後GNU版getoptが改良され、getoptsよりも便利になった)
という流れだったりするの?

912:
19/10/17 17:10:16 e7ZwLQTq.net
普通のプログラミング言語と違って
シェルスクリプトはブーリアンの分岐は可能なら
if else 使うよりも && || が見やすく良いと思う

913:
19/10/17 17:12:52 PM8kIYTO.net
>>894,899
いけた
分岐後の処理も大したことしないしこれでやってみようと思う?

914:
19/10/17 17:13:24 z1/RyPhF.net
>>896
アスタリスクを使うと、シェルが解釈して、
例えば、 ls * だと、 ls file1 file2 file3 file4 って実行したのと同じことになるんだぞ。
lsコマンドの中からはアスタリスクが使われてるかどうかなんてわからない。

そしてダブルクォートで括ると、lsコマンドの中から引数は "*" という文字列が渡されたようになるんだよ。

915:
19/10/17 17:14:21 ieavKq01.net
うまくいかなかった原因分かった?

916:デフォルトの名無しさん
19/10/17 17:19:49.73 z1/RyPhF.net
>>899
それだめ。 shellcheck使ってみ、エラーになる。
shellcheck において && || みたいな三項演算子風な使い方は
func && VALUE=ok || VALUE=ng
という書き方(変数代入)のみ認められる。
func && foo || bar
は認められない。
なぜかと言うと、
1. func が 正常終了して
2. foo が 異常終了すると
3. bar が 実行されるから
変数代入に限れば必ずVALUE=okは正常終了するから、
この書き方に限って許されてる。
だから、一応fooが必ず正常終了するものであれば、使えなくはないけど
静的解析ではそれを知ることが不可能なので、shellcheckはエラーになる。
あともう一つ、barが異常終了したとき、&& || だと $?はエラーになるが、
ifで書けばfi終了後、$? は正常終了になってるという違いもある。
だからset -eでの挙動が変わる。

917:デフォルトの名無しさん
19/10/17 17:21:53.83 z1/RyPhF.net
もちろん、&& 単独、もしくは || 単独で 使うならば問題ない。
func && foo とか func || bar ならOK

918:デフォルトの名無しさん
19/10/17 17:26:43.45 PM8kIYTO.net
今度は ls "$dir/tmp/*.txt"
みたいなことしたらアクセスできませんみたいなことを言われた
>>901
なるほど
>>902
多分"*.txt"ファイルにアクセスしようとしてできないって言われたことが原因?
でもなぜかls *.txtみたいに、ファイル直だとイケる

919:デフォルトの名無しさん
19/10/17 17:33:24.48 z1/RyPhF.net
あー、やっぱりそうなんや
URLリンク(en.wikipedia.org)
URLリンク(en.wikipedia.org)
getoptは1980年頃つくられた。初期のgetoptは低機能
その改良として getopts が1986年にBourne shellに実装されたらしい。
その後、getopts (Solaris) と getopt (GNU) それぞれ違うコマンドで
ロングオプションがサポートされ
どちらでもないBSD(macOS含む)では、従来どおり
低機能な getopt と それを少し改良した getopts があるが
どちらもロングオプションはサポートしてないと

920:デフォルトの名無しさん
19/10/17 17:37:12.84 z1/RyPhF.net
>>905
だからダブルクォートで括るからいかんのや
ls "$dir/tmp/" * ".txt"
これが正解(スペースは目立たせるために入れただけ)
この書き方ダサいよなw
ちなみに古いシェル(poshだっけ?)でこれがうまく行かない
バグがあるのだが、まあ誰も気にしないわなw

921:
19/10/17 17:40:52 z1/RyPhF.net
getopts (Solaris) でロングオプションがサポートされたってシェルなんだ?って思ったら、
Solarisでは/usr/bin/getoptsが存在するのか・・・
紛らわしいな
URLリンク(docs.oracle.com)

922:
19/10/17 17:43:27 z1/RyPhF.net
あ、いや /usr/bin/getopts もあるにはあるが、libcのgetopt()実装が拡張されたから
それを使ってるBourne Shellでも使えるようになったのか

> getopts (Solaris enhanced)
> As a result, this new feature was also available in the built-in command getopts of the Bourne Shell.

923:
19/10/17 17:47:11 PM8kIYTO.net
>>907
うおおできた!
ls "$dir/tmp/"*".txt" && echo "ok" || echo "ng"
みたいな感じにした
(txtファイルがひとつもないときエラー出るけど!無視)
?

924:デフォルトの名無しさん
19/10/17 19:06:38 yPX5iNuE.net
ジェルスクリプトってバッドノウハウの塊なんだな…

925:デフォルトの名無しさん
19/10/17 21:18:21.03 CFrrzXLD.net
TeXで書かれた人工知能みて,「バッドノウハウ」って言ってるみたいw

926:デフォルトの名無しさん
19/10/17 21:23:39.68 1JFOpLrO.net
GLOB展開と""内での文字列展開は別物で""内での文字列展開にGLOBは含まれないというだけだけどな

927:デフォルトの名無しさん
19/10/17 22:15:54.16 yIl6cqO6.net
マニュアルにかっちり書いてあるんだけどな
読み解くのは確かに能力が必要だが

928:デフォルトの名無しさん
19/10/18 00:25:26.47 DhnYyybT.net
>>892-897
find . -type f -name "*.txt" | wc -l
-type f は、ファイルのみ。
wc -l は、行数を数える。無ければ、0

929:デフォルトの名無しさん
19/10/18 00:33:26.40 l6dCA2lX.net
$ mkdir tmp && cd tmp
$ touch $'a\nb.txt'
$ find . -type f -name '*.txt' | wc -l
2

930:
19/10/18 00:51:30 DhnYyybT.net
相対パスなら、-path で、カレントディレクトリからの相対パスで指定する

find . -type f -path "./test/*.rb" | wc -l

931:
19/10/18 02:59:20 Shj9H2hw.net
なるほろ
bash によるオプション解析 - Qiita
URLリンク(qiita.com)
bashのワイルドカード展開は該当するファイルが無いと*が展開されずに残る - Qiita
URLリンク(qiita.com)

manはマニュアルだがman自体に取説が必要な皮肉
man manを読む時点で骨が折れるからしゃーない

932:915
19/10/18 04:58:51.55 DhnYyybT.net
Ruby では、これでカレントディレクトリの該当ファイル数がわかる。
無ければ、0
ruby -e 'puts Dir.glob( "*.txt" ).length'

933:
19/10/18 09:56:55 dNt3vJtH.net
/bin/ls -1d *.txt 2> /dev/null | wc -l

934:デフォルトの名無しさん
19/10/18 11:02:02.61 lmpJOwiE.net
find使うのは有りだと思うがmaxdepthとquitをつけたほうが良い
if test -n "$(find . -maxdepth 1 -name "*.txt" -print -quit)"; then
echo "OK"
else
echo "NG"
fi

935:
19/10/18 11:55:18 O8T9zLoM.net
>>921
ただしそれらは POSIX 準拠ではない
URLリンク(pubs.opengroup.org)

936:デフォルトの名無しさん
19/10/18 13:39:28 +f5J2l87.net
やっぱりどこでも動くシェルスクリプトなんて幻想なんだね…

937:
19/10/18 14:04:15 e+8RgQym.net
>>918
暇なときに man と bash の man をちゃんと読み込むことをお勧めする
全部理解するのは確かに大変だが、こんな機能があるということだけ
覚えておいて、現実の問題に直面した時に詳細を再検索するのが
実用的。bash だけの問題ではないが。

938:デフォルトの名無しさん
19/10/18 23:14:29.88 m9M+BHHc.net
bashのmanはメンテされてないんじゃね?

939:デフォルトの名無しさん
19/10/18 23:19:16.34 1h1F7NR4.net
日本語版がメンテナンスされてない(もしくは遅い)だけだよ

940:デフォルトの名無しさん
19/10/19 00:34:03.00 +f1cBD8l.net
日本語版の記述が少なくて英語版の方だけびっしりとか実にマニュアルらしい

941:デフォルトの名無しさん
19/10/19 13:26:03.97 9TTj0TwZ.net
近頃は無料で web 上で使える翻訳ソフトの質も上がっているし
頑張って読んでくれ。

942:デフォルトの名無しさん
19/10/19 19:06:51.24 VYVT60v2.net
翻訳めっちゃハッテンしてきてるよね

943:デフォルトの名無しさん
19/10/19 20:14:11.99 jibveSnU.net
ウホッ
じゃなくて
なんだ
infoとかそっちしかハッテンしてないとかあるじゃん

944:デフォルトの名無しさん
19/10/20 17:43:31.69 Tm15VeOJ.net
まあ、確かに sed の s コマンドのオプションは man にも入れてほしかった。
オプション使えなくなったのかと思ったじゃないか…

945:
19/10/20 23:14:32 n5s+FSXq.net
日本語版だけスカスカと言えばlocate

946:デフォルトの名無しさん
19/10/21 17:13:45.45 mT54cHzD.net
まあ裏を返せばそれだけ国際標準から離れていないってことよね。
ar.localeとか酷い……

947:デフォルトの名無しさん
19/10/21 21:16:47 SCSOJkPH.net
あるユーザー(Aとする)が、他のユーザー(Bとする)にのみWrite権限があるファイルを削除するような作業を自動化したいです。

当然そのままでは削除できないので、AからRootに切り替わり、ファイルを削除した後、Rootを抜けてAに戻るというBashスクリプトを作成しようとしています。

AはSudoが実行できない環境で、Expectコマンドもありません。Rootのパスワードはわかっており、平文でシェルスクリプト内に書き込んでも構いません(使用者が数人で、かつ外部に接続できないため。なのでセキュリティの問題は今回は無視)。
このような状態で、どうにか目的を果たすスクリプトはかけますでしょうか。

OSはFedora10、新たにプログラムパッケージ等はインストールできません。

よろしくおねがいします。

948:デフォルトの名無しさん
19/10/21 21:41:04 aSOXSPh+.net
すなおにrootで全部やれば良いんじゃね?

949:デフォルトの名無しさん
19/10/21 22:08:16.20 /woRRfjw.net
>>934
そもそもAがファイルを消せるようにパーミッションが初めから設定されるようには出来ないの?


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