X



zsh その7
0001名無しさん@お腹いっぱい。
垢版 |
2012/05/24(木) 16:34:43.03
zshについて語るスレ

http://www.zsh.org/
http://zsh.sourceforge.net/

・過去ログ
zsh その6
http://toro.2ch.net/test/read.cgi/unix/1229010860/
zsh その5
http://pc11.2ch.net/test/read.cgi/unix/1212677877/
zsh その4
http://pc11.2ch.net/test/read.cgi/unix/1107342206/
zsh その3
http://pc5.2ch.net/test/read.cgi/unix/1080002786/
zsh入門 パート2
http://pc3.2ch.net/test/read.cgi/unix/1036324177/
zsh入門
http://pc.2ch.net/test/read.cgi/unix/990283346/
0110名無しさん@お腹いっぱい。
垢版 |
2012/12/29(土) 21:25:32.38
>>93 は dup2 を知らないとよく陥る勘違いですな
FAQ になるのもわかる

せっかく zsh を使ってるのだから
command1 >&- 2> >(command2)
とでもするのが良いのかもしれん
0111名無しさん@お腹いっぱい。
垢版 |
2012/12/29(土) 21:38:57.37
>>109
zsh のデフォルトの setopt multios な環境では意図通りには動かないね
setopt nomultios では大丈夫だけど

デフォルトの環境だと
command1 2>/dev/stdout >&- | command2
ときちんとクローズする必要があるんじゃないかな
0112名無しさん@お腹いっぱい。
垢版 |
2012/12/29(土) 22:23:27.12
>>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

にしたら意図通りエラーが無くなった.リダイレクトの順番で
挙動が変わるのがよくわからんけど,あまり深入りしないほうがいいかな.
011393
垢版 |
2012/12/30(日) 00:58:27.95
>>108
ありがとうございます。そっか、2>&1 を特別視してましたが
これも単なるリダイレクトなんですね。
0114名無しさん@お腹いっぱい。
垢版 |
2012/12/30(日) 16:32:16.44
>>112
代わって深入りしといたよ。
>/dev/null >&- だと最終的に close(1) されてるから無効だけど
>&- >/dev/null だと close(1) 後に open してるから有効になる。

>&- とか <> とかあんまり用途が思い付かなかったけど、
>&- には multios 下での用途があるのか。multios 下でも特殊なことをしなければ不要な気がするけど。
0115名無しさん@お腹いっぱい。
垢版 |
2012/12/30(日) 17:23:02.43
環境によって挙動に予想がつかないところがあるから、結局は
# 伝統的な方法
command1 2>&1 >/dev/null | command2
# プロセス置換を使う
command1 >/dev/null 2>>(command2)
あたりで落ち着くな
念を入れるなら /dev/null のかわりに >&- を使えばいいのか

昔から思ってるけど、リダイレクトの周りの空白の入れ方って悩ましいよね
ファイル記述子の場合は制限があるし
最近は空白を使わずに詰めて書くことが多いかな
0118名無しさん@お腹いっぱい。
垢版 |
2013/01/08(火) 22:50:20.01
配列の要素の最大・最小を返す機能てないですか?こんな感じで
$ a=(1 3 2)
$ echo $a[MAX]
3

さすがにないですかね?でもzshならやってくれそうな気も
0119名無しさん@お腹いっぱい。
垢版 |
2013/01/08(火) 23:30:46.18
変数で大小判定させて
より大きければ変数1をそれにする :MAX処理
より小さければ変数2をそれにする :min処理
というシェルスクリプトでいけそうだな。
0121同じ要領で最小つくればいい
垢版 |
2013/01/09(水) 01:11:52.84
できた。.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
0122名無しさん@お腹いっぱい。
垢版 |
2013/01/09(水) 02:23:48.76
>>120
ありがとうございます。(n)でnumericalソートを意味するんでしょうかね?
ただ、man zshparamを見てみたんですがソート云々のオプションはなさそうでした。
どの辺見ればいいですか?

>>121
いやそれは・・・
0125118
垢版 |
2013/01/09(水) 23:30:08.16
何度もすいません、配列絡みでもう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
0126名無しさん@お腹いっぱい。
垢版 |
2013/01/09(水) 23:49:41.44
>>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
0127118
垢版 |
2013/01/10(木) 00:11:06.98
>>126
4.3.17だったのですが、5.0.2に上げたらあっさりできました・・・
やはりzshはこまめにアップデートしたほうがいいですね。
どうもありがとうございました。
0128名無しさん@お腹いっぱい。
垢版 |
2013/01/10(木) 04:29:38.47
これか
> 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.
0129名無しさん@お腹いっぱい。
垢版 |
2013/01/10(木) 10:41:43.81
  ★★★チベットの独立は日本の核心的利益である★★★
  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

  ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
0131名無しさん@お腹いっぱい。
垢版 |
2013/01/30(水) 00:38:13.63
>>130
そのコード/bin/shだとokみたいやけど、zshやとエラーなるね
ary=(x y z); export ary ってやらないとダメっぽい
あと、typesetでごにょごにょやってもいけるみたいやけど、どっちにしても1ステートメントでは無理なのかも
0132名無しさん@お腹いっぱい。
垢版 |
2013/01/30(水) 03:06:16.11
>>131
うーむary=(x y z); export aryでエラーは出ないんだけど、子プロには届いてないっぽい
shも同じだわ
配列ってそういうもんだったっけ?
0135名無しさん@お腹いっぱい。
垢版 |
2013/01/31(木) 08:42:34.96
そもそもどういう経緯で「配列を環境変数に使える」って思い込みができたんだろう
PATHだって:でくっつけた文字列でしょ?
0136名無しさん@お腹いっぱい。
垢版 |
2013/01/31(木) 15:55:45.30
環境変数という概念が介在していないように見える。
シェル変数をプロセス間で持ち回るにはexport、ぐらいの認識なんじゃね?
0137130
垢版 |
2013/02/01(金) 00:22:47.76
>>135
そんなに変な発想かな?できたらできたで便利だと思うんだけど
実装されていないのは、オーバーヘッドがでかいから? or それとも単に需要がない?

>>136
その程度の認識です、自分あんま詳しくないもんで
つか、正しくは「プロセス間で持ち回る」じゃなくて「子プロセスに渡す」だよね
0138名無しさん@お腹いっぱい。
垢版 |
2013/02/01(金) 00:28:42.05
ちょっと実験してみたのですが

$ 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による属性だからこれも無理かな
0139名無しさん@お腹いっぱい。
垢版 |
2013/02/02(土) 10:49:55.09
環境変数はシェル変数ではないから基本的には用途違い(ともいいきれないか)だけど、
子シェルに配列変数を渡したいってことかな。それも環境変数的に。

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* でなんかすれば
なんとかなんじゃない?
どーしてもやりたければ。
0140130
垢版 |
2013/02/05(火) 02:08:57.36
>>139
例示thx。そのやり方はさすがに面倒なんで諦めます

以前ならawkとかperlとかpythonでやってたような数値演算込みのスクリプト処理を
最近は何でもかんでもzshでやろうとする癖が・・・
0141名無しさん@お腹いっぱい。
垢版 |
2013/02/21(木) 03:45:07.04
関数の中身を履歴に加えることってできませんか?たとえば

$ hoge(){
echo fuga
}
$ hoge
fuga
$ history
  1 hoge(){\necho fuga\n}
  2 hoge

となりますが、こんなふうに関数の中で実行したものも履歴に残って欲しいんです。

$ history
  1 hoge(){\necho fuga\n}
  2 hoge
  3 echo fuga
0144141
垢版 |
2013/02/23(土) 03:41:02.81
>>142
例えばあるファイルをサーチして開く、という自作の関数を実行した後
そのファイルをまた開きたい場合、履歴に入ってればCtrl+Pですぐ呼べますよね。
全関数はもちろんありえないですが、関数の任意の部分をコマンドなりディレクティブなりで
設定してそういうことができたりしないかなと思いまして。

>>143
プロファイラって言うんですかねこういうの?
0145141
垢版 |
2013/02/23(土) 04:51:43.04
すみません、単に print -s でいけました。失礼しました。
0146名無しさん@お腹いっぱい。
垢版 |
2013/03/04(月) 00:37:19.72
echo | cd すると (pwd now: ~) って出るけどこれ何のための仕様かな
別に入力で何か変わるわけじゃないようだけど
0148名無しさん@お腹いっぱい。
垢版 |
2013/03/09(土) 23:52:53.89
あーそうなんだ。

% {echo $ZSH_SUBSHELL}
0
% {echo $ZSH_SUBSHELL} | cat
1
% echo $ZSH_SUBSHELL | cat
0

確かに…?最後が 0 になるのは展開のタイミングかな?
なんで右端が current なのかね。

てか cd の出力理由の話とは違うような。
出力は pipe であることが条件の1つみたいだし、
その条件下では右端で current であることも条件になるかもしれないけど。
0151名無しさん@お腹いっぱい。
垢版 |
2013/03/15(金) 23:36:21.15
>>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 | : =(:)
% : | : =(:)

