シェルスクリプト総合 その29
■ このスレッドは過去ログ倉庫に格納されています
!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 >>240 > continue はループ内のその後の処理を飛ばすやつだからできないと思うが。 5の倍数以外でsleepを飛ばせばできるYO! >>239 > とやると、50個目まで表示されると思いますが 51個目まで表示される > a=`expr $a +1` は a=$((a+1)) の方が良い シェルによって実行されるから速い 俺だったらif使わないでこう書くかな [ $(($a % 5)) = 0 ] && sleep 1 ただこの書き方は if を使った場合と完全に等価なわけじゃなくて 後続行実行時点でのexit codeが異なることがあるから使い方に注意だけど ついでだから書いておくと、 a=`expr $a +1` でも大差ないだろ?と思った人 WSLの酷さがわかるぞ たった50回のループ、sleepを行わない状態で a=$((a+1)) だと 約0.025秒なのに、 a=`expr $a +1` だと 約0.5秒にもなるのだ 10000回のループだと a=$((a+1)) だと 約0.1秒のところ、 a=`expr $a +1` だと 約90秒 早くWSLのfokの遅さが解決すると良いな × [ $(($a % 5)) = 0 ] && sleep 1 ○ [ $((a % 5)) = 0 ] && sleep 1 書き込む前に気づいて直したと思ったんだがコピペミスったか 上でも動かないわけではない。無駄なだけ > [ $((a % 5)) = 0 ] 新旧混ぜんなw arithmetic使うなら、そのままevaluation記法にしてしまえばいい。 ((...)) あと、旧testでの数値比較は-eqを使え。 >>245 ん? どういうふうに書くってこと? >>237 の件、ぼや〜っとだけどわかりかけてきた気がする スクリプトのコードが.(ドット)コマンドで評価された時点で、 関数がすでに存在している場合、その関数を使用するコードがあれば 事前にリンクされているような動きをしている その場合サブシェルで関数を再定義しようとしてもできないんじゃないかな だから事前にリンクできないようにeval呼び出しに変更したら 再定義された方の関数を呼び出すようになった ((a % 5 == 0))&& ... なんで一々ここまで言わんとわからんような奴が、他人の指摘しているんだろうかね。。。 -eqでの数値比較とか基本中の基本だろうに。 >>247 $ dash -c 'a=0; ((a % 5 == 0)) && echo ok' dash: 1: a: not found $ dash -c 'a=0; (($a % 5 == 0)) && echo ok' dash: 1: 0: Permission denied なぜかって? その書き方はPOSIX準拠じゃないもの https://github.com/koalaman/shellcheck/wiki/SC2039#standalone- 動かないコード出されて、偉そうにされても やれやれって言うしか無いわなw >>239 だけど、奥が深いね if使わずにもできたりするのか はぁ、先は長そうだ、ありがとう cat file.txt | ( head; tail) は最高 >>224 > parsargコマンドみたいなのを再発明したほうが早いかもね 違うもの調べてて、こういうのを見つけた。 見つけたってだけでどんなものかは調べていない http://zentoo.hatenablog.com/entry/20110708/1310124831 > ちょっとした理由でgit-flow (https://github.com/nvie/gitflow ) のソースを > ちょっとちょっと眺めていたんだけど、内部でコマンドライン引数を > パースするためにshflagsというツールが使われていたのでメモ。 猫好きてそんなに言語化しにくい複雑怪奇な感情持っとるんか? 例えば女をみて欲情しない人間に、なぜ欲情するのかを説明するのは難しいだろう 言葉を並べるだけなら本能だとか体の特徴なんかを言えるが、共感はされまい つまりそれを疑問に感じる人間には、その時点ですでに納得させる言葉がないのだ でもそもそも説明するのが困難なのやろ? おまえが言ったんやで なぜ説明するのが困難かを説明したつもりだったんだが つまんねーよ。シェルスクリプトに関係ある話をしろ ってか、>>206 お願い >>265 自分でそういう設定してんだろ。 ngしてますアピールうざいよ。 なんか遠いレスの番号という意味じゃないの。てか、なんで噛み付いているんだか ワッチョイ変わったのになんでNG効いてんだ?と思ったら課題マンだったのか あるパスがディレクトリで書き込み可能かは、[ -d "$path" ] とか [ -w "$path" ] で調べられるし、 所有者が自分自身であるかは-Gや-Oで調べられますが、 自分以外が読み書き不可能であることをチェックするにはどうしたら良いですかね? やっぱlsしかないですかね。 このフォーマットって仕様化されてるんですよね >>271 pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html#tag_20_73_10 ありがとう。だがオプション多すぎて読むのだりぃw なんでだろ?どうもlsって解析する気にならないんだよな 人間向けのフォーマットでコンピュータが解釈するのに向いてない感じがしている どこまでPOSIXで仕様化されてるのか、どこからが拡張なのか、オプション多すぎて(略 関係ないけど、ふと本棚を見たら 「lsを読まずにプログラマを名乗るな!」という本があったw そういや買ったっけ(未読) >>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: で書いてあるフォーマットだけだけどね そういや、macだとlsで drwxr-xr-x+ や drwxr-xr-x@ みたいに 後ろになにかくっついていることがあるな > Implementations may add other characters to this list to represent other implementation-defined file types. くっつけても良いってことなのか? stat コマンドの出力解析した方が楽ではないか? または find コマンドの -perm 利用してチェックして -exec でやらせたいことをやらせる。 >>279 そこででてくるのが、またPOSIXですよ statはPOSIXで規定されてない SolarisやUP-UXには存在しない 更にLinuxとMacでオプションもフォーマットもぜんぜん違う 標準入力の代わりにfileの内容を入力するのに、リダイレクトで $ <file somecmd とやる方式ってPOSIXで既定されてるっけ。 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_01 このへんに書いてそうなんだけど、それっぽい記述がない? >>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 の一つで出来ると思う。 GNUのfind使っていいという条件なら、GNUのlsやstatでいいじゃんw その辺はご自由に。POSIX縛りがあってもこの場合にfindも使えるってだけの話なので。ls使いたいならそうすればいい。 >>281 2.1の5で、リダイレクトの処理をしてパラメーターリストから 除去するって書いてあるのと、 6でコマンド名を第0パラメーターとして渡すって書いてるってことは、 先頭もパラメーターリストの一部と解釈できるから、 暗に、先頭にリダイレクトがあってもいいってことを表してるんでは? >>286 明示はされてないのね。 でもありがとう。多分 大丈夫ということでしょう。 >>118 それはオブジェクト指向の話じゃない C++の話だ そもそもテンプレートやジェネリックは、型を明確にすることでバグを少なくしたり 速度を速くするためのもので、オブジェクト指向における問題点を解決するための追加機能 テンプレートやジェネリックを使うことでオブジェクト指向が不要になるのではなく オブジェクト指向と組み合わせて使うことで問題点が改善される テンプレートはオブジェクト指向と組み合わせずに使えたと思うが、 テンプレートの殆ど(ジェネリックは全て)はオブジェクト指向なしに使うことはできない あ、書き込まれてないと思ったら書き込む場所間違えてたのかw シェルというか tar コマンドの問題なんだけど、tar tvf でアーカイブに入っているファイルのタイムスタンプを秒単位まで出す方法ある? Linux で GNU tar のmanページ見た感じではなさそうなんだけど、やはり自作するしかないなかな。 >>292 tar --full-time ... >>293 おお!ありがとう。新しい GNU tar にあるね。 最初CentOS6で試しててわからなかった。これは GNU tar 1.23 だ。 CentOS7は GNU tar 1.26 になっててこちらでは出来るしmanページにも書いてあった。 CentOS 6はそろそろサポート切れるんじゃないかしら 余計なお世話だが移行したほうがいいんでは >>295 するする。仕事でRHEL6のサーバ使っててそれの一部をテストする時に使ってただけなので。 すごい低レベルな質問で申し訳ないんだけど、 win用のGit-bashで.shファイルダブルクリックしたときに DOS窓出さないで実行するのってどうすればいい? >>297 それもはやシェルかどうか関係なくてWindows固有の問題だと思うが、エクスプローラでそのファイル右クリックしてプロパティ出したらそんな感じの設定できるようになってない? 最小化した状態で実行するとか、そんなやつ。 こうだ。 まずショートカット作り、そのショートカットのプロパティ出すと実行時の大きさを指定できる所があって、そこを最小化にすると実行時にタスクバーにアイコン出ているだけになる。 >>298 git-bash.exeだとできませんでしたが、bin/bash.exeでできました! ありがとうございます。 ファイルや標準出力の行数がある数値より大きいことをできるだけ高速に確かめるにはどうすればいいだろう 最も単純で最も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コマンドの失敗の要因が他にもあるので ちょっと不安定かなと。 cで指定行読むコマンドを作ればいい 面倒なこといちいち考える必要がそもそもない >>303 あーなるほど $(<file.txt head -n $num | wc -l) -lt $num とすればいいということですね。 >>305 そのことを意図していったんだけど、 2回走査することになるから 300行飛ばして1行読んだほうがいいか たしかheadで1コマンドでできたでしょ? シェルスクリプトでループで回しながら数えるのと headで300行とってきて、wcで300行数えるのってどっちが速いんだろうかね やればすぐわかるけど、やる気起きないなぁw >>309 シェルスクリプトだとインタープリタの言語みたいな動きになるので遅そうなイメージはあるな。但しうまいこと内部で最適化されれば速くなるかもね。 >>310 いうてもループとカウントと条件分岐だけだからなぁ 内部的にはインタプリタ解釈後の状態になってるだろうし そこでCPUは食わない気がする でもheadでとってきてwcでカウントの部分は並列で実行できるわけで マルチコアなら当然のことながら、シングルコアでもファイルから読み取りの方が 遅いからwcで待たされることはなさそう どちらが速いかは微妙な所だなw ファイルの先頭からLFの数を数えるだけのことを ああでもこうでもないと いちいち考えないといけないオツムのデキを疑うわ。。。 ループってreadのループ? catからパイプしてwhileのreadループってどうなんだっけ 昔作ったシェルでcatしてたファイルを処理中に書き換えたけど 実行されてる処理では書き換える前の内容で処理されてたみたいだから どこかメモリに展開されてるんじゃ catからのパイプでプロセスが終わってるからか? でもリダイレクトやヒアドキュメントでも同じじゃないの? 低学歴知恵遅れの思考形態、世界では すでに用意されているコマンドを組み合わせてシェルスクリプトを書くことが シェルスクリプトを書くことになるという決まりがあるのが このスレみてると分かる >>314 単にバッファに入っていただけとか。カーネルに設定できるバッファサイズなバッファなんぞもしくはcatプログラムのバッファ(の方が小さいだろう、たぶん) もしくは上書きが上書きではなくて削除して新規ファイルに保存とかの場合とか(削除してもどこぞでオープンしていたらクローズされるまでは元のはそのまま残る)、か、OSが他でオープンされていたら上書きでも同じように別に保存してるとか >>313 考えてるのはファイルの先頭からLFの数を数える 「効率がいい方法(コマンド)は何か」だよ LFの数を数えることなんてわかりきったことは考えてない それを実現する方法を考えてる まったくキミは思慮が足りないなw >>314 なんの話をしているのか知らんが、readで普通に一行ずつ処理できる。 catが終わるまで待つなんてことはない なおcatは使わない(標準入力 or ファイルから直接読めばいい) >>312 awkプログラマ、シェルショッカーさんこんちには(笑) 何を噛み付いているのだか。よほど気に食わないことがあるらしいなっw このガキのやり取りもシェルスクリプトスレの日常になりつつあるな >>305 まあこれで今のところ上手くいってるのでいいです。 「シェルスクリプト」を省略するときなんて呼べばいいのかな。 “ss”だと他の用例が多すぎてややこしいし。 “shscp”とか? そもそもシェルでええのにわざわざシェルスクリプトって言いたがる新参者達w こんな感じに script1.sh が script2.sh を呼び出してる状態でさ、 script1.sh └ script2.sh CTRL+Cを押した時、script2.shは止めて、script1.shは 止めないってできるのかなぁ? シグナルって、伝搬というか、上から下へ もしくは 下から上へ 流れていくものなん? ああ、いやトラップはかけてるんだよ script1.sh でINTを無効にすると script2.sh は止まらなくなる >>335 ,337 目的がどこまでどゆのなのかわからんけど、script2.shのシグナルハンドラでkill -SIGTERM $PPIDすればそんな動作にはなるな ああ、script2.shを止めるのか そんなんだったらscript2.shのシグナルハンドラでexitすればいいんじゃないの??また変な縛りとか拘りとかは知らん ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる