X



シェルスクリプト総合 その29
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 3efb-m2E0)
垢版 |
2018/09/22(土) 11:53:21.38ID:BBiLRgnj0
!extend:on:vvvvv:1000:512
!extend:on:vvvvv:1000:512
シェルスクリプトに関する総合スレッドです。

スレ立て時は以下の文を先頭行に加えて下さい。
後のつけ忘れ防止の為に複数行重ねて追加推奨
!extend:on:vvvvv:1000:512

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

前スレ
シェルスクリプト総合 その28
http://mevius.5ch.net/test/read.cgi/tech/1532397676/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0246デフォルトの名無しさん (ワッチョイ 7b98-usPd)
垢版 |
2018/10/18(木) 18:24:07.81ID:/ofNkRJS0
>>245
ん? どういうふうに書くってこと?

>>237の件、ぼや〜っとだけどわかりかけてきた気がする

スクリプトのコードが.(ドット)コマンドで評価された時点で、
関数がすでに存在している場合、その関数を使用するコードがあれば
事前にリンクされているような動きをしている

その場合サブシェルで関数を再定義しようとしてもできないんじゃないかな
だから事前にリンクできないようにeval呼び出しに変更したら
再定義された方の関数を呼び出すようになった
0247デフォルトの名無しさん (ワッチョイ 6a7c-fIkj)
垢版 |
2018/10/18(木) 18:35:46.85ID:uRBurQVb0
((a % 5 == 0))&& ...
なんで一々ここまで言わんとわからんような奴が、他人の指摘しているんだろうかね。。。
-eqでの数値比較とか基本中の基本だろうに。
0250デフォルトの名無しさん (アウアウカー Safb-nHS7)
垢版 |
2018/10/18(木) 19:33:42.29ID:9i8IzX+1a
(( )) ではなく [[ ]] では?
0255デフォルトの名無しさん (ワッチョイ f398-usPd)
垢版 |
2018/10/20(土) 02:22:05.90ID:V0y1IBp60
>>224
> parsargコマンドみたいなのを再発明したほうが早いかもね

違うもの調べてて、こういうのを見つけた。
見つけたってだけでどんなものかは調べていない

http://zentoo.hatenablog.com/entry/20110708/1310124831
> ちょっとした理由でgit-flow (https://github.com/nvie/gitflow) のソースを
> ちょっとちょっと眺めていたんだけど、内部でコマンドライン引数を
> パースするためにshflagsというツールが使われていたのでメモ。
0258デフォルトの名無しさん (オッペケ Srb3-iHQf)
垢版 |
2018/10/20(土) 12:37:11.93ID:MzLaXRRvr
猫好きてそんなに言語化しにくい複雑怪奇な感情持っとるんか?
0259デフォルトの名無しさん (ワッチョイ 3bfb-6CEe)
垢版 |
2018/10/20(土) 12:43:08.81ID:o8LOHz9N0
例えば女をみて欲情しない人間に、なぜ欲情するのかを説明するのは難しいだろう
言葉を並べるだけなら本能だとか体の特徴なんかを言えるが、共感はされまい
つまりそれを疑問に感じる人間には、その時点ですでに納得させる言葉がないのだ
0260デフォルトの名無しさん (オッペケ Srb3-iHQf)
垢版 |
2018/10/20(土) 12:48:37.62ID:MzLaXRRvr
でもそもそも説明するのが困難なのやろ?
おまえが言ったんやで
0269デフォルトの名無しさん (ワッチョイ ea98-usPd)
垢版 |
2018/10/21(日) 03:41:54.16ID:dQhyPQp/0
あるパスがディレクトリで書き込み可能かは、[ -d "$path" ] とか [ -w "$path" ] で調べられるし、
所有者が自分自身であるかは-Gや-Oで調べられますが、
自分以外が読み書き不可能であることをチェックするにはどうしたら良いですかね?
0273デフォルトの名無しさん (ワッチョイ ea98-usPd)
垢版 |
2018/10/21(日) 06:34:56.07ID:dQhyPQp/0
ありがとう。だがオプション多すぎて読むのだりぃw

なんでだろ?どうもlsって解析する気にならないんだよな
人間向けのフォーマットでコンピュータが解釈するのに向いてない感じがしている
どこまでPOSIXで仕様化されてるのか、どこからが拡張なのか、オプション多すぎて(略

関係ないけど、ふと本棚を見たら
「lsを読まずにプログラマを名乗るな!」という本があったw
そういや買ったっけ(未読)
0276デフォルトの名無しさん (ワッチョイ 2aa2-k6PT)
垢版 |
2018/10/21(日) 06:45:46.73ID:xQoMnSHc0
>>273
>>272はPOSIXの仕様。>>269,270,271の目的には
If the -l option is specified, the following information shall be written for files other than character special and block special files:

If the -l option is specified, the following information shall be written for character special and block special files:
で書いてあるフォーマットだけだけどね
0277デフォルトの名無しさん (ワッチョイ ea98-usPd)
垢版 |
2018/10/21(日) 07:33:05.64ID:dQhyPQp/0
そういや、macだとlsで

drwxr-xr-x+ や
drwxr-xr-x@ みたいに
後ろになにかくっついていることがあるな

> Implementations may add other characters to this list to represent other implementation-defined file types.
くっつけても良いってことなのか?
0279デフォルトの名無しさん (アウアウウー Sa9f-L0SM)
垢版 |
2018/10/21(日) 20:00:09.31ID:0dWokXAIa
stat コマンドの出力解析した方が楽ではないか?
または find コマンドの -perm 利用してチェックして -exec でやらせたいことをやらせる。
0282デフォルトの名無しさん (ワッチョイ 269f-nBLa)
垢版 |
2018/10/22(月) 02:54:50.03ID:HyPH6OEy0
>>280
じゃ、find で。
ファイルのパーミッションに 066 を and した時に 0 になるやつでいいのなら
find $dir -prune ! -perm -40 ! -perm -20 ! -perm -4 ! -perm -2 -exec やらせたいこと \;
のようにすればいいのではないかな。
http://pubs.opengroup.org/onlinepubs/9699919799/ で find コマンド見てみたら -perm はあるようなので。
もし GNU の find コマンド使えるようなら -perm /mode が使えて、これは何れかのビットが立っていれば
真になるので ! -perm /66 の一つで出来ると思う。
0284名無しさん@そうだ選挙に行こう! Go to vote! (アウアウウー Sa9f-L0SM)
垢版 |
2018/10/22(月) 10:18:21.67ID:8WYgXfgna
その辺はご自由に。POSIX縛りがあってもこの場合にfindも使えるってだけの話なので。ls使いたいならそうすればいい。
0286デフォルトの名無しさん (JP 0H1b-v9b0)
垢版 |
2018/10/22(月) 16:55:54.61ID:9s+yFzz3H
>>281
2.1の5で、リダイレクトの処理をしてパラメーターリストから
除去するって書いてあるのと、
6でコマンド名を第0パラメーターとして渡すって書いてるってことは、
先頭もパラメーターリストの一部と解釈できるから、
暗に、先頭にリダイレクトがあってもいいってことを表してるんでは?
0289デフォルトの名無しさん (ワッチョイ ea98-Pr2h)
垢版 |
2018/10/22(月) 21:35:03.82ID:oF7wf0Ce0
>>118
それはオブジェクト指向の話じゃない
C++の話だ

そもそもテンプレートやジェネリックは、型を明確にすることでバグを少なくしたり
速度を速くするためのもので、オブジェクト指向における問題点を解決するための追加機能

テンプレートやジェネリックを使うことでオブジェクト指向が不要になるのではなく
オブジェクト指向と組み合わせて使うことで問題点が改善される

テンプレートはオブジェクト指向と組み合わせずに使えたと思うが、
テンプレートの殆ど(ジェネリックは全て)はオブジェクト指向なしに使うことはできない
0292デフォルトの名無しさん (アウアウウー Sa9f-L0SM)
垢版 |
2018/10/23(火) 13:27:19.16ID:QwHjyvjPa
シェルというか tar コマンドの問題なんだけど、tar tvf でアーカイブに入っているファイルのタイムスタンプを秒単位まで出す方法ある?
Linux で GNU tar のmanページ見た感じではなさそうなんだけど、やはり自作するしかないなかな。
0294デフォルトの名無しさん (アウアウウー Sa9f-L0SM)
垢版 |
2018/10/23(火) 14:38:56.39ID:QwHjyvjPa
>>293
おお!ありがとう。新しい GNU tar にあるね。
最初CentOS6で試しててわからなかった。これは GNU tar 1.23 だ。
CentOS7は GNU tar 1.26 になっててこちらでは出来るしmanページにも書いてあった。
0296デフォルトの名無しさん (アウアウウー Sa9f-L0SM)
垢版 |
2018/10/23(火) 15:35:42.08ID:QwHjyvjPa
>>295
するする。仕事でRHEL6のサーバ使っててそれの一部をテストする時に使ってただけなので。
0298デフォルトの名無しさん (アウアウウー Sa5d-hDoO)
垢版 |
2018/10/25(木) 14:43:08.46ID:hw/Q19JUa
>>297
それもはやシェルかどうか関係なくてWindows固有の問題だと思うが、エクスプローラでそのファイル右クリックしてプロパティ出したらそんな感じの設定できるようになってない?
最小化した状態で実行するとか、そんなやつ。
0299デフォルトの名無しさん (アウアウウー Sa5d-hDoO)
垢版 |
2018/10/25(木) 14:51:54.06ID:hw/Q19JUa
こうだ。

まずショートカット作り、そのショートカットのプロパティ出すと実行時の大きさを指定できる所があって、そこを最小化にすると実行時にタスクバーにアイコン出ているだけになる。
0301デフォルトの名無しさん (ワッチョイ 9764-Ed1r)
垢版 |
2018/10/26(金) 22:15:40.17ID:ScQN6FWl0
ファイルや標準出力の行数がある数値より大きいことをできるだけ高速に確かめるにはどうすればいいだろう
最も単純で最もUNIXっぽいのは
$ test $(<file.txt wc -l) -gt $num
としてその真偽を見ることだけど
$ test $( (yes | head -n 3000000000000000000) | wc -l) -lt 300
こういうのを実行して貰えれば分かると思うがかなり時間が掛かる
俺の使ってる計算機はそこそこ良い性能(Intel Xeon x2/32GiB RAMなのだが)
それでも実行に1分強掛かった。
しかしこれは無駄だ。なぜなら結局比較する対象は300なのだから、「300行以上ある」ことが分かればいい。
なにか案ありませんかね。

思ったのはsed -n -e '300p'とかでその失敗判定を見るとかだが,これはsedコマンドの失敗の要因が他にもあるので
ちょっと不安定かなと。
0302デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/26(金) 23:12:31.32ID:7cGNdWT70
cで指定行読むコマンドを作ればいい
面倒なこといちいち考える必要がそもそもない
0309デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/27(土) 01:23:00.95ID:4RrrP6U60
シェルスクリプトでループで回しながら数えるのと
headで300行とってきて、wcで300行数えるのってどっちが速いんだろうかね
やればすぐわかるけど、やる気起きないなぁw
0310デフォルトの名無しさん (ワッチョイ 5b9f-3knh)
垢版 |
2018/10/27(土) 04:24:55.28ID:QwPOuwmq0
>>309
シェルスクリプトだとインタープリタの言語みたいな動きになるので遅そうなイメージはあるな。但しうまいこと内部で最適化されれば速くなるかもね。
0311デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/27(土) 08:30:31.93ID:4RrrP6U60
>>310
いうてもループとカウントと条件分岐だけだからなぁ
内部的にはインタプリタ解釈後の状態になってるだろうし
そこでCPUは食わない気がする

でもheadでとってきてwcでカウントの部分は並列で実行できるわけで
マルチコアなら当然のことながら、シングルコアでもファイルから読み取りの方が
遅いからwcで待たされることはなさそう

どちらが速いかは微妙な所だなw
0313デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/27(土) 09:08:24.86ID:S4VvuAVS0
ファイルの先頭からLFの数を数えるだけのことを
ああでもこうでもないと
いちいち考えないといけないオツムのデキを疑うわ。。。
0314デフォルトの名無しさん (オッペケ Sref-9p2Q)
垢版 |
2018/10/27(土) 09:14:33.78ID:EI3TCK5cr
ループってreadのループ?
catからパイプしてwhileのreadループってどうなんだっけ
昔作ったシェルでcatしてたファイルを処理中に書き換えたけど
実行されてる処理では書き換える前の内容で処理されてたみたいだから
どこかメモリに展開されてるんじゃ
catからのパイプでプロセスが終わってるからか?
でもリダイレクトやヒアドキュメントでも同じじゃないの?
0315デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/27(土) 09:24:18.83ID:S4VvuAVS0
低学歴知恵遅れの思考形態、世界では
すでに用意されているコマンドを組み合わせてシェルスクリプトを書くことが
シェルスクリプトを書くことになるという決まりがあるのが
このスレみてると分かる
0317デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/27(土) 09:36:35.55ID:94jXB05x0
>>314
単にバッファに入っていただけとか。カーネルに設定できるバッファサイズなバッファなんぞもしくはcatプログラムのバッファ(の方が小さいだろう、たぶん)
もしくは上書きが上書きではなくて削除して新規ファイルに保存とかの場合とか(削除してもどこぞでオープンしていたらクローズされるまでは元のはそのまま残る)、か、OSが他でオープンされていたら上書きでも同じように別に保存してるとか
0318デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/27(土) 10:00:05.77ID:4RrrP6U60
>>313
考えてるのはファイルの先頭からLFの数を数える
「効率がいい方法(コマンド)は何か」だよ

LFの数を数えることなんてわかりきったことは考えてない
それを実現する方法を考えてる

まったくキミは思慮が足りないなw
0325デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/27(土) 11:01:01.29ID:S4VvuAVS0
低学歴知恵遅れのしゃべり場
0331デフォルトの名無しさん (ワッチョイ df03-WuzW)
垢版 |
2018/10/28(日) 06:57:04.86ID:xmv6f/Y+0
そもそもシェルでええのにわざわざシェルスクリプトって言いたがる新参者達w
0334デフォルトの名無しさん (ワッチョイ df03-WuzW)
垢版 |
2018/10/28(日) 09:10:44.72ID:xmv6f/Y+0
>>333
おまえがググれよおこちゃまw
0335デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/28(日) 09:26:48.32ID:PnJQ4LJT0
こんな感じに script1.sh が script2.sh を呼び出してる状態でさ、

script1.sh
 └ script2.sh

CTRL+Cを押した時、script2.shは止めて、script1.shは
止めないってできるのかなぁ?

シグナルって、伝搬というか、上から下へ もしくは 下から上へ
流れていくものなん?
0342デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/28(日) 11:47:47.85ID:gJfQRhUl0
script2.shでそのへんの制御とかしたくなく、script1.shだけでならscript1.shで trap SIGINTすればいいだけっぽいな。無効じゃなくなにもしないシグナルハンドラで
script2.shの時だけでならその前後でNOPのシグナルハンドラ設定通常のシグナルハンドラに戻すとかか

>>341 被ったけど、書いたので被り被りで
0343デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/28(日) 17:27:21.50ID:XoYPKH7l0
勘違いしてた。違う所が原因だった

単純にscript2.shを起動してるのではなくて
script2.sh | filter みたいにパイプ使っていて、
CTRL+C押したときにscript2.shが出力するメッセージを
script1.shで受け取れないって問題だった
0344デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/28(日) 17:58:26.84ID:gJfQRhUl0
どのタイミングでの出力が出ない、出したいのかわからんな。CTRL+C押した瞬間ギリのか??としか思えないが。filterがなんなのか知らんけど、script1.shでtrapでもscript2.shでの出力が全くでないことなないだろう、当然
script2.shでtrapしてexitすればギリ近くのまで出るんじゃないの。script2.shで実際に出力しているコマンド(プロセス)にもよるだろうけど
0345デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/28(日) 18:40:23.99ID:gJfQRhUl0
ああ、trapの対象はパイプチェイン(?)の最後のヤツ&それがシェルでなければなのか?script2.shに飛ぶことはないのね。その最後のでexitすればだなすればかな
script2.sh | cat
script2.sh | sh -c "trap 'exit 0';cat"
のような変態なw それもシェル種類依存かな。あとはバッファをflushすればよりなんとかなりそうかなあ(できるのであれば)
そもそもCTRL+Cなんだからそんなギリを気にすんなってとこか
■ このスレッドは過去ログ倉庫に格納されています

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