まあ気にしない方がいいね。
理由がすぐわかるならちょっと知りたいけど。
0154名無しさん@お腹いっぱい。
垢版 |
2013/03/20(水) 11:46:11.62
引数の展開は行う。ので、その副次的結果も発生する。
0156名無しさん@お腹いっぱい。
垢版 |
2013/03/24(日) 12:44:28.54
setopt auto_pushd しておいて
cd -[TAB] して番号でディレクトリを移動できるのが便利なんだけど、
zshの補完機能全般においても、補完候補一覧から番号で選択できるように
できないのかな。
候補が一つになるまで文字入力とTAB入力を繰り返すとか、
TABを何度も入力して候補を選択するとか面倒で…。
0158名無しさん@お腹いっぱい。
垢版 |
2013/03/27(水) 04:24:23.65
anything.elてあのemacsの?
すごいすごいって聞くけどemacs自体使わないのでどうすごいのか分からない
誰か産業でオナシャス↓
0160156
垢版 |
2013/03/28(木) 02:43:23.75
>>157
ディレクトリの移動についてはcdrとzawを入れたらだいぶ楽になった。
これならたしかに番号入力要らない感じ。
あと補完機能全般についてはauto-fuを入れたら少し楽になった。
数年ぶりにzshの設定ファイルをいじったんだけど、
いつの間にかものすごく進化しててびっくり。
0161名無しさん@お腹いっぱい。
垢版 |
2013/04/21(日) 22:13:45.79
http://unix.oskp.net

たまにチェックしてるサイトだがWindows+SFUでzsh動いたみたいだな〜( ̄∀ ̄)

割と便利そうだ
0162 忍法帖【Lv=12,xxxPT】(1+0:8)
垢版 |
2013/04/21(日) 23:02:00.42
cygwinとどっちがいいの?
0163名無しさん@お腹いっぱい。
垢版 |
2013/04/22(月) 08:27:55.62
そういう質問をする人には区別が付かないんじゃないかなあ
0164名無しさん@お腹いっぱい。
垢版 |
2013/04/23(火) 22:56:28.65
cygwinもInterixもただなんだし両方つかってみればどうかな
cygwinはソフト多い、動作遅い

SFUは動くソフト少ない、動作速い

て感じ
0166 忍法帖【Lv=2,xxxP】(1+0:8)
垢版 |
2013/04/24(水) 22:36:07.82
cygwinってなんであんな遅いんやろね……
0167名無しさん@お腹いっぱい。
垢版 |
2013/04/25(木) 01:18:54.85
lessを実行してるのに.zshenvの中身が呼ばれておかしいなと思ってたら
/usr/bin/lesspipe.shの先頭が#!/bin/shになってるせいだった
いやぁ何事かと焦った
0169名無しさん@お腹いっぱい。
垢版 |
2013/04/25(木) 03:26:19.93
昔は遅い遅いと言われてきたが、最近のマルチコア、SSDな環境ではどうなんだろ
案外ストレス感じなかったりして
0171 忍法帖【Lv=2,xxxP】(1+0:8)
垢版 |
2013/04/25(木) 07:40:15.22
>>168
じゃあ各種コマンドはどうすんの?mingw?
0172名無しさん@お腹いっぱい。
垢版 |
2013/04/25(木) 08:59:39.61
CygwinはWindowsサブシステムやAPIを経由してNTカーネルとやりとりするけど、
SFU(SUA)はInterixサブシステムが直接NTカーネルとやりとりするんだが、オーバーヘッドが少ない分、動作が速いらしい。

昔のSFUはCygwinと同じUNIXらいくなツールセットだったけど InterixサブシステムはNTカーネルで動くUNIXレイヤーなのでネイティブ反応速度が可能
0173名無しさん@お腹いっぱい。
垢版 |
2013/04/25(木) 22:23:34.52
便利そうで意外に使ってる人を見ない>SFU

つか、最近のWindowsはマシなシェルを備えてるんじゃなかった?よく知らんけど
0175名無しさん@お腹いっぱい。
垢版 |
2013/04/26(金) 23:34:05.62
すみません,凄く単純な質問があります.

% a="-l"
% ls $a
→ OK

% a="-l -a"
% ls $a
ls: 無効なオプション -- ' '

後者でエラーがでるのを回避するにはどうすればよいのでしょうか?
echo ls $a は「ls -l -a」なので,エラーになる理由がよく分かりません.

参考になるサイトだけでも紹介いただけるとありがたいです.
よろしくお願いいたします.
0176名無しさん@お腹いっぱい。
垢版 |
2013/04/26(金) 23:44:22.86
FAQ だね

zsh はデフォルトでは空白分割しない
一時的に ls ${=a} として挙動を変えるか
setopt SH_WORD_SPLIT でデフォルトを変更するか

普段から zsh スクリプトを書いてるとデフォルトの動作の方が楽だな
まあ楽をするために敢えてこうしてるはずだが、他のシェルに合わせる人も多いな
0181名無しさん@お腹いっぱい。
垢版 |
2013/04/29(月) 22:00:05.61
$=a でだめな理由が?
zsh 以外でも動くようにとか?

まあ >>179 でいいと思うけど。

>>178
分割してほしくないとき。そういうことはきいてない?
簡単な例だと

% ls -1
a
b b
c
% for i in *; ls $i

とか。当然 shwordsplit でも "$i" と書けばいい。言うまでもないか。
それがいちいち面倒、というかどんなデータがくるか判らなかったり、
多くのファイルがあって全ファイル名を把握してないときに
space がきてもいいようにとりあえず "$i" って書くなら
最初からそれがデフォルトの方が助かる。
分けたきゃ >>179 みたいにも書けるしね。

単なる文字列として変数に入れてるのに
たまたま space が入ってると意図しない分割になるんが厄介。
ものによるけど、指定したときだけそう動いてくれればいい。特に使い捨てではないスクリプトでは。

なんか書いてたら長くなった。失礼。
0182名無しさん@お腹いっぱい。
垢版 |
2013/05/01(水) 02:22:13.74
space含む場合は確かに便利かも。自分の場合はまずないので
それじゃあbashと同じでいいやって感じかな。まぁ好みの問題か
0184名無しさん@お腹いっぱい。
垢版 |
2013/05/06(月) 18:02:00.60
for ((count = 0.0; count < 1.0; count += 0.05))
do
echo $count
done

これの出力結果は、
0.0000000000
0.0500000000
0.1000000000
...
といった感じになります。
出力の桁数の調整はどうしたらできるでしょうか???
0188名無しさん@お腹いっぱい。
垢版 |
2013/05/10(金) 00:03:18.93
>>187
知らんかったからman引いてみた
zshall で見つからんかったけど、man bash に載ってた
> The current set of options may be found in $-.
一応試してみると
% echo $-
05689JNXZghiklms
% setopt +0
% echo $-
5689JNXZghiklms

になるから、bash と同じように扱われてるっぽい
0198名無しさん@お腹いっぱい。
垢版 |
2013/06/03(月) 23:05:06.97
$(builtin foo) って command bar くらいのコストかかんだね。
同じ桁くらいの。
まあそれはそうか。 (builtin foo) みたいに subshell 内みたいだし。
でも $(<foo) みたいに速いといいよなあ。
普通気にしないだろうけど。
0199名無しさん@お腹いっぱい。
垢版 |
2013/06/06(木) 07:42:18.91
ビルドに挑戦したんだけど、zsh.mdhが作られなくて失敗する。
で、いろいろ試して、
export GREP_OPTIONS='--color=auto --binary-files=without-match -Hn'
が原因。ファル名と行番号は常に表示したいから設定してたんだけどなぁ。
0200名無しさん@お腹いっぱい。
垢版 |
2013/06/06(木) 16:58:39.47
出力の形式を変更しちゃうようなのをデフォルト設定するのはどうかと。
grepはシェルスクリプトなどでも使われるわけだし。
そういう設定はシェルのエイリアスとかを使うのがいいんじゃない。
0203名無しさん@お腹いっぱい。
垢版 |
2013/06/07(金) 15:33:58.76
結局aliasに戻したんだけど、GNU grep検出した時点で、configureが
GREP_OPTIONSをクリアしてくれても良い気はするの。
0206名無しさん@お腹いっぱい。
垢版 |
2013/06/21(金) 11:15:57.03
locateを使ったファイル名補完ってできますか?
$ vi http<キー>
でlocate httpの結果を補完候補にしてくれるような。
できれば通常の補完とは使い分けたいので、別のキーに割り当てられるといいんですが。
0207名無しさん@お腹いっぱい。
垢版 |
2013/06/21(金) 13:50:45.82
>>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
}
0208名無しさん@お腹いっぱい。
垢版 |
2013/06/21(金) 23:55:39.39
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をインクリメンタルサーチするとか…
でもやっぱりできるならシェルでやるのが一番便利でしょうね。
0209名無しさん@お腹いっぱい。
垢版 |
2013/06/22(土) 01:07:55.66
>>208
r:とかl:とか色々でてきてあきらめた…でも動いたようで良かったですな。
そういうツールは聞いたことないけど、UNIX的思想からいくとlocateの結果をgrepでフィルタして…となりそう
レスを投稿する


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