19/07/03 22:05:25.84 t0CPqQzZ.net
>>101
$SHLVL変数で判定するんじゃないの?
113:デフォルトの名無しさん
19/07/03 23:07:21.62 t0CPqQzZ.net
……と思ったらhogeとhageかよw
クッソwww紛らわしいメタ変数使うなw
普通hogeの次はfugaだろーがよ
114:デフォルトの名無しさん
19/07/04 03:34:12.16 KpaWo1Ff.net
commandって便利やな。
シェルスクリプトでオーバーライドができちゃうよ
115:デフォルトの名無しさん
19/07/04 07:10:15.99 vxwYTSOB.net
>>112
ls () {
command -p ls
}
↑こういうやつなw
116:デフォルトの名無しさん
19/07/04 09:07:36.04 BLb3ulq0.net
command て.... ググラビリティ低すぎでしょ
117:デフォルトの名無しさん
19/07/04 09:37:41.63 vxwYTSOB.net
>>114
いやもっとググビティ低いのでmanとかありますし……。
あとcatもかな?make・niceあたりも引っ掛かりにくい。
でもまあ関連語句と一緒に検索すればノイズはほぼ無くなるけどね。
118:デフォルトの名無しさん
19/07/04 10:08:16.55
119:846uO/vY.net
120:デフォルトの名無しさん
19/07/04 10:50:19.43 8CMbGrkR.net
シェルスクリプトで、実行結果にかかわらず終了コード0を先出しする書き方ってないでしょうか。
背景としては…
openvpnのServer側で、「clientが接続してきたらコマンドを実行」できるんですが、
そのコマンドの終了コードが0でないと以降の処理が進まず、接続が確立されないようなんです。
今回コマンドの目的は「SSHでclientにコマンドを送り込むスクリプト」なので、
コマンドの実行結果なんか見ないで先に接続を確立してくれないと、送り込みようがないです。
なのでopenvpn側には、スクリプトの結果にかかわらず終了コード0を先に返しておいて、
sleepを入れるなり何なりして後からSSHでコマンドを送り込みたいんですが、
/path/to/script.sh && true とか色々試してみるも、一向にスクリプト終了と見なしてもらえません。
何か方法はないでしょうか。
121:デフォルトの名無しさん
19/07/04 10:58:34.54 vxwYTSOB.net
/path/to/script.sh; true
これじゃあかんの?
122:デフォルトの名無しさん
19/07/04 11:41:34.07 97ll0bAQ.net
catとtac
lsとsl
moreとless
nanoとmicro
headとtail
こいつらみたいな言葉遊びって他にもある?
大抵は既存コマンドの改良版が対にされやすいよな
123:デフォルトの名無しさん
19/07/04 11:54:20.16 VX27EPul.net
>>117
/path/to/script.sh & true
script.shをバックグラウンドで実行でいいんじゃないの
124:デフォルトの名無しさん
19/07/04 12:16:55.68 KpaWo1Ff.net
>>117
終了コードを先出しするの意味がわからんが、
まあ中断しないようにしたいということだとして。
まず途中で中断するのは set -e されてるから
set -e されてる状態だとコマンドの終了コードが0以外だとそこで中断されてしまう。
中断されなくする一番簡単な方法は
hige ||: ・・・終了コードが0以外でも中断せず、かつ終了コードを0にする
hige &&: ・・・終了コードが0以外でも中断せず、かつ終了コードはそのまま保持する
あと、if hige; then ~ みたいに if や while の中に入れてもOK
if や while は、コマンドの終了コードを条件に処理を分岐するので
これらの中に入れても中断しなくなる。
125:デフォルトの名無しさん
19/07/04 12:22:58.60 KpaWo1Ff.net
>>117
どうでもいいけどさ、openvpnの機能で
たしか接続時にスクリプト実行する機能がなかったか?
126:デフォルトの名無しさん
19/07/04 12:29:18.19 vxwYTSOB.net
>>119
yacc→bison
cat→dog
make→kati (URLリンク(git.io))
127:117
19/07/04 14:12:34.15 8CMbGrkR.net
>>118,120
;も&もダメでした。
>>121
ちょっと理解し切れてるかわかりませんが、
;や&の代わりに||を試しても、同じ結果でした。
>>122
その接続時スクリプト実行機能で、自作スクリプトを実行しようとしているが、
自作スクリプトのexitcode 0を確認しない限り接続が確立されないので、
接続できている前提の自作スクリプトがうまく動かない、という話です。
その後、試行錯誤してうまくいったんですが、
・openvpnの接続時スクリプト1は、別のスクリプト2を&付きで実行してすぐexit 0で終了
・別のスクリプトにやりたい処理を記述、終わったらexit 0
こういう方法でした。
128:デフォルトの名無しさん
19/07/04 14:21:40.05 vxwYTSOB.net
今さらだけどPOSIXでpushdとかって「未定義」なんだな。
つまりこれらの字句が来たとき、pushdコマンドが実行されるかもしれないと想定しなきゃいけない。
129:デフォルトの名無しさん
19/07/04 14:44:38.64 VFVr1rb1.net
>>124
これは?
/path/to/script.sh ; exit 0
130:デフォルトの名無しさん
19/07/04 18:16:12.18 KBMDzr/H.net
俺には >>120 と >>124 でうまくいった方法が同じに思えるのだが何が違ったのだろう...
131:デフォルトの名無しさん
19/07/04 18:44:40.09 Nr3czBjG.net
>>119
more most
nano pico
perl ruby
132:117
19/07/04 18:54:04.40 8CMbGrkR.net
>>126
明日試してみます
>>127
そもそもopenvpn側の判定条件がはっきりしてないので、
シェルスクリプト的には皆さんに教えてもらったのが正解でも
openvpn的にダメってだけかもしれません。
シェルスクリプト的にokならそれでokじゃないはずがない、とは思うんですが。
133:デフォルトの名無しさん
19/07/04 19:05:50.51 zzPJIhEP.net
>>129
openvpnの
--client-connect
か
--route-up
を使えばいい気がする
134:デフォルトの名無しさん
19/07/04 19:30:11.56 gP3HGmG/.net
>>125
もとはcshの機能だからPOSIX策定時は独自拡張だったんだろうな
POSIX準拠のシェルスクリプトではpushd,popd,dirsは使わない
135:デフォルトの名無しさん
19/07/04 19:39:31.79 VX27EPul.net
>>129
スクリプトではなく純粋にコマンドの実行=単に実行ファイルの実行とか
引数の解釈分解もopenvpnでやってるとかかな?であれば、
/bin/sh -c '/path/to/script.sh & true'
とかなんとか。書き方も違うかもしれない(' が必要なのか可能なのか、もしかしたらできないとか)
136:デフォルトの名無しさん
19/07/05 06:22:27.69 CMdnJVDV.net
POSIXユーティリティにネットワーク関連のコマンドが追加される予定ってあるの?
137:デフォルトの名無しさん
19/07/05 10:21:41.11 CMdnJVDV.net
>>128
perlはもともとどういう意味だったんだろうな。
138:デフォルトの名無しさん
19/07/05 10:39:53.85 7D1ht1Ch.net
teeの無理矢理感すき
139:デフォルトの名無しさん
19/07/05 10:46:54.44 /9SntML6.net
>>134
確か pearl って言語が既にあったので perl にしたんだったと思った。
140:デフォルトの名無しさん
19/07/06 03:00:27.30 d8QKOOo3.net
>>135
そういういえばteeのパイプ版のpeeというのもあった。
141:デフォルトの名無しさん
19/07/06 04:11:43.20 O76mcSig.net
きたねぇな
142:デフォルトの名無しさん
19/07/06 04:28:48.13 Db2rLmY3.net
pooとかもあるな
>>140
それはpooh
143:デフォルトの名無しさん
19/07/06 05:18:54.35 d8QKOOo3.net
>>139
それは「pooコマンド」があるってこと?
検索してもネットミームしか引っ掛からんw
144:デフォルトの名無しさん
19/07/06 10:11:41.54 q0MZeBYW.net
URLリンク(codeday.me)
おしっこw
145:デフォルトの名無しさん
19/07/06 10:27:36.00 Qorx3cLN.net
comedyday
146:デフォルトの名無しさん
19/07/06 14:22:39.80 B/itK7pP.net
pingは潜水艦のソナー音
147:デフォルトの名無しさん
19/07/06 16:53:09.35 p445ST1A.net
sosコマンドとかないのかな。
148:デフォルトの名無しさん
19/07/08 08:11:26.31 OnOhhClA.net
tarが入ってない環境なんてあるのかな?
149:デフォルトの名無しさん
19/07/08 08:54:13.07 ny4rr8vT.net
paxコマンド使って、どうぞ
150:デフォルトの名無しさん
19/07/08 08:56:35.94 uRBHZP6h.net
♪IN TERRA PAX~
151:デフォルトの名無しさん
19/07/08 16:03:08.50 u+KjwOdz.net
>>144
sosreport ならある
152:デフォルトの名無しさん
19/07/09 00:44:32.67 hKj+lpg6.net
sexという天文学用のコマンドがある事実
下ネタ満載のmanもあるらしいが
153:デフォルトの名無しさん
19/07/09 08:05:36.87 DRnRn6EV.net
>>149
man woman
とか面白いぞ
154:デフォルトの名無しさん
19/07/09 08:31:28.67 chrBBqpb.net
s式の expression という意味で lisp では
sexp というワードが使われる時が sex ちらつく
シェルスクリプトじゃなくてごめん
155:デフォルトの名無しさん
19/07/09 10:07:15.07 DRnRn6EV.net
$ man co
URLリンク(kazmax.zpp.jp)
156:デフォルトの名無しさん
19/07/10 13:17:47.35 AgLkizrd.net
セマンティックバージョニングの並びで最新のタグを取得するにはどうすればいいの?
sort -Vはposixにはないようなんでなしで。
gitコマンドで(最後に付けたタグではなく)最新のタグが取得できればそれでも良いんだけど
157:デフォルトの名無しさん
19/07/10 13:29:47.61 eZpAq1ko.net
>>153
試してないけどsortの区切りオプションを“.”にして
各桁を数字順に並び換えたら上手いこといきそう。
158:デフォルトの名無しさん
19/07/10 13:46:00.77 AgLkizrd.net
1桁目を並び替えて、それから2桁を並び替えて、それから3桁目を並び替えるってできるんかいな?
できたとしても、1.0.0 よりも 1.0.0-alpha は小さくなって、
1.0.0-alpha と 1.0.0-beta はASCII順で後者のほうが後で、
1.0.0-alpha と 1.0.0-alpha+20190710 は順番が同じなんていうルールが有るわけだけど
159:デフォルトの名無しさん
19/07/10 15:06:48.80 StxWbt+s.net
できたとしても以後がえぐい
160:デフォルトの名無しさん
19/07/10 16:09:18.81 eZpAq1ko.net
素直にsort -V使うのが一番。
POSIXに準拠したければそれなりの実力がないとね。
少なくとも俺には無理w ていうかわざわざ既にある機能を苦労して再発明したくねーw
161:デフォルトの名無しさん
19/07/10 16:15:38.61 6IY0QwqQ.net
つまりどこでも動くシェルスクリプトなんて都市伝説だよね。
162:デフォルトの名無しさん
19/07/10 17:49:00.07 lDiVjXP/.net
世界征服して一つのシェルしか使わないように全世界の人間に強制すれば可能
163:デフォルトの名無しさん
19/07/10 18:31:37.23 8OTK1K8V.net
シェルだけ統一しても無理だな
164:デフォルトの名無しさん
19/07/10 19:54:16.62 eZpAq1ko.net
シェルスクリプトは「完全に」どこでも動くとは限らないけど
他の言語と比べて「ある程度」どこでも動く確率が高い。
165:デフォルトの名無しさん
19/07/10 20:10:25.56 8OTK1K8V.net
確率を言うならデータもってこいよ
どこにあるんだよその統計はw
166:デフォルトの名無しさん
19/07/10 20:36:18.03 j+J/37U2.net
まだやってる。堂々巡りを。四国へ行け
167:デフォルトの名無しさん
19/07/10 20:37:15.39 StxWbt+s.net
それいわれたのC があって perl ができる前の常識でしょ
C よりは確かに移植性ある
168:デフォルトの名無しさん
19/07/10 20:59:14.35 lDiVjXP/.net
Windowsには最初からは入ってないよね?今のは入ってる?
まあ WSL 動かしちゃえば何でもありにはなるが。
169:デフォルトの名無しさん
19/07/10 20:59:47.00 mGyL/3Gj.net
そんなに難しい話じゃなくてshは多くの環境にインストールされてるってだけのことでしょ?
例えばPerlが初期インストールされてるような環境なら
必ずshもインストールされてる。
Perlが入って無くても、shはインストールされてる。
170:デフォルトの名無しさん
19/07/10 21:01:25.84 mGyL/3Gj.net
>>165
Windowsにはshが入ってないけど、
PerlやRubyも入ってない。
shが入ってないならば、○○も入ってないが成り立つ。
171:デフォルトの名無しさん
19/07/10 21:13:36.75 mGyL/3Gj.net
結局の所Windowsとそれ以外のOSに分かれるわけで、
Windowsとそれ以外のOSの両方に入ってる言語はなくて、
Windows以外のOSに入ってる言語で一番多いのはshなんだよね。
172:デフォルトの名無しさん
19/07/10 21:16:39.60 mGyL/3Gj.net
dockerとか使うとわかるけど、最小イメージのalpineには
perもrubyもpythonも入ってないからな
173:デフォルトの名無しさん
19/07/10 21:19:19.80 mGyL/3Gj.net
そういやalpineにはbashですら入ってないのな
174:デフォルトの名無しさん
19/07/10 21:23:57.90 6IdsJob5.net
/\___/\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたはじまった
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\
175:デフォルトの名無しさん
19/07/10 23:46:47.18 8OTK1K8V.net
要はPOSIXは必要最低限の機能しか規格化していないから出来ることには限界があるってことだ
176:デフォルトの名無しさん
19/07/11 04:18:38.14 pY8YHtW/.net
>>168
そうそう。こういうことなんだよ。
177:デフォルトの名無しさん
19/07/11 09:51:44.08 5BkhO8Tf.net
独自にcmdやpowershell持ってるしな
178:デフォルトの名無しさん
19/07/11 10:49:49.47 7babKKNu.net
Windowsにはshが入ってない!
→ かといってじゃあ他の言語が入っているかというと入ってない
Windowsは諦めた。それ以外で最初からOSに入っていてどこでも使える言語はなんだ?
→ sh
179:デフォルトの名無しさん
19/07/11 11:30:36.51 EFuj/0Xm.net
どこでも動くシェルスクリプトって都市伝説だよねw
180:デフォルトの名無しさん
19/07/11 11:35:07.95 nlZoRVuP.net
/\___/\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたはじまった
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\
181:デフォルトの名無しさん
19/07/11 11:39:41.84 bvWe7WiP.net
Javaなら一度書けばどこでも動くのに
182:デフォルトの名無しさん
19/07/11 11:54:59.97 PMWvbDa1.net
まじで?
買ってきたばかりの ノートブック windows でも?
183:デフォルトの名無しさん
19/07/11 12:03:46.60 oBmxbhd/.net
買ってきたばかりの ノートブック windows でも
Perlなら動く!→動きません(笑)
Rubyなら? Pythonなら? C言語なら? NO!!!!
184:デフォルトの名無しさん
19/07/11 12:05:03.00 PMWvbDa1.net
それでも Java なら動く?
185:デフォルトの名無しさん
19/07/11 12:28:30.89 pY8YHtW/.net
PowerShellなら動きます(白目)
186:デフォルトの名無しさん
19/07/11 12:29:45.46 W9yQmyPF.net
Windowsに最初から入ってるのは vbs とか js とか、あとバッチファイルとかパワーシェルかな。よく知らんけど。
HTAってのもあったっけ。
187:デフォルトの名無しさん
19/07/11 12:34:10.09 CgGarxi7.net
powershell考えた奴は頭おかしいんじゃね
なんでいちいちコマンドとかあんな長いんだよ
無能にもほどがある
188:デフォルトの名無しさん
19/07/11 12:50:53.46 At9Pc1xn.net
adduserとuseraddどっちがどっちかたまに使うとき毎回調べるみたいなクソ下らないことしたくないからじゃない?
189:デフォルトの名無しさん
19/07/11 12:57:39.35 oBmxbhd/.net
それをいうなら、Windows、Macで、どの言語でも構わないが
ユーザーを追加する方法を調べないでわかるっていうの?
190:デフォルトの名無しさん
19/07/11 12:58:48.61 l57S3jiM.net
POSIXってUNIX系OSの規格なのに
なんでWindowsの話になってんだよw
191:デフォルトの名無しさん
19/07/11 13:00:17.64 A1tpN7ls.net
>>181
インストールしないで動くのか?
192:デフォルトの名無しさん
19/07/11 13:01:52.25 PMWvbDa1.net
>>188
>Javaなら一度書けばどこでも動くのに
とあったから
Windows は標準でいれてるのかなと
193:デフォルトの名無しさん
19/07/11 13:23:31.79 W9yQmyPF.net
>>189
入れたかったんだけどね・・・
194:デフォルトの名無しさん
19/07/11 14:01:00.83 l57S3jiM.net
Javaはオワコン
195:デフォルトの名無しさん
19/07/11 14:06:11.17 oQkLsXMb.net
javaのコンセプト
write ones, test everywhere
196:デフォルトの名無しさん
19/07/11 14:16:47.27 5J3UX5Vb.net
debug anywhereやろ
197:デフォルトの名無しさん
19/07/11 14:20:46.71 xCkJ5LaR.net
Windows, WSL, Ubuntu16.04 では、Python, Perl は最初から入っている。
Ruby は、apt でインストールした
ls -l /usr/bin/python
/usr/bin/python -> python2.7
ls -l /usr/bin/python3
/usr/bin/python3 -> python3.5
ls -l /usr/bin/perl
/usr/bin/perl
ls -l /usr/bin/ruby
/usr/bin/ruby -> ruby2.3
注意。サーバーエラーになるので、全角に変換した
198:デフォルトの名無しさん
19/07/11 14:59:54.89 3GvBtncU.net
そういえば IBM の z/OS ではどうなっているんだろうと
思ったら z/OS シェルってのがデフォルトでインストール
されてて、こいつは POSIX compliant らしい
199:デフォルトの名無しさん
19/07/11 15:48:04.71 PMWvbDa1.net
それだ WSL が標準で最初から入っているようになると
昔のニュースで見たが、どうなっているの?
標準は取りやめ? Windows の最新情報追ってないからわからない
200:194
19/07/11 16:19:18.53 xCkJ5LaR.net
Windows10 を普通にアップデートしていれば、WSL は、最初から入っている。
ストアから、Ubuntu18.04 (長期サポート版)などをインストールして、日本語化すればよい
漏れはまだ、古いUbuntu16.04 の方を使っているけど
201:デフォルトの名無しさん
19/07/11 18:15:20.64 8iBC56G3.net
>>184
あれは、普段使いのCUIではないからな
単なる開発用
202:デフォルトの名無しさん
19/07/11 18:16:22.72 8iBC56G3.net
>>189
XPは標準で入ってて問題になった
203:デフォルトの名無しさん
19/07/11 18:29:01.43 8iBC56G3.net
個人的には、*nixとWindowsの違いは、
シェルと馴染んだコマンド群の有無、シェルスクリプトの実行可否だけなので、
それさえできれば、どちらでもいいや。
Cygwinはややストレス溜まったけど、WSLはだいぶ快適になった。
204:デフォルトの名無しさん
19/07/12 00:13:06.93 Iwx9PgjW.net
cmdのオプションが/なのは当て付けなんだろうか
XENIXを売ってた頃のMS知らんけど
205:デフォルトの名無しさん
19/07/12 00:38:52.25 hw+u6C0G.net
階層がないファイルシステムだと - でも / でもどっちでも違和感が無いのだろう
単に好みでそれにしたってだけじゃないかな
階層があるようになって / を好みで選んで失敗したと思ったけどどうにもならななかったよう
手立ては用意したがサードパーティがそれを使わないとか
206:デフォルトの名無しさん
19/07/12 00:54:25.43 hw+u6C0G.net
ああ、どうにもならなかったのは、
オプションを/にしてしまったからとりあえずパス区切りはバックスラッシュにしたよ、でも、/ にもできるよ
だった。オプションを - に変えるのは今でも前のいつでもできるだろうな
コマンドによっては別の意味を持たせてとかありそうだが、なんの拘りなんだかよくわからんな
207:デフォルトの名無しさん
19/07/12 08:37:34.85 paORMduQ.net
URLリンク(packages.debian.org)
kshはずっと93uだったはずだが、2020なんてのがでるのか?
208:デフォルトの名無しさん
19/07/12 10:59:03.44 paORMduQ.net
同じPCで一つがWSL1上のUbuntu、もう一つがDocker上のUbuntuで
lsb_release -aしてどちらも同じUbuntu 18.04.2 LTSなのに
kshのシェルに入ってから以下のコマンドを実行すると違いがある
echo $((99999999999999999))
=> 100000000000000000 # WSL
=> 99999999999999999 # Docker
KSV_VERSIONは両方とも同じ Version AJM 93u+ 2012-08-01
カーネル関係なさそうなのに、なんでだろう?
209:デフォルトの名無しさん
19/07/12 11:04:55.32 OtxPhCkg.net
大きな数の取り扱いの限界が違うのかも
210:デフォルトの名無しさん
19/07/12 12:04:33.46 uJ9G3Ton.net
ディレクトリごとの正確なファイル数が高速に知りたいです。
211:デフォルトの名無しさん
19/07/12 12:15:53.93 OtxPhCkg.net
ls より find が早い
再帰ディレクトリ探索とファイル名出力はそれに任せて
その出力をパイプで変換していったらいいんじゃないか?
212:デフォルトの名無しさん
19/07/12 12:22:05.68 gCudY7G9.net
なぜduでファイル数も調べられるようにしなかったのか?
213:デフォルトの名無しさん
19/07/12 12:22:27.56 gCudY7G9.net
duの作者に問い詰めたい
214:デフォルトの名無しさん
19/07/12 12:24:06.88 OtxPhCkg.net
やるべきことは最小限の1つ
UNIXの哲学でしょ
小さいから早い
小さいからパイプでつなげていろいろ実現できる
小さいから保守できる
215:デフォルトの名無しさん
19/07/12 12:27:18.37 gCudY7G9.net
その理屈だと、lsコマンドはファイルの名前だけじゃなくて
ファイルサイズまで表示している。
最小限になってない。findコマンドを見習え
って話になるんだがw
216:デフォルトの名無しさん
19/07/12 12:28:12.53 gpn1wbN7.net
>>209
ファイルを数えるのはduの仕事じゃないから
217:デフォルトの名無しさん
19/07/12 12:30:19.18 gCudY7G9.net
ファイルを数えるのは誰の仕事?
仕事は一番うまくできる人がするべきですよ
218:デフォルトの名無しさん
19/07/12 12:32:27.12 gCudY7G9.net
そういやファイル名に改行が含まれる場合、
POSIX準拠コマンド&オプションだけで数えられるの?
219:デフォルトの名無しさん
19/07/12 12:35:41.89 gCudY7G9.net
やるべきことは最小限っていったら
duコマンドなんていらんよな
findでファイル検索して、lsでファイルの情報出して
awkで加算すれば良い
パイプでつなげていろいろ実現できる
220:デフォルトの名無しさん
19/07/12 12:53:26.46 433S/V3Z.net
>>205
>>206
long doubleを使っているんだと思う。long doubleは昔のx87 fpuで計算されることになるが、これは精度を設定できて、確かデフォルトがlinuxでは80bit、windowsでは64bitになっていたと思う。
221:デフォルトの名無しさん
19/07/12 13:00:19.57 WQ2UtQMj.net
>>217
でもWSL版Ubuntuと通常のUbuntuでバイナリは同じはずでしょ?
FPUモードの設定とかあるってこと?
同じ命令でもモードによって精度が違うとか
222:デフォルトの名無しさん
19/07/12 13:39:06.41 uwyqXnfJ.net
元々、浮動小数点は誤差があるから、どっちでも良い
誤差無しなら、プログラミング言語で、Decimal などのライブラリを使わないといけない
223:デフォルトの名無しさん
19/07/12 13:49:24.26 OtxPhCkg.net
>>212
ls 凄いよね
呼びだした端末の表示限界まで調査して
整列してくれる
最小限だけではものたりないから Emacs とかできたんじゃない?
224:デフォルトの名無しさん
19/07/12 13:57:13.80 q8HbeEfz.net
>>207
$ find 〈対象ディレクトリ〉 -type f | wc -l
225:デフォルトの名無しさん
19/07/12 13:59:45.00 q8HbeEfz.net
bcコマンド使いなよ。POSIXで定められたほとんど唯一といっていい任意精度演算ができるコマンドだぜ。
残念ながらなぜかUbuntuには初期状態で入っていない……。
226:デフォルトの名無しさん
19/07/12 14:11:11.28 OtxPhCkg.net
>>207
find ~/web -type f | perl -pe 's{[^/]+$}{\n}m'|uniq -c
27 /home/web/
11 /home/web/elona/
5 /home/web/elona/.git/
9 /home/web/elona/.git/hooks/
1 /home/web/elona/.git/info/
...
227:デフォルトの名無しさん
19/07/12 14:17:11.58 OtxPhCkg.net
やっぱりシェルスクリプトのパイプやばい
たった1行の短いのでそこそこ早いのが書きあがっちゃう
228:デフォルトの名無しさん
19/07/12 17:35:59.38 greuAEFm.net
>>220
emacsは出自がUnixじゃないから
229:デフォルトの名無しさん
19/07/12 18:42:09.14 q8HbeEfz.net
ちなみにPlan 9(Unixの後釜)のlsはもっと洗練された体系になってる。
あとPlan 9のEmacsの手引書がおもしろい
230:デフォルトの名無しさん
19/07/12 19:16:50.62 13weq3zY.net
Plan 9の今後のプランは!?
231:デフォルトの名無しさん
19/07/12 19:39:49.25 gpn1wbN7.net
Plan 9も最初からGPLで公開していればLinuxと肩を並べてたかもね
232:デフォルトの名無しさん
19/07/12 20:39:39.59 fylm51D9.net
>>218
FPU制御レジスタをFLDCW命令で変更すると計算精度や丸め方向が設定でき、同じ命令でも動作が変わる
プログラムが明示的に設定しなければ、当然OSが設定した値になる
233:デフォルトの名無しさん
19/07/13 10:28:41.44 H4ToI7wx.net
>>223
こういうの見るといつも思うんだけど、全部Perl(など)で全部完結して書くのとどっちがいいのかな?
殊に「高速で」条件があるなら。
234:デフォルトの名無しさん
19/07/13 10:36:29.63 006l8Xk5.net
>>230
パイプ有利でしょ
なぜなら perl は C の 10% 程の速度
シェルスクリプトの基本ツールは C で書かれているから早い
そしてパイプは並列プログラミングだ
235:デフォルトの名無しさん
19/07/13 10:51:01.49 Q8eoyE6C.net
並列「プログラミング」ではないな
単に仕組みとしてプロセスが同時並行しているだけで
236:デフォルトの名無しさん
19/07/13 13:12:58.10 PcwCdG6p.net
>>230
どうでもいいけど
>>223は基本的なコマンドで完結してるシェルスクリプトなので
Perlで「全部完結する」というのは対比する表現としてはちょっとおかしく思えるな
237:デフォルトの名無しさん
19/07/13 14:39:07.51 4CNtNVmB.net
単機能のコマンドを組み合わせて処理するのがシェルスクリプトだからな
それで速度が遅いだの言うならシェルスクリプトなんか使わなければいい
238:デフォルトの名無しさん
19/07/13 16:01:43.14 Lat3oh38.net
>>223
uniq -cの前にsortしなくていいの?
239:デフォルトの名無しさん
19/07/13 16:32:06.44 006l8Xk5.net
>>235
別のところで動かしたらだめだったよ
sort 必要
240:デフォルトの名無しさん
19/07/13 16:34:17.14 006l8Xk5.net
ソートはたぶん早くないから
つまりコストが高いから
たぶん定番のあれやったほうがいい
1行ずつ読みこんだそれでハッシュ作って インクリメントしてくあれ
241:デフォルトの名無しさん
19/07/13 18:44:37.37 Wy302ne8.net
実はPOSIX sortならsort -uでuniq | sortと同等ことができるのでuniqは実質要らない子
242:デフォルトの名無しさん
19/07/13 19:00:08.87 Q8eoyE6C.net
uniqは重複したのを抽出する目的での利用が多いな
純粋にuniqで使う機会の方が極端に少ない
243:デフォルトの名無しさん
19/07/13 19:23:10.38 56OavmE8.net
uniq | sortって使い方分かってない奴かよw
uniqくらいソース読んでみなよ
244:デフォルトの名無しさん
19/07/13 19:38:16.75 Wy302ne8.net
>>240
そんな揚げ足取らんでも。。。
sort | uniqの間違いです。
245:デフォルトの名無しさん
19/07/13 20:35:19.67 yaak8A3v.net
ls .-lのrwxに8進数表記も追加できないかな
246:デフォルトの名無しさん
19/07/13 22:25:11.39 h6vp2MpA.net
こんな感じかな
URLリンク(wandbox.org)
# スクリプトを直接書いて投稿すると 403 エラーになるな…
247:デフォルトの名無しさん
19/07/13 22:28:56.59 h6vp2MpA.net
あ、setuid/setgid/sticky bit のこと忘れてたわ
248:デフォルトの名無しさん
19/07/13 22:47:31.71 YCgasS9+.net
find ~TEST -type f -printf "%h\n" |sort |uniq -c
これは早いわ
249:デフォルトの名無しさん
19/07/13 23:30:54.16 yaak8A3v.net
duのファイル版は俺も作ったけど未熟なんでこんな出来に
find ./ -type d -printf "%p " -exec bash -c 'ls -b "{}" | wc -l' \; | sed -r 's/(.* )(\w+)/\2\t\1/g'
250:デフォルトの名無しさん
19/07/13 23:43:20.86 PcwCdG6p.net
>>246
見易くていいね!
251:デフォルトの名無しさん
19/07/14 00:22:33.01 KitiOp9Q.net
>>244
URLリンク(stackoverflow.com)
awkで頑張れば4桁表示できるらしい
252:デフォルトの名無しさん
19/07/14 02:01:57.73 ygf6VvPi.net
>>207
Ruby の、1-liner で、特定のディレクトリ以下を再帰的にたどりながら(find)、
ディレクトリ以外(reject)を表示する。
%Q("~") は、" を、Windows のPowerShell に解釈させないために、クォートする
-r で、pathname モジュールを読み込む
ただし、途中で改行しているけど、実際には改行しないで下さい!
ruby -rpathname -e 'Pathname( %Q("C:/Users/Owner/Documents/Ruby/test") ).find
{ |path| if File.directory?( path ) then; puts path, path.children.reject( &:directory? ).length end; }'
253: 出力 C:/Users/Owner/Documents/Ruby/test 11 C:/Users/Owner/Documents/Ruby/test/a 4 C:/Users/Owner/Documents/Ruby/test/a/b 0
254:デフォルトの名無しさん
19/07/14 06:45:35.11 GSQZGuhE.net
stat -c '%A %U %G %z %n' .*
↑こういうのどう? lsのパーミッション表示を8進数に
�
255:ワあPOSIXに規定されてないけど
256:デフォルトの名無しさん
19/07/14 10:08:35.55 niuQOGKU.net
>>245
sort を差し替えた
~/ 対象にしたら倍速
find ~/ -type f -printf "%h\n" | perl -ne '$dirs{$_} += 1; END{for $key (keys %dirs) {printf "%5s %s", $dirs{$key}, $key } }'
257:デフォルトの名無しさん
19/07/14 10:11:35.12 niuQOGKU.net
途中だった
最後に | sort -k 2,2 入れても入れなくてもあまり変わらない
やはり指数関数的にsort に大量渡すと遅くなる
258:デフォルトの名無しさん
19/07/14 12:30:16.97 GSQZGuhE.net
LANG=Cでやってみ。
259:デフォルトの名無しさん
19/07/14 13:29:14.61 VYOKuUQn.net
POSIX の find って -printf がないのな。
難しいことは -exec でなんとかしろということか。
260:デフォルトの名無しさん
19/07/14 13:32:10.29 VYOKuUQn.net
>>252
perl の中で sort やれば良いのでは?
sort keys %dirs にして。
261:デフォルトの名無しさん
19/07/14 14:08:00.15 Vo3Tn1vW.net
Perlようわからんけど、findのところもまとめていわゆるVisitorパターンでやると?
シェルだと時間掛かる。
#!/bin/bash
shopt -s dotglob
walk() {
local c=0
for p in "$1"/*; do
if [ -d "$p" ]; then
walk "$p" # recursive call
elif [ -f "$p" ]; then
((c++))
fi
done
echo "$1: $c"
}
start_dir=$(basename "$1")
walk "$start_dir"
262:デフォルトの名無しさん
19/07/14 14:15:10.09 niuQOGKU.net
>>255
そうだね
さらにちょっと早くなった
263:デフォルトの名無しさん
19/07/14 15:14:56.46 GSQZGuhE.net
どうせPerl使うんならPerlに用意されているfindコマンド的な関数使えばいいのに。
いや正直Perl書けないので外部コマンドのほうが効率いいのかも知れんけど
264:デフォルトの名無しさん
19/07/14 15:43:17.08 niuQOGKU.net
今回たまたま perl が早かったのは
>237
ということ
つまり C は10倍ぐらい早いけど
何十倍も無駄なことやってたら遅くなってしまう
高速な find の出力を |sort |uniq -c したら一応答えでるけど
そのsort がウルトラ処理多い
だったらperl で1行ずつ読んで正しいアルゴリズムで処理したほうが早いだけ
265:デフォルトの名無しさん
19/07/14 16:48:51.97 XOVWGW1L.net
perlでソートしてないから
266:デフォルトの名無しさん
19/07/14 19:10:07.29 BEvjoRaR.net
なんだperlでソートしたら遅いのか
267:デフォルトの名無しさん
19/07/14 19:11:22.06 AAGaqnKC.net
>>227
Plan無いん
268:227
19/07/14 20:00:20.57 QmWR+pGh.net
>>262
GJ!
269:デフォルトの名無しさん
19/07/14 20:02:48.24 XOVWGW1L.net
awk版。ディレクトリ名でソートするなら sort -k2
find . -type f -exec dirname {} + | awk '{c[$0]++}END{for(i in c){printf"%4d %s\n",c[i],i}}' | sort
270:デフォルトの名無しさん
19/07/14 20:08:54.86 XOVWGW1L.net
xargs使ったほうが良いかな
find . -type f | xargs dirname | awk '{c[$0]++}END{for(i in c){printf"%4d %s\n",c[i],i}}' | sort
271:デフォルトの名無しさん
19/07/15 08:12:50.57 jP+0UVPX.net
どうせなら計測結果も付記してくれよ
272:デフォルトの名無しさん
19/07/15 10:56:15.79 Ww8nr7y5.net
やってることが同じなら、Perlとawkは比較するまでもないのでは?
273:デフォルトの名無しさん
19/07/15 12:22:56.47 E9YINa1F.net
数分で書けるのがシェルスクリプトの良いところなんだし
数百万のファイルを何分以内で処理せよとか性能要件があるなら
そもそもシェルスクリプトなんかで書かないわ
274:デフォルトの名無しさん
19/07/15 15:08:49.68 3UWFYY1V.net
高速化するならC言語使うな。
275:デフォルトの名無しさん
19/07/15 16:42:34.21 jP+0UVPX.net
なんかシェルスクリプトを貶す人間ってシェルスクリプトを本来の目的とは違う方法で使った結果失敗して
その恨みを自分の無能さではなくシェルスクリプトにぶつけてる印象。
276:デフォルトの名無しさん
19/07/15 16:46:57.72 tvlJQJn9.net
このパーツは意外と頻度多いからCで書いておいてもいいかもね
| perl -ne '$dirs{$_} += 1; END{for $key (sort keys %dirs) {printf "%5s %s", $dirs{$key}, $key } }'
277:デフォルトの名無しさん
19/07/15 19:25:46.44 jP+0UVPX.net
端末の応答(例えば$ printf '\e]11;?\e\\'で返ってくる\e]11;rgb:〈赤〉/〈緑〉/〈青〉\e\\っていう文字列)を
sedやらなにやらで加工できるように標準出力に流したいんだど
そのままの状態だと端末そのものに文字列が渡ってしまって加工できない。
$ printf '\e]11;?\e\\' | od
みたいにすると(当然だけど)\e]11;?\e\\という文字列がパイプを通ってしまう。
個人的にはsttyとかをうまくやりくりしたらいけそうな気もするのだけど
そういう文書や記事がないのと俺があまり端末の処理に詳しくないのとで今のところ成功していない。
端末応答を標準出力として処理できる方法知らないですかね。
278:デフォルトの名無しさん
19/07/15 19:47:51.35 iDG/5azN.net
>>272
色というものが何者かわかってないんじゃね?
色を付けるためのエスケープシーケンスっていうのは、
エスケープ文字、ASCIIコード表でESC(0x1B)の文字8進数だと033
ESC文字から始まる一連の文字列の流れ(シーケンス)ってだけだよ
だから0x1Bで始まるその文字列を加工すりゃ良い。
\e]11;の ]11;は単なる文字だけど、\eは(シェルによりけりだが)
0x1Bの文字に置き換わる。だからsedなんかで\eを見つけようとしてもだめ
そんな文字列は流れてこないんだから
279:デフォルトの名無しさん
19/07/15 19:59:18.87 jP+0UVPX.net
>>273
あー。いやそうじゃなくて 端末の応答を取得したいんよ。
試しに
$ printf '\e]11;?\e\\'
ってやってみて。多分端末の上に
^[]11;rgb:0c0c/0c0c/0c0c^[\
みたいな文字列が表われる。
この文字列をtestコマンドの対象にしたりしたい。
でも普通の方法ではこの文字列は標準出力ではなく端末の上に直接出力されてるから
そういう加工ができない。
280:デフォルトの名無しさん
19/07/15 20:00:57.13 iDG/5azN.net
>>274
話の内容を単純化しよう。
文字の内容は今どうでもいい話だろ?
printf 'hogehoge' ってやってみたら
端末の上に、hogehoge って表示されるな?
それでこの文字列をどうしたいって?
281:デフォルトの名無しさん
19/07/15 20:20:16.67 f1G4msuO.net
わかってない奴が話に絡んでいくなよ
文字列なんか関係ない
奴はttyの出力(もしくは入力)を横取りしてパスワードを盗みたいという話をしてる
282:デフォルトの名無しさん
19/07/15 20:21:36.85 iDG/5azN.net
$ printf '\e]11;?\e\\' の話だろ?
283:デフォルトの名無しさん
19/07/15 21:13:36.27 f1G4msuO.net
ぜんぜん違う
284:デフォルトの名無しさん
19/07/15 21:15:41.25 iDG/5azN.net
>>278
試しに
$ printf '\e]11;?\e\\'
ってやってみて。
285:デフォルトの名無しさん
19/07/15 21:21:51.85 qldwvqW5.net
>>276
パスワードだとしたら、出力には返ってこないから横取りもできないんじゃね
パスワード生で出力するようなアレでなければ
286:デフォルトの名無しさん
19/07/15 21:35:01.81 f1G4msuO.net
>>280
だから入力って書いたじゃん
エコーバックやめるタイミングを捕まえて入力側をだな
まあいいや、俺も答え知らないしw
287:デフォルトの名無しさん
19/07/15 21:42:13.41 qldwvqW5.net
>>274
そういうのが出る Terminalアプリ もあるし出ないのもある
Terminalアプリが出しているんでしょ、その エスケープシーケンスを Terminalの画面制御 のために
Terminalアプリの作りによるんじゃないかなあ、また、Terminalアプリで何か提供してなきゃダメなんじゃないかなあ
>281
そもそもは出力をだから出力で入力をは無理だな。
288:エコーバックは今時はローカルではしてないんじゃね、パスワードを生で表示だろしw
289:デフォルトの名無しさん
19/07/15 22:20:41.82 qldwvqW5.net
なんのエスケープシーケンスなのか知らずにだったが、OSC Operating System Commandつうのね。で、制御ではなくてリポート(情報)なのね
Teminalアプリは、それを相手(シェルプログラム)への入力として出力しているのでできそうか
290:デフォルトの名無しさん
19/07/15 22:24:08.87 EBIcrGzb.net
ls結果をテキストエディタで開いた時[0mだらけで焦った思い出
ANSIカラーコードって正規表現で消せるのかしら
291:デフォルトの名無しさん
19/07/15 22:38:58.41 tvlJQJn9.net
消してみた
ほぼ消えたといって問題ないのでは?
URLリンク(i.imgur.com)
292:デフォルトの名無しさん
19/07/15 22:54:17.82 qldwvqW5.net
>>274
#!/bin/bash
result=''
printf '\e]11;?\e\\'
while read -s -N 1 -t 0.2 char
do
result="$result$char"
done
printf "%s" "$result" > hoge
試行錯誤中だけど、こんなんで取れてる
293:デフォルトの名無しさん
19/07/15 22:55:24.82 jP+0UVPX.net
>>275
その文字列はパイプで処理できるじゃん。
例えば
$ printf 'hogehoge' | sed -e 's/hoge/fuga/'
でも端末応答の文字列はそういう処理ができないのよ。
試してみると分かる。
294:デフォルトの名無しさん
19/07/15 22:59:10.56 jP+0UVPX.net
>>286
すげえ!ありがとう!
なるほどなぁ。readコマンドで対処するのか……。
全然文字列が取得できなくて悩んでたからマジで助かったわ。
295:デフォルトの名無しさん
19/07/16 01:24:24.20 b8YViJ87.net
こんな感じかなぁ
$ stty -echo;printf '\e]11;?\e\\'; IFS=';' read -r -d '\' _ bgcolor;stty echo
$ echo $bgcolor
rgb:3232/3232/3232
296:デフォルトの名無しさん
19/07/16 01:27:52.36 b8YViJ87.net
あ、尻尾に ESC(0x1b) が付いてるから適当に削ってちょ
297:デフォルトの名無しさん
19/07/16 02:07:13.54 6ZdisLnD.net
>>290
末尾のESC \は端末が返す文字列の仕様だから問題ないと思う。
というか応答の形式が
ESC ] 11;rgb/3232/3232/3232 ESC \
↑こういう感じ。
298:デフォルトの名無しさん
19/07/16 16:37:09.91 6ZdisLnD.net
シェルスクリプトでラムダ計算を実装するとしたらどんなインターフェースがいいんだろう。
lambda -x @ 'echo @ | tr "[A-Z]" "[a-z]"'
でもこれだとこの後に適用したい変数を持って来たときにlambdaコマンドの引数と見分けがつかなくなる…。
299:デフォルトの名無しさん
19/07/16 16:40:13.19 cpfSTA9t.net
パイプつなげるのが普通だから
xargs とか
なんか {} みたいなのでこれまでのパイプの流れてきたのを表現する
コマンドがあったからそれでいいんじゃないか?
300:デフォルトの名無しさん
19/07/16 16:55:42.40 zaQ9s3Gk.net
>>292
何が問題なのかわからんけど、
1. ラムダ計算だとしてlambdaコマンドに引数なんているの?
2. 'echo なんたら' の前がlambdaコマンド引数、後ろがechoの引数でいいだろ?
3. 'echo なんたら' で区切れない場合、-- で区切るのがよくある実装方法
って言っておくよ
301:デフォルトの名無しさん
19/07/16 17:34:51.11 6ZdisLnD.net
>>293
そうそう。xargsみたいなのを妄想してるw
302:デフォルトの名無しさん
19/07/16 19:39:35.56 6ZdisLnD.net
>>294
例えばPython3のラムダ計算だと
(lambda x: x * x)(3)
みたいな形式じゃん。
キーワードlambdaをコマンド
変数宣言x:を、どんな変数を扱うかというオプション
(xargsで言う-I)
演算本体のx * xは被演算子
としてみた。
303:デフォルトの名無しさん
19/07/17 23:26:41.26 ySrAQEz0.net
このラムダ計算は偽物だ。食べられないよ。
また明日来てください。僕が本当のラムダ計算をお見せしますよ。
304:デフォルトの名無しさん
19/07/17 23:47:22.37 ycSiezB+.net
このラムダは食べられないよ。ラムダこりゃ~
305:デフォルトの名無しさん
19/07/17 23:56:54.05 Lq1+nMLH.net
>>297
楽しみにしております ^ ^;
306:デフォルトの名無しさん
19/07/18 11:57:22.02 BkvY1rKv.net
>>297
本物のラムダ計算はよ。
307:デフォルトの名無しさん
19/07/18 11:58:54.05 832IkKkF.net
いくら待ってもムラダ。
308:デフォルトの名無しさん
19/07/18 14:21:32.04 BkvY1rKv.net
なんだ虚勢だったのか。
309:デフォルトの名無しさん
19/07/18 17:02:47.87 ugDCzjFC.net
シェルスクリプトでラムダ式ってどんな場面で便利なの?
普通に関数定義すれば事足りると思うんだけどな
310:デフォルトの名無しさん
19/07/18 17:23:35.77 vfPv5uwZ.net
URLリンク(www.sejuku.net)
> #lambda式を使わずに通常の関数を用いる場合
> def func(price,tax):
> return price + (price * tax)
>
> payment1 = func(100,0.08)
> print(payment1)
>
> #lambda式を用いる場合
> print((lambda price,tax:price + (price * tax))(100,0.08))
よくわからんのでコレをサンプル。
price?tax? シェルスクリプトにとって引数とは$1, $2,・・・固定なんだよな。省略かな?w
echo "$(lambda '$1 + ($1 * $2)' 100 0.08)"
イメージ的にはこんな感じか。少数の計算があるんでbc使わなきゃいけないので動くように直すと
lambda() {
formula="$1"
shift
echo "$(eval "$formula")"
}
echo "$(lambda 'echo "$1 + ($1 * $2)" | bc' 100 0.08)"
一発で普通に動いたわw
シェルスクリプトにとって戻り値=出力なんでこうかけるし、
あとbcの使いづらいのをどうにかすればこんな感じでかけるだろう
lambda 'calc "$1 + ($1 * $2)"' 100 0.08
311:デフォルトの名無しさん
19/07/18 17:25:39.32 Nv4mVpEC.net
bash の mapfile にある callback みたいなもん?
312:デフォルトの名無しさん
19/07/18 19:06:15.61 ugDCzjFC.net
数値計算ならbcに直接渡すし
文字列を加工するラムダ式はbcで処理できないし
必要性を感じたことないんだよね
313:デフォルトの名無しさん
19/07/18 19:08:03.03 BkvY1rKv.net
>>304
すごいけど
数値計算に限定されるのが残念な仕様だね。
314:デフォルトの名無しさん
19/07/18 19:17:03.16 DPDlMznj.net
>>307
へ?数値計算に限定するならもっとシンプルに書けるよ
これだけにできる
lambda '$1 + ($1 * $2)"' 100 0.08
数値計算に限定してないから呼び出し側にechoとかbcが埋め込まれてるんだけど?
315:デフォルトの名無しさん
19/07/18 19:21:15.11 DPDlMznj.net
lambda関数は>>304のままで小文字を大文字にする例
lambda 'echo "$1" | tr "a-z" "A-Z"' abc
316:デフォルトの名無しさん
19/07/18 19:28:37.52 DPDlMznj.net
ラムダで用いる計算式は通常短くなるから、
$1, $2 であっても分かりづらくなることはないだろうが
もともとの人は変数をどうすべきかって言ってたから書くと
lambda 'calc "$1 + ($1 * $2)"' 100 0.08
は
lambda v1 v2 -- 'calc "$v1 + ($v1 * $v2)"' 100 0.08
ってやろうと思えばやれる。変数に入れてからevalすればいいだけだから
それが>>294で書いたこと。--で区切るのが面倒だと思えばこういう書き方もありだろう
lambda v1:v2 'calc "$v1 + ($v1 * $v2)"' 100 0.08
第一引数が:で区切られた変数名、第二引数が計算式、残りが引数と簡単に見分けられる
317:デフォルトの名無しさん
19/07/18 19:41:15.10 DPDlMznj.net
数値限定で引数全てに計算式を適用して返す例(笑)
map() {
formula="$1"
shift
while [ $# -gt 0 ]; do
eval "echo \$(($formula))"
shift
done
}
map '$1 * $1' 1 2 3
318:デフォルトの名無しさん
19/07/18 19:53:59.13 ugDCzjFC.net
書き方が煩雑になるだけでメリットないんじゃね
やりたいこと素直に書けばいいじゃんって思ってしまう
319:デフォルトの名無しさん
19/07/18 19:54:42.45 DPDlMznj.net
まあ、それはラムダ計算そのものが言われていることだからw
シェルスクリプトの話ではないね。
320:デフォルトの名無しさん
19/07/18 20:0
321:3:10.85 ID:ugDCzjFC.net
322:デフォルトの名無しさん
19/07/18 20:09:12.09 DPDlMznj.net
簡潔に書けてるよw
map '$1 * $1' 1 2 3
ただ違うのはシェルスクリプトにはそれようのライブラリがないだけ
ここで例示したようなmapみたいなライブラリ集ができたら
もっと便利になると思う
323:デフォルトの名無しさん
19/07/18 20:15:16.65 DPDlMznj.net
というか、普通の言語のラムダ式だと、こんな感じで変数が出てくるけど
lambda a, b : a + b
引数名が$1, $2と数字固定だから変数宣言が不要になるんだよな
lambda a, b : a + b がシェルスクリプトだと
lambda '$1 + $2' だけになっちゃう
i = (lambda a, b: a + b)(1, 2) はシェルスクリプトだと
i=$(lambda '$1 + $2' 1 2) こうなる
324:デフォルトの名無しさん
19/07/18 20:17:43.55 ugDCzjFC.net
クロージャの概念がないシェルスクリプトは
ラムダ式の真価を発揮する場面は無いだろうね
325:デフォルトの名無しさん
19/07/18 20:22:14.60 DPDlMznj.net
無いっていうのは出来ないんじゃなくて
用意されてないって意味だけどな
実はPOSIX標準でも一つだけクロージャーが使われてる。
それがtrap
trap 'echo trapped; exit 1' INT
みたいな書き方ができる
326:デフォルトの名無しさん
19/07/18 20:55:40.78 BkvY1rKv.net
ていうか(ほぼ暴論だけど)シェルスクリプトだってオブジェクト思考っぽいことはできる訳だし
単に「向いている処理」「向いていない処理」があるってだけ。
シェルスクリプトでラムダ式は書けるけど、シェルスクリプトはラムダ式を扱うのには向いていない。
327:デフォルトの名無しさん
19/07/18 21:16:40.14 DPDlMznj.net
そんな難しく考えるなよw
trapの例もあるんだし、使うのが適切な場合に使えば良いいんだよ
328:デフォルトの名無しさん
19/07/18 21:28:25.20 KBi6m+gV.net
map は意外と使い道がないんだよな
lisp 以外では意外と実装されていない
329:デフォルトの名無しさん
19/07/18 21:33:57.01 DPDlMznj.net
実装されてない言語のほうが珍しいだろw
330:デフォルトの名無しさん
19/07/18 21:36:48.83 DPDlMznj.net
mapがある言語
Python、Ruby、Perl、JavaScript、C#(LINQのSelect)
思いついたものだけ
331:デフォルトの名無しさん
19/07/18 21:42:27.79 ugDCzjFC.net
trapってただのイベントハンドラだよ
引数渡したり戻り値受け取ったりできないじゃん
332:デフォルトの名無しさん
19/07/18 21:52:45.54 DPDlMznj.net
trapはイベントハンドラじゃない。
シグナルに対してイベントハンドラを設定するもの
引き数渡したり戻り値受け取ったり出来ないのは
trapの制限であってイベントハンドラの制限じゃない
333:デフォルトの名無しさん
19/07/18 22:00:05.94 ugDCzjFC.net
言いたいのはクロージャの話してるのにtrap 持ってくるのは筋違いってことだ
334:デフォルトの名無しさん
19/07/18 22:03:45.58 DPDlMznj.net
別に筋違いでもない。戻り値は(標準)出力と上で書いたが、
trapで出力したものは画面に表示される。
335:デフォルトの名無しさん
19/07/18 23:59:39.80 SGv/emwF.net
「mapは意外と使い道がない!lisp以外では意外と実装されていない!!(キリッ」
336:デフォルトの名無しさん
19/07/19 01:30:43.88 /UdqfCLD.net
正直>>321のmapの話は無知だなと思ったけど(めちゃめちゃ実装言語があるので)
そうやって煽ることしかできない君より100万倍有意義な発言だったよ。
337:デフォルトの名無しさん
19/07/19 01:49:27.68 7Hdy7m6i.net
>>323
Kotlin もよろしく
338:デフォルトの名無しさん
19/07/19 02:44:48.56 ApXEphk2.net
map 縛ると高階関数で書きにくい
339:デフォルトの名無しさん
19/07/19 08:55:46.76 MqWaI42B.net
>>329
本人乙。
勉強になったなw
次からはあんま調子乗らないよう気を付けろよ?ww
340:デフォルトの名無しさん
19/07/19 09:10:54.61 mIHotaYe.net
第13話 本物のラムダ計算(完)
341:デフォルトの名無しさん
19/07/19 10:16:54.74 uab/wKdg.net
Cだとqsort()とかがラムダになるのかな。
342:デフォルトの名無しさん
19/07/19 10:47:40.54 pw5qcQRZ.net
map が有効な例はどんな時?
343:デフォルトの名無しさん
19/07/19 11:16:36.30 ApXEphk2.net
集合XからYに写像を持つ関数fがあれば
Y = f(X) と
344:書ける これを満たす x, yは y = f(x) で表わせる 数学だとこんなかんじだが プログラムなら Y = map f X のような感じでいっきに変換できる map 使わないで、古典的なループを書くと for my $x (@X) {push @Y, &f(x)} のような具合になるが、x, push など本来不要な変数や操作を中継するため コードが肥大化する
345:デフォルトの名無しさん
19/07/19 11:33:07.63 /UdqfCLD.net
>>332
いや俺>>321じゃないけど…w
346:デフォルトの名無しさん
19/07/19 11:37:49.93 /UdqfCLD.net
>>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の後半に続く。
347:デフォルトの名無しさん
19/07/19 11:47:33.02 /UdqfCLD.net
>>316
たしかにそう言われるとシェルスクリプトのほうが
短かいっちゃ短かいな。
変数名が固定されることが有利に働くとは。
348:デフォルトの名無しさん
19/07/19 12:35:59.70 mIHotaYe.net
>>339
perlのsortの場合、$a、$b固定になってる
URLリンク(perldoc.jp)
my @articles = sort {$a cmp $b} @files;
perlの場合、関数の引数は$_[0]、$_[1]で取れるのだが
そうすると、sortの外の$_[0]、$_[1]になってしまう。
文字列にしてevalしちゃえば同じことはできると思うがそれでも長くなっちゃうしな。
my @articles = sort '$_[0] cmp$_[1]' @files;
このために$a、$bをグローバル変数としているようだが、Perlはダイナミックスコープを
使えるからローカル変数にできるんじゃないかな? 互換性のためにそうなっているのかも
349:デフォルトの名無しさん
19/07/19 14:53:58.91 pw5qcQRZ.net
>>336
一気に変換できるとありがたい例が
具体的に思いつかないのですか
350:デフォルトの名無しさん
19/07/19 15:35:22.89 uab/wKdg.net
>>341
有り難いと言うか、記述が短くなったり、余計な変数を使わなくてよくなったり、連結して書けて分かりやすくなったりという利点があるかな。
351:デフォルトの名無しさん
19/07/19 15:43:06.00 ApXEphk2.net
>>341
集合を扱うのに適した型がない言語、perl などを例にすると
後ろの方を見るのに時間がかかる大きなリスト素早く参照するハックとして
>271
のようにハッシュに打ちこむ手法がある
シェルスクリプトのワンライナーだと1行ずつ入ってくるけど
perl コード内なら簡潔に書けるし、たぶん map の部分が C で書かれてて
速度が出ることが覆い
このタイプの高速な手法としてはシュワルツ変換が有名
|sort -k 2,2
に相当するやつ
352:デフォルトの名無しさん
19/07/19 16:04:19.10 S0JoFjeS.net
>>340
心配しなくてもその $a と $b はダイナミックスコープなローカル変数だよ。
レキシカルスコープでなければローカル変数じゃないという意見もあろうが。
353:デフォルトの名無しさん
19/07/19 17:47:07.68 mIHotaYe.net
>>344
リンク先にはグローバルって書いてある。
下の方にごちゃごちゃ書いてあるけど、ちょっと今読みたくないやw
354:デフォルトの名無しさん
19/07/19 19:32:30.99 LTHpRmEj.net
ていうかシェルスクリプトの関数って(少なくともPOSIXの範囲では)広域定義で
システムのコマンドと同じ名前空間(名前空間なんて一つしかないけど)で定義するしかない。
だからラムダ式に代表される無名関数は寧ろシェルスクリプトのような言語で重宝するかも知れない。
でも可読性や保守性を考えると一般的でない書き方なので多用は控えたほうがいいかな。
355:デフォルトの名無しさん
19/07/20 02:10:15.33 RMeQOh+3.net
>>345
もちろんそのリンク先に書いてある。……下から 21 行目に。(空行を除く)
356:デフォルトの名無しさん
19/07/23 15:21:00.97 vatz3/hX.net
シェルスクリプトで引数が整数であることを判定する可搬で高速な方法ってなんだろう
思い付いたのは
isint() {
case "$1" in
[0-9][0-9]*) printf '%d\n' $1 ;;
*) return 22 ;;
esac
}
…ところで$1がないときは標準入力から値を取得するっていう操作ってどう実装するんだろう?
357:デフォルトの名無しさん
19/07/23 15:29:05.59 +7TCISw6.net
>>348
標準入力かどうかは
けっこうシェルスクリプトとperlは同じような書き方する部分があるから
こんな構文がありそうだ
URLリンク(pastebin.com)
あとそれだと負の数が抜けてる。数字の前に マイナス記号がついている可能性がある
358:デフォルトの名無しさん
19/07/23 15:31:44.56 ecacfG7E.net
case $1 in # $1にダブルクォートはいらない
*[!0-9]* ) ;; # 数字以外が含まれている = 整数ではない
*) ;; # それ以外 = 整数である
esac
if [ $# -eq 0 ]; then
read -r data
else
data=$1
fi
とかいろいろ
359:デフォルトの名無しさん
19/07/23 15:32:56.13 ecacfG7E.net
> 数字の前に マイナス記号がついている可能性がある
case ${1#-} in
こうすればよい
360:デフォルトの名無しさん
19/07/23 15:36:47.54 ecacfG7E.net
$1があるかどうかじゃなくて、echoなどで流し込まれているかどうかなら
if [ -t 0 ]; then
# 流し込まれてなどいない
else
# 流し込まれている
fi
361:デフォルトの名無しさん
19/07/23 15:43:42.61 ecacfG7E.net
所で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
とか書けるよ
362:デフォルトの名無しさん
19/07/23 15:47:46.96 ecacfG7E.net
> 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; }
363:デフォルトの名無しさん
19/07/23 15:50:04.40 ecacfG7E.net
あ、空文字のときにintになるね。こうすればよい
isint() { case $1 in ''|*[!0-9]*) false; esac; }
364:デフォルトの名無しさん
19/07/23 15:50:25.78 h7ECSrMt.net
expr "$1" + 0 >/dev/null 2>&1
echo $?
というのもありかと思ったけど、MAXINT(2^32or2^64)以上になると
エラーになる(exit status 3)からダメか
365:348
19/07/23 16:11:28.72 vatz3/hX.net
みなさんありがとうございます。
↓助言を参考にさしてもらってこういう形にしました。
isint() { set -- "$1"
case ${1#-} in
''|*[!0-9]*) return 22 ;;
*) true ;;
esac
}
「$1が設定されていなければ標準入力を$1に」というのはシェルスクリプトでは
実現が難しそうなので諦めます。
366:デフォルトの名無しさん
19/07/23 16:12:19.43 ecacfG7E.net
if case $1 in *[!0-9]*) false; esac; then
echo int
fi
こっちのほうが短いかw
case $1 in *[!0-9]*) :;; *)
echo int
esac
367:348
19/07/23 16:15:37.53 vatz3/hX.net
……と思いましたが良い感じの構文を思い付きました。
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.
(URLリンク(pubs.opengroup.org))
に従って標準入力が読み込まれてset -- 〈標準入力の内容〉となって$1に標準入力が設定される。
368:デフォルトの名無しさん
19/07/23 16:15:43.02 ecacfG7E.net
trueはさっき俺が書いたけど、別にいらない
isint() { set -- "$1"
case ${1#-} in
''|*[!0-9]*) return 22
esac
}
> 「$1が設定されていなければ標準入力を$1に」というのはシェルスクリプトでは
こっちも書いたはずだが? cat "$1" or cat "/dev/stdin" の話でもしてたのか?
369:デフォルトの名無しさん
19/07/23 16:16:28.44 ecacfG7E.net
cat呼び出しは遅いから、read使ったんだが?
370:デフォルトの名無しさん
19/07/23 17:17:45.59 vatz3/hX.net
>>361
申し訳ないです。完全に見落してました。
371:デフォルトの名無しさん
19/07/23 23:34:58.45 JEktaXSk.net
npmでシェルスクリプトだけのパッケージを配布してもOKですか?
372:デフォルトの名無しさん
19/07/24 01:15:44.75 ArGZw8p9.net
npmスレに。
373:デフォルトの名無しさん
19/07/24 21:22:10.25 ArGZw8p9.net
>>361
catとreadってたった一行読み込むのにそんな差ある?
374:デフォルトの名無しさん
19/07/25 02:49:23.09 WafvXnG3.net
1行だからcatが遅いんだろ
375:デフォルトの名無しさん
19/07/25 02:51:27.80 muDuQw8n.net
ついcatなって言った
376:デフォルトの名無しさん
19/07/25 08:46:34.39 m8sWcejF.net
こawkあいはしていない。
377:デフォルトの名無しさん
19/07/25 14:59:51.08 VsjL1nxe.net
sedで質問です。
置換前
(a0b1c2=99999) (a0b1c2=00000)
置換後
DATA1=99999 DATA2=00000
こんな感じに置換したいです。
カッコと接頭辞みたいなのを除去した上で、
行の1つめはDATA1に、2つめはDATA2に置換したいという意味です。
何卒ご教示ください。
378:デフォルトの名無しさん
19/07/25 15:04:52.21 D8pzUtDE.net
(
[a-zA-Z0-9]
=
[0-9]+
)
こんな形のデータか?
379:デフォルトの名無しさん
19/07/25 15:09:40.46 D8pzUtDE.net
暫定これ
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
380:デフォルトの名無しさん
19/07/25 15:11:16.41 VsjL1nxe.net
>>370
すいません、話を簡単にするため>>369は端折ったんですが、
端折らない方がよさそうなので元データそのまま書きます。
わかる人にはわかるかもしれませんが、VMwareのAPIから取ってきた値です。
guest(01) %!s(int32=110) %!s(int32=3625)
これは左からゲスト名、各ゲストのCPU使用量(MHz)、メモリ使用量(MB)です。
これを
guest(01) CPU=110 Memory=3625
こんな感じにしたいなと思っています。
最初はsedの単純な置換とパイプで何とかしようとしたんですが、
ゲスト名にもカッコが使われてる(のが除去されちゃう)という部分が回避できませんでした。
381:デフォルトの名無しさん
19/07/25 15:20:38.81 D8pzUtDE.net
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
これで間にあう?
382:デフォルトの名無しさん
19/07/25 15:22:34.93 D8pzUtDE.net
失礼しました
最後の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
383:デフォルトの名無しさん
19/07/25 15:27:23.74 hsvk8oNq.net
>>361
パイプにテキストファイルの中身を流し込んで逐次処理するとき、
cat "hoge.txt" | ~ のほかに、
echo $(< "hoge.txt") | ~ とか、
lessなどのページャー読み込みでもできるけど、
どうするかいつも悩むなぁ。
grepなどの、ファイル読み込みオプションのあるコマンドが先頭ならそれを使えばいいけど、
そうでない場合は、みんなどうしてる?
384:デフォルトの名無しさん
19/07/25 15:44:25.16 qx5YGZv4.net
>>375
何故 < hoge.txt じゃ駄目なの?
385:デフォルトの名無しさん
19/07/25 15:57:19.67 VsjL1nxe.net
>>374
できました!ありがとうございます!
高度すぎて何やってるのかさっぱり理解できてませんが、
じっくり解読させていただきます。
386:デフォルトの名無しさん
19/07/25 17:02:25.09 hsvk8oNq.net
>>376
複数のパイプを繋げた逐次処理の場合に、
処理元のファイルが何であるかを明確にしたいので、
すべてのパイプの先頭に持っていきたいんだよ。
ファイル読み込み | 処理1 | 処理2 | 処理3…
387:デフォルトの名無しさん
19/07/25 17:18:56.17 vvE0ECJG.net
俺なら
< hoge.txt cmd1 | cmd2
388: | cmd3 ... と書く
389:デフォルトの名無しさん
19/07/25 17:34:33.11 hsvk8oNq.net
>>379
ほぉ、リダイレクトって、コマンドの前にもってこれるんだ。ありがとう。
これならとりあえず、ソースを明確にできるね。
しかもおそらく一番処理が速いかな。
catを使った方法のような、単に読み込むだけのコマンドの高速版みたいなのはないのかなぁ。
390:デフォルトの名無しさん
19/07/25 18:20:54.41 D8pzUtDE.net
>>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つ以上の という個数指定になる
391:デフォルトの名無しさん
19/07/25 18:41:30.57 m8sWcejF.net
……Perlも十分読み難いと思うのは俺だけだろうか…
392:デフォルトの名無しさん
19/07/25 18:52:29.83 I5POGkj3.net
perl が使えるような環境なら sed -E 使えるんじゃね?
393:デフォルトの名無しさん
19/07/25 19:47:46.86 D8pzUtDE.net
>>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
394:デフォルトの名無しさん
19/07/25 21:09:49.52 AjtfUs9C.net
>>384
$pattern への値の代入は一回で良いので BEGIN { ... } の中に入れた方が効率が良くなる。
(勝手に最適化されて最終的には大差なくなってしまうかも知れないけどね)。
395:デフォルトの名無しさん
19/07/25 22:22:57.77 1GqrqsZl.net
これぐらいのの複雑さになると、perl でちゃんと改行、インデントして
書いた方がいいような気がする
396:デフォルトの名無しさん
19/07/26 00:44:50.95 16gdYth6.net
シェルスクリプトは関数型だとかアホなこと言ってるブログがあった
397:デフォルトの名無しさん
19/07/26 10:46:37.80 54Ib42km.net
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 ] ) }"'
398:デフォルトの名無しさん
19/07/26 12:22:34.47 AGnOcgvd.net
>>388
死ね
399:デフォルトの名無しさん
19/07/27 10:41:07.02 6v++aFZ1.net
上の方の数値判定だけどマイナス記号を考えない(つまり正整数だけを判定する)のなら
[ ! ${var%%[0-9]*} ]
これが最速で(記述も)最短じゃなかろうか。
400:デフォルトの名無しさん
19/07/27 11:54:57.07 z4Poa3yK.net
真っ直ぐに一直線ですか?
401:デフォルトの名無しさん
19/07/27 13:52:23.75 QzyB/IP7.net
>>390
シェルのパターンマッチングでの '*' って any string の意味なので、
$ var='10abcdefg'
$ [ ! ${var%%[0-9]*} ] && echo integer
integer
となってしまう。bash の extglob を使うなら、
$ [ ! ${var%%?([-+])+([0-9])} ] && echo integer
などと書ける(空文字の場合に対応してないけど)。
402:デフォルトの名無しさん
19/07/27 15:15:37.83 6v++aFZ1.net
>>392
おうマジだ。
なぜか英字のみと数字のみの変数で試してたから気付かなかったw
恥かしすぎるw
403:デフォルトの名無しさん
19/07/27 19:04:12.75 6v++aFZ1.net
突飛なことはせずcase分使うのが一番いいのかな。
正直、俺だったらそもそも「型」の概念が必要になるようなプログラムは
シェルスクリプトで書かないけど
404:デフォルトの名無しさん
19/07/28 00:29:26.94 LPR+u+AV.net
* は、シェルスクリプトでは、0文字以上の任意の文字列で、
正規表現では、直前の文字の0回以上の繰り返し
正規表現を使うのなら、egrep, grep -e でフィルターしないといけない
egrep '正規表現'
これもシェルで解釈されないように、シングルクォーテーションで囲む方がよい
405:デフォルトの名無しさん
19/07/28 00:33:37.21 7n7RswoS.net
perlは正規表現しか知らんが構文は結構読みにくいのね
pythonやruby辺りやった方がいいのかな
簡単なシェルスクリプトを書いたりsedやawkで弄ったりはしてるけど
406:デフォルトの名無しさん
19/07/28 01:42:13.12 /N9EqgUo.net
シェルスクリプトとしてはワンライナーが短く書け、
カオスも含めた無限のような表現力のあるperl を薦める
seq 30 | perl -0777 -ne 'print $_ =()= /1/g'
13
407:デフォルトの名無しさん
19/07/28 02:18:58.47 UCGA8APU.net
seq 30 | tr -dc '1' | wc -c
でいいんじゃね
408:デフォルトの名無しさん
19/07/28 02:37:29.23 /N9EqgUo.net
旨い
2文字以上じゃないことを利用する柔軟性見事
409:デフォルトの名無しさん
19/07/28 03:11:34.56 vKAr7iFy.net
>>397
>>398
この二つって1から30までの間に何回1が登場するかを数えてるの?
410:デフォルトの名無しさん
19/07/28 04:13:22.82 /N9EqgUo.net
はい
411:デフォルトの名無しさん
19/07/28 04:28:55.80 LPR+u+AV.net
Ruby では、1 の個数を数える
seq 30 | ruby -e 'puts ARGF.read.count( "1" )'
#=> 13
412:デフォルトの名無しさん
19/07/28 04:30:02.41 vKAr7iFy.net
何の意味があんの?
Perlだと複雑に書けるよってこと?
413:デフォルトの名無しさん
19/07/28 04:37:14.85 UCGA8APU.net
1 を数えたいなら
$ seq 30 | grep -o 1 | wc -l
414:デフォルトの名無しさん
19/07/28 10:48:09.20 /N9EqgUo.net
きっと見たこともない構文だと思って書いた
しかし、ここに多く書かれるより短いワンライナーより長いので
全然良くなかった
本当は「普通は思い浮かばない書き方の中に
短く書けるような可能性がある」と思わせたかったけど
力不足だった
415:デフォルトの名無しさん
19/07/28 11:51:54.16 V62sQMom.net
改行を無視して検索は?
416:デフォルトの名無しさん
19/07/28 12:45:34.52 /N9EqgUo.net
3行以上にまたがる複数行?
2行まで?
417:デフォルトの名無しさん
19/07/29 21:57:36.07 LpaqQy0x.net
PowerShell では、
$matches = 1..30 | Select-String "1" -AllMatches
$matches.Matches.Count
#=> 13
418:デフォルトの名無しさん
19/07/30 00:35:05.01 TDafWW+v.net
PowerShellって嫌われてるけど結構便利だよね。
でも使い熟せる自信も気力もないw
419:デフォルトの名無しさん
19/07/30 07:02:14.50 lWAzz/KK.net
PowerShellってどういう場面で使われるの?
Bash使わないでPowerShell使うことってあんの?
420:デフォルトの名無しさん
19/07/30 07:18:22.77 RYwsY7rK.net
windows update からの shutdown
でも十分便利そうだ
UIがことごとくGUIだから
砂漠の水のように利くんじゃないか?
421:デフォルトの名無しさん
19/07/30 07:51:48.49 TDafWW+v.net
喩えが文学的すぎて分からん
422:デフォルトの名無しさん
19/07/30 18:08:45.58 EUusSyFO.net
URLリンク(pubs.opengroup.org)
doshってなに?
423:デフォルトの名無しさん
19/07/30 18:16:09.63 fdfPnQnm.net
Remove-Item、Copy-Itemとか生理的に受け付けない体になってる。
424:デフォルトの名無しさん
19/07/30 18:28:39.62 R+5nd6EU.net
>>413
DOcker SHell
425:デフォルトの名無しさん
19/07/30 18:34:09.08 EUusSyFO.net
時代からしてそれはないだろ
426:デフォルトの名無しさん
19/07/30 19:37:33.76 6/Ph+fdB.net
>>408
オシャレだ
427:デフォルトの名無しさん
19/07/30 20:50:28.04 TDafWW+v.net
>>413
簡単にWebを検索してみてそれらしい記述を一件のみ見付けた。ほんとにこれがdoshの由来かは知らん。
OpenSolarisのBシェルから派生したSchily Bourne ShellというUnixシェル
URLリンク(schilytools.sourceforge.net)
によると
* dosh builtin that allows to implement parametrized aliases.
らしい。
428:418
19/07/30 20:57:36.54 TDafWW+v.net
URLリンク(unix.stackexchange.com)
ここでも同じようなことを言っている。
dosh組込み命令を実装したうんぬん。
しかし肝心要のSolaris Bシェルの手引書
URLリンク(docs.oracle.com)
にはその記述が見当らず……。どゆこと???
429:デフォルトの名無しさん
19/07/30 21:12:05.50 EUusSyFO.net
>>418
サンクス。boshなんてのがあるのか。
でもなんとなくboshが最初だとは思えないな
POSIXに影響を与えてるぐらいだからもっと大きな元ネタがありそうだけど
あとなんの略かもわからん。まさか do sh (shする?)
あと>>413のリンクが間違っていたので訂正
URLリンク(pubs.opengroup.org)
430:デフォルトの名無しさん
19/07/30 21:15:06.53 EUusSyFO.net
ここには元ネタはUNOSとか書いてあるね。
URLリンク(unix.stackexchange.com)
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.
431:デフォルトの名無しさん
19/07/30 21:19:41.35 EUusSyFO.net
URLリンク(www.in-ulm.de)
> built-in "dosh" added, behaves similar to "sh -c 'command'" without launching a new shell, supports aliases
あぁ、なるほど。sh -c 'command'と同じように使えて
新しいシェルを起動しないから、do sh なのか
432:デフォルトの名無しさん
19/07/30 21:26:48.89 EUusSyFO.net
URLリンク(unix.stackexchange.com)
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)の作者かな?
433:デフォルトの名無しさん
19/07/30 21:30:36.00 TDafWW+v.net
>>423
この回答者>>419じゃない?
そうだとしたら確実にOpenSolarisのシェルに携わってる人。
434:デフォルトの名無しさん
19/07/30 21:57:06.40 EUusSyFO.net
「OpenSolarisのシェルに携わってる」はちょっと疑問かな
URLリンク(schilytools.sourceforge.net)
> 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
URLリンク(unix.stackexchange.com)
> 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が存在するのかも
435:デフォルトの名無しさん
19/07/30 22:00:29.38 TDafWW+v.net
>>425
ははーん。そういうことか。
Solaris Bシェルが持ってた拡張機能じゃなくてSolaris Bシェルに対する拡張機能だった訳ね。
Solarisの手引書を漁っても見付からない訳だ。
436:デフォルトの名無しさん
19/07/30 22:35:47.42 TDafWW+v.net
全然関係ないけど
$'\n'←こういうのって2020年あたりに発行されるPOSIXに組込まれるかもしれないらしいね。
そのページの下の方に書いてあった。
互換性とか大丈夫なのかな……?
437:デフォルトの名無しさん
19/07/30 22:45:31.33 TDafWW+v.net
参考: URLリンク(austingroupbugs.net)
ていうかAustin GroupってThe Open Groupとは別ドメインなんだな。
サブグループだと思ってたわ。
438:デフォルトの名無しさん
19/07/31 12:01:53.51 6BPSvdm1.net
>>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
439:デフォルトの名無しさん
19/07/31 16:37:25.52 kGX3Rh8Y.net
>>429
それ日本語が出てるの?
それとも日本語はあなたが付け足したの?
440:デフォルトの名無しさん
19/07/31 22:49:22.63 FZL3ewwl.net
>>412
お釈迦様のアドバイス「犀の角のように独り歩め」も意味わからん…
441:デフォルトの名無しさん
19/07/31 23:18:58.96 kGX3Rh8Y.net
boshがビルドできずに諦めたw
442:デフォルトの名無しさん
19/07/31 23:25:31.28 8xUIRaAC.net
>>432
Debian 9で普通にmakeしたらできたけど?
正確にはDockerのbuildpack-depsだけど
443:デフォルトの名無しさん
19/07/31 23:39:26.64 8xUIRaAC.net
おや?最新版、2019-07-22版でビルド失敗した。
なんとなしにNetBSDでパッケージがあるのを見つけて使った2019-03-11版が運が良かったか
URLリンク(cdn.netbsd.org)
444:デフォルトの名無しさん
19/07/31 23:57:18.53 8xUIRaAC.net
2019-06-13までは普通にビルドできるね
2019-07-15からビルドに失敗するようになってる
445:デフォルトの名無しさん
19/08/01 02:58:17.41 PmXIwIbo.net
>>435
情報ありがとう。古いので試してみるわ。
446:デフォルトの名無しさん
19/08/01 11:35:33.85 czAE5CE0.net
関数の中は、set -eで止めたいけど、関数の外では(後処理をするために)止めたくないって場合が辛いわ
例えばこんなコードがあって、falseで止まるようにしたいからset -eにするだろ?
foo() {
set -e
echo 1
447: false echo 2 } でも呼び出し側では必ず後処理をしたいから止めたくない。 set +e foo echo "後処理" これだと止まってしまうから、foo &&: とかすると 今度は、fooの中でset -eの効果が無くなってしまう。何だこの仕様? ( foo ) とすると期待通りにfalseで止まるかつ後処理を実行できたが、 fooがサブシェルなので、fooの中で定義した変数にアクセスできない 困った
448:デフォルトの名無しさん
19/08/01 12:20:40.41 aVYnxNEs.net
>>431
それは犀の角が一本だからという、特にひねりのない喩え。
449:デフォルトの名無しさん
19/08/01 12:25:28.77 iHxbPEOX.net
set -eはshellをexitするから当然の動作じゃない?
foo && : だと最終的なfooの戻り値を判定する必要があるからfalseで止まらずに最後まで行くんじゃないか
関数の中だけなら横着せずに
false || return
しろってことじゃないかな
450:デフォルトの名無しさん
19/08/01 13:07:42.24 lJwvTmEp.net
後処理だけなら、trap '後処理' ERR でやれば
根本的に -e の使い方が違うと思うけど
451:デフォルトの名無しさん
19/08/01 13:10:18.98 bR99qXsR.net
$ dash
$ trap : ERR
trap: ERR: bad trap
452:デフォルトの名無しさん
19/08/01 13:15:37.05 lJwvTmEp.net
EXIT でもいいぞ
453:デフォルトの名無しさん
19/08/01 13:17:58.23 bR99qXsR.net
どうやってEXITから終了せずに通常の流れに戻すの?
454:デフォルトの名無しさん
19/08/01 13:19:11.98 lJwvTmEp.net
なんやお前は
「後処理だけなら」って言ってるだろ
455:デフォルトの名無しさん
19/08/01 15:30:04.66 WaJjQk0q.net
SIGHUT とかのシグナル部分を書くとか?
456:デフォルトの名無しさん
19/08/01 20:47:35.88 SQRHjrcQ.net
func() {
return 123
}
if ! func; then
echo $?
fi
0って表示されるんだけど、どういうこと!?
457:デフォルトの名無しさん
19/08/01 21:31:03.39 2c4IvXw2.net
>>446
戻り値123を!しているから0になっただけでは
458:デフォルトの名無しさん
19/08/01 21:33:30.40 SQRHjrcQ.net
こう書けってことか?
面倒くさいな
if func; then
:
else
echo $?
fi
459:デフォルトの名無しさん
19/08/01 22:05:20.92 Ye1sT2dv.net
func || echo $? でいいんじゃね
460:デフォルトの名無しさん
19/08/01 22:10:56.38 SQRHjrcQ.net
実際にはecho $?以外にもすることがあるから
461:デフォルトの名無しさん
19/08/01 22:27:36.45 Ye1sT2dv.net
んじゃ、
func || { echo $?; ... ; }
とか。
462:デフォルトの名無しさん
19/08/02 02:34:53.77 hQ+yEyXN.net
Cじゃないから終了コードをそんな風に使わないほうが良い気がする…
あくまで「気がする」だけだけど
463:デフォルトの名無しさん
19/08/02 02:59:49.78 O3iYpUQI.net
値が 0 とそれ以外だけではなく、
それ以外にも、ある程度数値に意味があるのもあるからいいんじゃないのと思うけど
464:デフォルトの名無しさん
19/08/02 03:02:36.73 O3iYpUQI.net
ああ、そんな風 = 返り値が勝手に暗黙的に変わる変わらないってことかな?
だったらほぼ同意
465:デフォルトの名無しさん
19/08/02 03:40:21.45 hQ+yEyXN.net
>>453
あー。例えばあるコマンドで「ファイルが無い」ことを示すのに
exit 32が返ってくるとして
それに応じた最適なエラー処理をするってことかな?
466:デフォルトの名無しさん
19/08/02 03:54:22.19 O3iYpUQI.net
まあ元レスの人がどういう使い方をしたいのかわからんけど、そういう感じ
467:デフォルトの名無しさん
19/08/02 07:48:45.01 hQ+yEyXN.net
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式を二度使ってるのがダサく感じる…
もうちょっと賢い方法知らない?
468:デフォルトの名無しさん
19/08/02 07:49:38.54 hQ+yEyXN.net
ごめん一行目のn=2は無視って。
469:デフォルトの名無しさん
19/08/02 08:02:59.58 XJV5qmce.net
define f(n) {
if (n == 0) {
f = 1
} else {
f = n * f(n - 1)
}
return(f)
}
とか( n < 0 の場合、無限ループになるけど)
470:デフォルトの名無しさん
19/08/02 08:15:06.73 hQ+yEyXN.net
>>459
ありがとう。
でもelseって使えなくない? GNU bcだと使えるのかな?
URLリンク(pubs.opengroup.org)
471:デフォルトの名無しさん
19/08/02 08:42:59.37 dUmy9lW0.net
elseはGNU拡張
else使えないならこうするしかない
define f(n) {
if (n == 0) { f = 1 }
if (n != 0) { f = n * f(n - 1) }
return(f)
}
472:デフォルトの名無しさん
19/08/02 09:23:07.90 7tJhBDcy.net
>>438
それ喩える意味あるぅ?
情報量低すぎるどころか混乱を招いて逆効果だわ。
「グーはチョキに勝つ。そう、斧が槍に強いように」とか言われてる気分。