zsh その7
>>93 は dup2 を知らないとよく陥る勘違いですな FAQ になるのもわかる せっかく zsh を使ってるのだから command1 >&- 2> >(command2) とでもするのが良いのかもしれん >>109 zsh のデフォルトの setopt multios な環境では意図通りには動かないね setopt nomultios では大丈夫だけど デフォルトの環境だと command1 2>/dev/stdout >&- | command2 ときちんとクローズする必要があるんじゃないかな >>111 うーむ,ほんとだ.複数リダイレクトできるのも便利なんだが. bash でいけるならいいか.シェルスクリプトで zsh は使わないよね? setopt multios の状態で,試しにクローズしてやってみたけど, $ command1 2>/dev/stdout >&- | command2 command1: line n: write error: Bad file descripter と怒られる.command1 の 1 を破棄しないといけないのかと思ったが $ command1 2>/dev/stdout >/dev/null >&- | command2 command1: line n: write error: Bad file descripter 変わらず. $ command1 2>/dev/stdout >&- >/dev/null | command2 にしたら意図通りエラーが無くなった.リダイレクトの順番で 挙動が変わるのがよくわからんけど,あまり深入りしないほうがいいかな. >>108 ありがとうございます。そっか、2>&1 を特別視してましたが これも単なるリダイレクトなんですね。 >>112 代わって深入りしといたよ。 >/dev/null >&- だと最終的に close(1) されてるから無効だけど >&- >/dev/null だと close(1) 後に open してるから有効になる。 >&- とか <> とかあんまり用途が思い付かなかったけど、 >&- には multios 下での用途があるのか。multios 下でも特殊なことをしなければ不要な気がするけど。 環境によって挙動に予想がつかないところがあるから、結局は # 伝統的な方法 command1 2>&1 >/dev/null | command2 # プロセス置換を使う command1 >/dev/null 2>>(command2) あたりで落ち着くな 念を入れるなら /dev/null のかわりに >&- を使えばいいのか 昔から思ってるけど、リダイレクトの周りの空白の入れ方って悩ましいよね ファイル記述子の場合は制限があるし 最近は空白を使わずに詰めて書くことが多いかな さっぱり話題についていけん・・・(´・ω・`) manを読む努力せんとなぁ >>115 リダイレクト先がファイルパスなら空白入れてるわ 数字なら詰めて書く…っていうか詰めないと駄目か? 配列の要素の最大・最小を返す機能てないですか?こんな感じで $ a=(1 3 2) $ echo $a[MAX] 3 さすがにないですかね?でもzshならやってくれそうな気も 変数で大小判定させて より大きければ変数1をそれにする :MAX処理 より小さければ変数2をそれにする :min処理 というシェルスクリプトでいけそうだな。 echo ${${(n)a}[-1]} とか。${} が二重になるのがちょっといやなんだよなあ。 できた。.zshrcに書いて0以上の整数値を因数にぶちこんで動作する Max() { x=$1 for i in $@ do if test $x -lt $i ; then ^ x=$i fi done echo $x } ********* 動作の一例 ********* Max -10 -1 -1 Max -10 2 -1 1 2 >>120 ありがとうございます。(n)でnumericalソートを意味するんでしょうかね? ただ、man zshparamを見てみたんですがソート云々のオプションはなさそうでした。 どの辺見ればいいですか? >>121 いやそれは・・・ 何度もすいません、配列絡みでもう1つ質問させてください。 zshの配列の要素数って上限ありますか? $ test=({1..300000}) $ echo $test[270000] zsh: subscript too big: 270000 bashだとちゃんと返してくれるのですが・・・。 $ for((i=1;i<300000;i++)) ; do test[$i]=$i ; done $ echo ${test[270000]} 270000 >>125 やってみたけど、 $ test=({1..300000}) $ echo $test[270000] 270000 $ echo $ZSH_VERSION 5.0.0 $ uname -a Darwin thyme.local 12.2.1 Darwin Kernel Version 12.2.1: Thu Oct 18 16:32:48 PDT 2012; root:xnu-2050.20.9~2/RELEASE_X86_64 x86_64 i386 MacBookAir5,2 Darwin >>126 4.3.17だったのですが、5.0.2に上げたらあっさりできました・・・ やはりzshはこまめにアップデートしたほうがいいですね。 どうもありがとうございました。 これか > The arbitrary limit on parameter subscripts (262144) has been removed. As it was not > configurable and tested in an inconvenient place it was deemed preferable to remove it completely. > The limit was originally introduced to prevent accidental creation of a large parameter array > by typos that generated assignments along the lines of "12345678=0". The general advice is not to do that. ★★★チベットの独立は日本の核心的利益である★★★ http://jbbs.livedoor.jp/bbs/read.cgi/study/3729/1226114724/78 ¥¥¥¥¥¥¥『万有サロン』書き込み大賞・総額100万円¥¥¥¥¥¥¥¥¥¥¥¥ この掲示板に優秀な書き込みをして、総額100万円の賞金をゲットしよう!(*^^)v 万有サロン http://jbbs.livedoor.jp/study/3729/ 書き込み大賞の詳細 http://jbbs.livedoor.jp/bbs/read.cgi/study/3729/1069922074/78- 書き込み大賞の詳細(資料倉庫内) http://www2.tba.t-com.ne.jp/a-z/omake/banyu/taisho.htm また、あらゆる疑問に関する質問を、携帯電話やメールでも受け付けています。 電話番号 080-4437-4187 メール aaa-zzz@tba.t-com.ne.jp ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ 配列をexportするのって駄目なんだっげ? export array=(a b c)てやったら怒られた >>130 そのコード/bin/shだとokみたいやけど、zshやとエラーなるね ary=(x y z); export ary ってやらないとダメっぽい あと、typesetでごにょごにょやってもいけるみたいやけど、どっちにしても1ステートメントでは無理なのかも >>131 うーむary=(x y z); export aryでエラーは出ないんだけど、子プロには届いてないっぽい shも同じだわ 配列ってそういうもんだったっけ? >>132 配列はexportできんらしい。しらんかた ttp://www.bookshelf.jp/2ch/unix/1266642605.html#125 ttp://www.mazn.net/blog/2008/11/29/161.html そもそもどういう経緯で「配列を環境変数に使える」って思い込みができたんだろう PATHだって:でくっつけた文字列でしょ? 環境変数という概念が介在していないように見える。 シェル変数をプロセス間で持ち回るにはexport、ぐらいの認識なんじゃね? >>135 そんなに変な発想かな?できたらできたで便利だと思うんだけど 実装されていないのは、オーバーヘッドがでかいから? or それとも単に需要がない? >>136 その程度の認識です、自分あんま詳しくないもんで つか、正しくは「プロセス間で持ち回る」じゃなくて「子プロセスに渡す」だよね ちょっと実験してみたのですが $ zsh --version zsh 5.0.2 (x86_64-redhat-linux-gnu) $ typeset -ix i $ i=1 $ typeset -ax a $ a=(a b) $ typeset +m i integer exported i $ typeset +m a array exported a $ cat file typeset +m i echo "i="$i typeset +m a echo "a="$a $ zsh file exported i i=1 a= 結局、typeset -xすると、-iや-aなどの他の属性が消されてしまうということかな 関数のexportもできたら便利だと思ったけど、関数はtypest -fによる属性だからこれも無理かな 環境変数はシェル変数ではないから基本的には用途違い(ともいいきれないか)だけど、 子シェルに配列変数を渡したいってことかな。それも環境変数的に。 export ENV="$(typeset -p i a)" zsh -c 'eval $ENV; ...' とかはしたくないってことなんだよね。 typeset -xT FOO foo が近いかな。これも子シェルで typeset しないとだめだから大差ないか。 ついでに separator と同じ文字が使えないし。 typeset -xT FOO foo foo=(a b) zsh -c 'typeset -xT FOO foo; ...' どこで使うのかしらないけど↑の ENV みたいなんを .zsh* でなんかすれば なんとかなんじゃない? どーしてもやりたければ。 >>139 例示thx。そのやり方はさすがに面倒なんで諦めます 以前ならawkとかperlとかpythonでやってたような数値演算込みのスクリプト処理を 最近は何でもかんでもzshでやろうとする癖が・・・ 関数の中身を履歴に加えることってできませんか?たとえば $ hoge(){ echo fuga } $ hoge fuga $ history 1 hoge(){\necho fuga\n} 2 hoge となりますが、こんなふうに関数の中で実行したものも履歴に残って欲しいんです。 $ history 1 hoge(){\necho fuga\n} 2 hoge 3 echo fuga 否定する気はないけど、何のために? 対象って全関数じゃないよね。 プロファイラがほしいってこと? 大地氏の software design 記事のデバッグ編見た方がよさそう >>142 例えばあるファイルをサーチして開く、という自作の関数を実行した後 そのファイルをまた開きたい場合、履歴に入ってればCtrl+Pですぐ呼べますよね。 全関数はもちろんありえないですが、関数の任意の部分をコマンドなりディレクティブなりで 設定してそういうことができたりしないかなと思いまして。 >>143 プロファイラって言うんですかねこういうの? すみません、単に print -s でいけました。失礼しました。 echo | cd すると (pwd now: ~) って出るけどこれ何のための仕様かな 別に入力で何か変わるわけじゃないようだけど zsh はパイプラインの右端はカレントシェルで実行されるから ksh 系以外のシェルとは挙動が変わる あーそうなんだ。 % {echo $ZSH_SUBSHELL} 0 % {echo $ZSH_SUBSHELL} | cat 1 % echo $ZSH_SUBSHELL | cat 0 確かに…?最後が 0 になるのは展開のタイミングかな? なんで右端が current なのかね。 てか cd の出力理由の話とは違うような。 出力は pipe であることが条件の1つみたいだし、 その条件下では右端で current であることも条件になるかもしれないけど。 cd でカレントディレクトリが変わるから注意喚起してるんでは 最後が 0 になるのは echo が内部コマンドでフォークする必要がないから >>149 あー普通 pipe でディレクトリ変えることないから何かおかしいんじゃないかって?かねえ。 >>150 内部コマンドって builtin のこと?だとすると ↓ の説明がつかないかと。 というかその条件は {echo $ZSH_SUBSHELL} でも同じような。 % command echo $ZSH_SUBSHELL | cat 0 % /bin/echo $ZSH_SUBSHELL | cat 0 つかまたちょっと色々試してたらよくわからんことにでくわしてしまった。 1つめは固まらないで2つめが固まる。builtin/command で固まるか変わる。 うーん… % : 1>&2 | : =(:) % : | : =(:) まあ気にしない方がいいね。 理由がすぐわかるならちょっと知りたいけど。 引数の展開は行う。ので、その副次的結果も発生する。 >>152 run-help : でわからないかな。 setopt auto_pushd しておいて cd -[TAB] して番号でディレクトリを移動できるのが便利なんだけど、 zshの補完機能全般においても、補完候補一覧から番号で選択できるように できないのかな。 候補が一つになるまで文字入力とTAB入力を繰り返すとか、 TABを何度も入力して候補を選択するとか面倒で…。 >>156 zsh anything.el-like widget https://github.com/zsh-users/zaw これを一般の補完候補に拡張すればいいんだろうけど、 そんなに必要か? anything.elてあのemacsの? すごいすごいって聞くけどemacs自体使わないのでどうすごいのか分からない 誰か産業でオナシャス↓ >>157 ディレクトリの移動についてはcdrとzawを入れたらだいぶ楽になった。 これならたしかに番号入力要らない感じ。 あと補完機能全般についてはauto-fuを入れたら少し楽になった。 数年ぶりにzshの設定ファイルをいじったんだけど、 いつの間にかものすごく進化しててびっくり。 http://unix.oskp.net たまにチェックしてるサイトだがWindows+SFUでzsh動いたみたいだな〜( ̄∀ ̄) 割と便利そうだ そういう質問をする人には区別が付かないんじゃないかなあ cygwinもInterixもただなんだし両方つかってみればどうかな cygwinはソフト多い、動作遅い SFUは動くソフト少ない、動作速い て感じ 動作の遅さでzsh含めたUnix環境あまり使ってなかったから SFUに手を出してみるかな。 lessを実行してるのに.zshenvの中身が呼ばれておかしいなと思ってたら /usr/bin/lesspipe.shの先頭が#!/bin/shになってるせいだった いやぁ何事かと焦った >>166 cygwinはminttyだけあればいい 昔は遅い遅いと言われてきたが、最近のマルチコア、SSDな環境ではどうなんだろ 案外ストレス感じなかったりして fork&execまわりが特に遅いと思う。もともとWindowsにない機能だから しょうがないとは思うけど。 >>168 じゃあ各種コマンドはどうすんの?mingw? CygwinはWindowsサブシステムやAPIを経由してNTカーネルとやりとりするけど、 SFU(SUA)はInterixサブシステムが直接NTカーネルとやりとりするんだが、オーバーヘッドが少ない分、動作が速いらしい。 昔のSFUはCygwinと同じUNIXらいくなツールセットだったけど InterixサブシステムはNTカーネルで動くUNIXレイヤーなのでネイティブ反応速度が可能 便利そうで意外に使ってる人を見ない>SFU つか、最近のWindowsはマシなシェルを備えてるんじゃなかった?よく知らんけど すみません,凄く単純な質問があります. % a="-l" % ls $a → OK % a="-l -a" % ls $a ls: 無効なオプション -- ' ' 後者でエラーがでるのを回避するにはどうすればよいのでしょうか? echo ls $a は「ls -l -a」なので,エラーになる理由がよく分かりません. 参考になるサイトだけでも紹介いただけるとありがたいです. よろしくお願いいたします. FAQ だね zsh はデフォルトでは空白分割しない 一時的に ls ${=a} として挙動を変えるか setopt SH_WORD_SPLIT でデフォルトを変更するか 普段から zsh スクリプトを書いてるとデフォルトの動作の方が楽だな まあ楽をするために敢えてこうしてるはずだが、他のシェルに合わせる人も多いな lsのオプションの l と a とは -la と書けるからこれでどうだ? 空白問題は解かずに回避できないか? ヘビーユーザはそっちほうが多いのかな 例えばどういうときに楽ですか? $=a でだめな理由が? zsh 以外でも動くようにとか? まあ >>179 でいいと思うけど。 >>178 分割してほしくないとき。そういうことはきいてない? 簡単な例だと % ls -1 a b b c % for i in *; ls $i とか。当然 shwordsplit でも "$i" と書けばいい。言うまでもないか。 それがいちいち面倒、というかどんなデータがくるか判らなかったり、 多くのファイルがあって全ファイル名を把握してないときに space がきてもいいようにとりあえず "$i" って書くなら 最初からそれがデフォルトの方が助かる。 分けたきゃ >>179 みたいにも書けるしね。 単なる文字列として変数に入れてるのに たまたま space が入ってると意図しない分割になるんが厄介。 ものによるけど、指定したときだけそう動いてくれればいい。特に使い捨てではないスクリプトでは。 なんか書いてたら長くなった。失礼。 space含む場合は確かに便利かも。自分の場合はまずないので それじゃあbashと同じでいいやって感じかな。まぁ好みの問題か space含む場合に便利ってより、逆だとspace含む場合にわずらわしいって感じかな。 for ((count = 0.0; count < 1.0; count += 0.05)) do echo $count done これの出力結果は、 0.0000000000 0.0500000000 0.1000000000 ... といった感じになります。 出力の桁数の調整はどうしたらできるでしょうか??? なるほど。これは便利 % printf '%.2f\n' 0.3333333333 0.33 >>187 知らんかったからman引いてみた zshall で見つからんかったけど、man bash に載ってた > The current set of options may be found in $-. 一応試してみると % echo $- 05689JNXZghiklms % setopt +0 % echo $- 5689JNXZghiklms になるから、bash と同じように扱われてるっぽい >>188 ありがとう 自分もzshall見たのですが記載がないぽいんですよね 載ってるやん - <S> Flags supplied to the shell on invocation or by the set or setopt commands. zshallを見ると、自分はzshの全機能の1割も使ってないかもなぁ、と思えてくる それでいいのだ (ごみの山の中に一片の価値のあるものを見つけられたならそれは幸せである) うむ zshに限らないけど、何年たっても「こういう機能があったんだ!」て気付くのが楽しいね $(builtin foo) って command bar くらいのコストかかんだね。 同じ桁くらいの。 まあそれはそうか。 (builtin foo) みたいに subshell 内みたいだし。 でも $(<foo) みたいに速いといいよなあ。 普通気にしないだろうけど。 ビルドに挑戦したんだけど、zsh.mdhが作られなくて失敗する。 で、いろいろ試して、 export GREP_OPTIONS='--color=auto --binary-files=without-match -Hn' が原因。ファル名と行番号は常に表示したいから設定してたんだけどなぁ。 出力の形式を変更しちゃうようなのをデフォルト設定するのはどうかと。 grepはシェルスクリプトなどでも使われるわけだし。 そういう設定はシェルのエイリアスとかを使うのがいいんじゃない。 なぜだろう、alias ではなく環境変数を使いたい そういやgrepyのオプションは色々トラブルの元になると聞くね 自分もエイリアスにしてるわ 結局aliasに戻したんだけど、GNU grep検出した時点で、configureが GREP_OPTIONSをクリアしてくれても良い気はするの。 ママは死んだ。もういない。あのときパパに alias をみられなければ… locateを使ったファイル名補完ってできますか? $ vi http<キー> でlocate httpの結果を補完候補にしてくれるような。 できれば通常の補完とは使い分けたいので、別のキーに割り当てられるといいんですが。 >>206 zshに死角なし…あとはよろしく man zshcompwid の COMPLETION MATCHING CONTROL を理解すればなんとかなりそう zle -C loc menu-expand-or-complete _loc bindkey '^X^X' loc _loc() { files=($(locate $words[2])) # ここのパターンの指定をどうにかすればいけそう compadd -M 'e:.=**' $files } anchorという意味がよくわからないけど、こんな感じにしたら動いているようです。 _loc() { local wd=$words[-1] if [ "$wd" = "" ]; then return 0 fi files=($(locate $wd | grep ".*${wd}[^/]*$")) compadd -M 'l:||.=**' -- $files } ちなみに、これを思いついたのはEverythingが便利すぎるからなんですが、 http://www.voidtools.com/ unixコマンドラインで同じようなのってないんでしょうか。 cursesでlocateをインクリメンタルサーチするとか… でもやっぱりできるならシェルでやるのが一番便利でしょうね。 >>208 r:とかl:とか色々でてきてあきらめた…でも動いたようで良かったですな。 そういうツールは聞いたことないけど、UNIX的思想からいくとlocateの結果をgrepでフィルタして…となりそう read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる