zsh その7
>>278 特に感じないけど。どの辺で遅い? >>277 Release Notesにあった5.0.5の新機能で FORCE_FLOAT って超便利なオプションがあるけど これメーリスに投げてから1日足らずでレス来てるのな。 サクッとできることはサクッとやってくれそう。 http://www.zsh.org/mla/users/2013/msg00145.html FORCE_FLOAT付けたら./configure --<タブ>が変なエラーになる・・・何なのこれ $ ./configure -- (eval):local:1: not valid in this context: _a_1.1 _describe:102: not an identifier: _a_1.1 >>278 俺は個人的にzshrcがもっさりしてるので遅い。 一回ふきとばしてみたら? >>279 >>281 .zcompdumpを作るのに異常に時間がかかってる autoload -Uz compinit compinit -u をコメントアウトするとすぐ起動する. ホームディレクトリをNFSにしてるからかなぁ? >>282 http://my.opera.com/ymirlin/blog/2011/02/01/nfs-home-zsh mkdir /tmp/hoge chmod 700 /tmp/hoge ln -s /tmp/hoge/.zcompdump $HOME autoload -Uz compinit compinit -u というのはどうだろう sshからログインと同時に指定したシェルスクリプトを実行したいんだが % ssh user@example "export INC='~/setup.zsh';zsh" 接続先の~/.zshrcには$INCが定義されてるならsource $INCするように書いてる もっとシンプルに % ssh user@example "~/setup.zsh" setup.zsh実行後にzshを終了せず対話型になるみたいなことって出来ませんかね? >>285 setup.zshの最後にexec zshして、 ssh -t user@example setup.zshしたら? >>286 まあssh -tしわすれたときのために [[ -t 0 ]] && exec zsh かな? 素早い返信ありがとうございます exec zshだとsetup.zshで定義されるシェル変数や関数などが維持できないようです。。。 .zshrcに依存することにはなるが、.zshrcから適当なフラグを立てたうえでsource $INCすることでできました % ssh user@example 'cat setup.zsh .zshrc' #setup.zsh if [ -z $FLAG ] ;then export INC=setup.zsh exec zsh else (省略) fi #.zshrc if [ -n $INC ];then export FLAG=true source $INC fi % ssh -t user@example setup.zsh >>288 ああ、シェル変数やらはそうだろうね。 だったらexpect使ったら? #!/usr/bin/expect spawn "zsh" expect "%"{ send "source hoge.zsh\n" } interact でやりたいことはできそうだけど >>289 おおおこれは便利だ こっちでやってみます >>284 ありがとうございます! やってみたら,なぜかマシンによってセキュリティチェックがあるのとないのがありますね. >>291 もしかしたら/tmpが0777のマシンと1777のマシンじゃないか? なんとなく言ってみるけどselinuxが悪さしてることってない? そういやmacはデフォルトのログインシェルがzshなんだっけ 10.2 まで tcsh 10.3 からいまのところ bash zsh は5.0.2が入ってるけど、デフォルトログインシェルにはなってない。 あ、そうなんだスマソ デフォルトでインストールされてるってだけか なんかCentOS4.5のzsh-4.2.0が.zshenvを読んでないっぽいんだけどなんで? まあ管理権限ないから$HOMEにzsh-5.0.5入れたけど…… てか4.5とか古いなw そっちに原因があったりして 研究室の鯖なかなか更新してくれないんだよね。 CentOS固有の問題なのかな? zsh-4.2.0なんて何年前だろ とりあえず新しいのを自分でビルドしてユーザ領域に置いてみたら? 話題か。 >>258 の件で $HISTFILE に elapsed times が残るようになったのはいいんだけど、 実行中に別 zsh 起こしてその履歴使ったり history -D したりできなくなってしまった。(当然) とりあえず放置してるけど。 これでもいいような、そうでもないような。 share_history は前のまま実行前に追加するみたい。(elapsed times が残らない。) てか share_history って imported lines と local lines 分けてるんだね。 昔は違った気がするけど。 あと import タイミングが行編集終了時。最初、終了前に履歴辿って効いてないのかと思った。 zargs -r -- $HOME/.zshfunc/*(N:t) -- autoload で.zshfunc以下に定義してある関数を全部読みこもうとしたんだけど、 関数内でこいつを呼びだすと動かなくて ttyで呼びだすと動いてるっぽい。なんでだろう? CENTOS6.3でzshを立ち上げると、/bin/lsコマンドが /bin/ls: fork failed: リソースが一時的に利用できません といって動いてくれません。bashだと大丈夫。他のコマンドだと大丈夫。zshとlsでなんかもんだいあるんでしょうか? >>309 の件、自己解決しました。 .zshrcの中に変なaliasを定義していたのが原因でした。 >>308 それ tty でも動いてないんじゃない? あと zargs の意味ない気がするけど、-r のために使っているとか? あれ、確かにttyでも動いてないっすね。なんで以前は動いたと思ったんだろう。 zargs が subshell内で eval してるっぽいから意味ないんだと思う。 -r が目的なら () { (( $# )) && autoload $@ } $HOME/.zshfunc/*(N:t) でいいんじゃないか? setopt次第で "$@" かな。 exit 1 だけどエラーメッセージ出ないからいいよね? >>314 ほんとだ、()でかこってあった… > () { (( $# )) && autoload $@ } $HOME/.zshfunc/*(N:t) forで逃げてましたが使わせていただきます。ありがとうございます。 無名関数に引数を渡せるようになっていたとは知らんかった プロンプトに$LINENOを表示させてみようと思ったら上手く行かなかった、環境変数って読めない感じ? うまくいかないのがよくわからないけど普通に1とか2が出力されたよ どっかの設定がおかしいんじゃね >>319 は $LINENO と ${LINENO} が違うものだと思ってるのかよw >>317 はそうと知らずに$LINENOの後に続けてコロンとモディファイアになる文字を書いちゃったのかもね そういう場合は>>319 がいうように${LINENO}にすれば回避できる ${LINENO} とか中途半端な書き方せずに "$LINENO" と書くのがお勧め。 いや、 PS1=$LINENO とかやっても $LINENO の値が動的に変わるわけじゃないって話だろw ごめん。一般の変数の展開と勘違いした。 マニュアル読むと LINENO はスクリプトの中で使うだけみたいだな。 プロンプトの行番号の概念がはっきりしないんだけど、これはイメージどおり? PS1="%h $" %h, %!, ! だと履歴の番号になるみたい。 >>324 まあプロンプトにLINENOがあっても?だけど普通にログインシェルでも立ち上げてからの行数でるよ cd -[TAB] で表示されるディレクトリスタックをいじることってできますか? m〜n番目のエントリを削除、とかがしたいです dirsコマンドにはそれらしい方法はなさそうでした 現在の設定のままroot権限持つことって可能ですか? $ZDOTDIRを〜〜、ではなく現在のシェルで設定した変数を保持したままで、ということです。 sudoすれば良いだろ、というのはなしでお願いします いつの間にかipの補完ができなくなった ssh hoge@XXXのXXXが数字だと補完してくれない みんなできてる? IP補完なんてできるのか て、試したらできなかったわ >>329 できてるで % ssh foo@10.5.5.<tab> 10.5.5.1 10.5.5.2 10.5.5.3 10.5.5.4 % zsh --version zsh 5.0.5 (x86_64-apple-darwin13.0.0) _ssh は zsh 付属のやつっぽい >>329 _ssh ちょっと読んでみたけど ip アドレスは、.ssh/config に書いてあるやつしか補完されないっぽいな… function print_known_hosts (){ test -f /etc/hosts && sed -e 's/#.*//' /etc/hosts test -f $HOME/.ssh/known_hosts && tr ',' ' ' <$HOME/.ssh/known_hosts | cut -d ' ' -f1 | sed -e '/^|1|/d;s/^\[\(.*\)\]:[0-9][0-9]*$/\1/' test -f ~/.host.completion && cat ~/.host.completion } _cache_hosts=($(print_known_hosts | tr '[:blank:]' "\n" | sort -u)) ってやって.ssh/known_hostsに書いてあるやつは補完できるようにしてるわ あ、上記はもちろん.ssh/known_hostsがハッシュされてると動きませんあしからず zparseoptsを使ってオプション引数だけの入った配列を得る方法ってないですかね? オプション自体を手動で取り除くしかないですか? alias -g G='| grep' alias -g H='| head' alias -g T='| tail' などのグローバルエイリアスをしてる人多いと思いますが、 特定のコマンドの後ろに付ける場合は無視するようにはできませんか? 普段lsに--group-directories-firstオプションをつけてるんですが zshのglobをこれと同じソート順にしたいです どうすればいいですかね PROMPTの%(?,,)の構文の挙動がおかしくないですか? 試しに下記のようなコマンドを入力すると逆の結果を返しており、psvar[2]を見て判断しているように思えます。 precmd(){} psvar=( '0' '1' ) PROMPT='%? %1(?,success,error) %# ' sh -c 'exit 1' : これはバグでしょうか。それとも僕が何か勘違いしているのでしょうか zsh 5.0.5 (x86_64-unknown-linux-gnu) >337 使ってる人いるんですか,global alias alias 設定した文字(列)を引数に書いた瞬間に死亡する, という挙動のリスクが大きくて, たいしたことない利便性ではリスクに見合わない印象 クッソ便利で使うのが当たり前だと思ってたけど自分だけかな? 確かに気をつかないといけないけどさ・・・ まぁだから>>337 を書いたわけですが たった6文字ぐらい手で打てよ お前今にとんでもないトラブル起きるぞ % LD_LIBRARY_PATH= だとファイルリストが補完できるかと思うんですが、同じことを % env LD_LIBRARY_PATH= でもできるようにするにはどんな設定すればいいですかね? tab以外のキーに _complete_files をバインドして補完しても complete-files: no matches found: LD_LIBRARY_PATH=* とかなってしまいます。。。 編集子について質問させてください fullpathをチルダ付きpathに変換したいのですがうまくいきません $ echo '/Users/xxx/doc/aaa.txt' | read fn; echo ${fn:s/$HOME/~/} ご教示お願い致しますm(_ _)m >>345 すんません。自己解決しました ${fn/$HOME/'~'} でした。 補完絡みで質問です。 パッケージインストール直後や、~/bin等にスクリプト入れた直後だと補完に候補が出てこない(source .zshrcすればok)。 bashだと、直ぐ補完に反映されてるので何かオプションがありそうですが教え下さい。 >>348 オプションでは無いんですかね。 都度打つのが面倒なんで、、、 皆あまり気にならない? aliasにするか、cd辺りでrehashを自動化ってことなのかな。 そんなコマンドあったのか、今までexec zshして丸ごと入れ替えてた 補完に反映なら zstyle ':completion:*' rehash 1 か zstyle ':completion:*:commands' rehash 1 に絞ってもいいかもしれんが なんでそんなにしょっちゅうrehashが必要なんだろ。 gitで管理してるディレクトリの時だけ、 プロンプトにmasterとかサブブランチの情報が欲しい ググった奴コピペしたのは管理してないところでmasterになってて邪魔だった 管理外でmasterって出るってgitの出力使ってないじゃん どこから出力得てるんだ a=(1 2); b=(3 4 5); foo $a $b みたいな感じで foo にリストを引数として渡す場合には foo はどう書けば良かろうか? あ、a や b の要素数は可変で。 a と b を繋げたリストでよければ foo の中で c=($*) すればいいっぽいけど、別々に欲しい。 あれ local c=($*) したらエラーになるのはなんでだ? >>358 自分も昔ハマったことがあるが、local では配列の宣言と同時には代入ができないみたい 359 が言うように変数名を渡す方法が最初に思い付くけどもっと良い方法があるのかな? % a=(1 2); b=(3 4 5) % foo() {local A B; A=(${(P)1}); B=(${(P)2}); echo "$1[2] -> $A[2], $2[2] -> $B[2]"} % foo a b a[2] -> 2, b[2] -> 4 なるほど、名前自体を見て処理すれば良いのか、勉強になりました。 ちなみに bash だと local で宣言と同時に代入ができるみたい。なぜだ。 { for i in {1..10..2} で1,3,5,・・・,9と { } 増分 あれ、途中で変なふうに書き込んでしまいました。すいません {1..9..2}で、1,3,5,・・というふうに増分2で展開されますが、1,2,4,8,・・・というふうに 累乗的に増えていくようなものを表す方法ってありますか? {1..9**2}みたいな感じで書けたら便利なんですが・・・さすがに無理ですか? ない。forで使うならiを指数としてループの中で計算すればいいじゃん。 やはりさすがにないですか。ありがとです いずれはインクリメントを自由に設定できるようになることを期待 zshなら・・・zshならきっと 普通のプログラミング言語でもできなくね?と思ったが リスト内包表記があるのならできるか・・・ Bashで使えてたcocot がzshにした途端使えなくなった。なぜ? bashが脆弱性で大変なことになってるけどzshは大丈夫だよね? zshは↓で固まるけど、これで攻撃できる? echo hoge >file1 >file2 >/dev/stdout 固めてどうするの? そもそも、任意のコードが実行できるなら攻撃も糞もやりたい放題じゃん zshを使ってきた君たちへ 君たちが悪いわけじゃないんだよ 君たちが覚えたzshの将来が無かっただけ 当時の社会が悪かっただけ 君たち一人ひとりが悪いわけじゃないんだよ だから自分を責めないで 社会と向き合ってください そうすればきっと気が付くはず 君たちのzshの知識が無用なのだということに 君たちの存在自体が社会の足枷だということに 数値演算用の関数として function calc() { echo $(( $* )) } というのを作って使ってるんですが、 ( ) が入れ込んでたりすると zsh: bad pattern: と出てしまいます 引数全体を""で括ればいい話なんですが、そういうことやらずに引数の文字列をそのまま関数に渡すことってできないでしょうか? >>373 ""で括らずに引数の文字列をそのまま渡すのは無理 *や()のエスケープするか、素直に$(( ))を使ったら? https://github.com/Aso23/zsh_virsh_autocompletion/blob/master/_virsh をfpathに配置して autoload -U compinit compinit ってやるとvirshコマンドで補完が効くんですが compinitをcompinit -Cにすると補完が効かなくなってしまいます どうも上記のスクリプトの記述が悪いっぽいのですが どこを直したらいいか分かる方いませんか? http://wiki.fdiary.net/zsh/?FAQ%40zsh%A5%B9%A5%EC にbindkey表記が載っていますが、Ctrl+Shift+xやAlt+Ctrl+Shift+xに割り当てたいときはどう表記すればいいのでしょうか? asciiコード表を眺めて、文字コードとして存在するのかから考えよう >>376 遅レス&横レスですけど、できました? shift って bindkey では設定できないと思ってたけど キーバインドってなかなか自由自在にできなくてもどかしいですよね 個人的には ctrl-j と enter が区別できなくて等価に LF として扱われるのが辛い あ、ctrl-j と enter の件は端末側の話ですかね、すみません ググると、端末の入力モードをrawにすればキーコードが勝手に解釈されたりせずに ダイレクトに届くっていうけど、rawなんて使ったことないけどまともに使えるのかな・・・ >>376 Ctrl+Altって^[[ではなく^[^じゃなかった? 途中で変わったのかな じゃあ xterm -xrm '*modifyOtherKeys:2' にしようか echo $(A="A" && echo $A)みたいな代入文のシンタックスシュガーって存在する? 意図がわからないけど、こういう話ではなくて? 構文糖ではないけど。 echo ${:-A} Cのカンマ演算子みたいな感じかね。 できるかどうかは知らないけれど。 後上記の人の説明の補足をするならば、 例えば以下のようにした場合、変数Bに中身が設定されていなければ中身をA echo ${B:-A} として扱うという事であって実際に変数Bが作られるわけでは無いので注意。 数字でよければ echo $((++A)) 値1を持つ変数Aが作られる。だから>>363 とかは以下のようにもできる。 repeat 10 echo $(( 1 << ++A )) と、書き終わった後に試してみたら カンマ演算子が数値なら使えるみたいなのでこんな風にも書けた。 LANG=POSIX echo -e "\0$(( A=141, $A ))" わるいわるい上記を試したら全然出来なかった。 何度かやってたら偶然できてただけだった。 LANGの設定も意味ないし。 そっかそっか以下て出来た。 echo -e "\0$(( A=101, A ))" >>358 力技ではこんなのがある。 a=(a b c) b=$(printf "%c\0" $a |sed 's#\o0$##') # なんか変数に一度いれないと無理だね。 c () { echo $1 echo $1 |tr '\0' ' ' } c $b hashでもいける。 typeset -A a a=(A a B b C c) printf "%s\n" ${(k)a}| while read do printf "$REPLY\0%s\0" $a[$REPLY] done |sed 's#\o0$##' |read b >>390 >>391 b は c "$( ... )" で消せるんじゃない? あと、↓ でもいいような。 c ${(pj:\0:)a} c ${(kvpj:\0:)a} 書いてみるものだね。プロ達が見たこと無い技を教えてくれた。 そんな簡単にできるんだ。あってると思います。 偉い人はいいよな、こっちなんて直すの面倒からまだそのまま使ってるけれど、 こういうのを実現するのに中間file使って、m4使ってやってたよ。 私の.zshenvは糞コードで埋め尽くされてるな。 まあ糞コードは好きだけどね。それshellで書けますけど的なね。 教えてくれてありがとう。 なるほどなるほど、psとpjがsplitとjoinのようだ。 typeset -A a a=( A a B b C 'c c' ) echo ${(k)a} # keyを出力する。 echo ${(kv)a} # keyも値も出力する。 b=${(pj:\0:)a} # 空白を区切りに\0で結合する。 echo $b echo ${(ps:\0:)b} # \0を区切りに分ける。 b=${(kvpj:\0:)a} typeset -A c c=( ${(ps:\0:)b} ) # 値に空白が含まれていても、マクロ的に処理されるわけでなく # 一つの値として処理される。こういう所が他のshellと違うよね。 あーごめんごめんjoinの説明がおかしいね。空白を区切りにしてるわけではなく 他と一緒で値を区切りにしてくれてると思う。 # 変数が空、または値がなければ、1として置き換える。 echo ${a:-1} echo $a a=2 echo ${a:-1} echo $a; unset a # 上記の判定で、変数宣言がされている場合は置き換えないのが以下。:が無いだけ。 typeset a echo ${a-1} a=2 echo ${a:-1} echo $a; unset a # 変数が空、または値がなければ、指定された変数aに1を代入する。 *1 echo ${a:=1} echo $a echo ${a:=2} # *2 echo $a # 上記に加え、脚注*2 変数aに値が入っていても、値を上書きして定義するのが以下。 echo ${a::=2} echo $a; unset a # 脚注*1 の判定で、変数宣言がされている場合は代入しないのが以下。:が無いだけ。 typeset a echo ${a=1} a=2 echo ${a=1} echo $a; unset a # 他にもあるけれど勉強はここまでにする。 --- 2ch.orig 2015-05-16 08:09:21.000000000 +0900 +++ 2ch.diff 2015-05-16 08:11:22.000000000 +0900 @@ -8,7 +8,7 @@ typeset a echo ${a-1} a=2 - echo ${a:-1} + echo ${a-1} echo $a; unset a あとそっか > b は c "$( ... )" で消せるんじゃない? 確かにその通りでした。 後言葉が変でまだ知らない人達に、混乱を招いてしまうかも。 変数が空 false 変数が無い true 変数宣言 false 変数定義 true しかし"$()"の動作が思ってるより不思議だ。いつか勉強しとこう。 ps:\0: は 0 でいいけど、逆(pj:\0:)がないんだよね。f F と違って。 うーん、この非対称性。 setopt hist_ignore_space alias fg=' fg' しててもCtrl-pを押したときはfgが出てきてしまうのですが、 出てこないようにするにはどうすればいいでしょうか? 根本的な解決ではないが、新しい機能をkeyへ割り当てる事で要求はこなせる。 ここではalternateとp keyの組み合わせに、新しい機能を割り当てようと思う。 これは設定によってpの先頭に^[をつけるとかは変わる部分だが、 大体その設定になっているだろうと思う。 履歴をさかのぼるのが^Pだとしたら、 bindkey -s '^[p' '^P^P' 見ての通り二回分履歴をさかのぼっているだけになる。 ちなみに^P^Pの後に\rを書けば即座に実行する事となる。 当然これは危険である。 cd hoge rm * cd ここで実行しまうと再帰的にショックを受ける事になる。 試したいのであれば、 bindkey -s '^[p' 'pwd\r' などとすると良いでしょう。 ん、以下をfileに書いて実行すると動くのは理解できるのだけれど、 一番最後の行の\を一つ無くして「eval echo \$$a[B][2]」とすると fileに書いて実行した時は動かないけれど、promptから打っていった場合動いてしまう。 typeset -A a a=(B b) eval $a[B]+=\( c d \) eval echo \$$a[B]\[2] なるほど、そもそも以下をfileから実行した場合とpromptから 打ち込んだ時の挙動が違ったからか。 a=(abc) echo a[1][1] scriptからだとこうしないと表示できない。 echo \[1] echo '[2]' echo "[3]" promptからだと大丈夫、さらに1だけ表示が違う。 echo [1] echo [2] echo [3] >>412 ありがとうございます。noglob設定したら確かに直りました、 確認した所1ってfileが転がってました。 しかしよくすぐ気付くものだと感心しますな、最初の配列はきっと特別なんだろうな、 何かしでかしてんだろうなと覚書してまたわ。 そっか、そもそもglobというのが頭の中からすっぽり消えてた。 恥ずかしながら。出直してきます。 zsh-5.0.8のprintfで-フラッグが効かないんだけど、他にもなる人いる? こんな感じ。 $ builtin printf '%-20s' 'hoge' hoge $ command printf '%-20' 'hoge' hoge zsh 5.0.7 (amd64-portbld-freebsd8.4) でもおなじ >>416 あれ、おかしいな?俺は5.0.7まで正常(左詰めされる)だったんだけど…。 ちょっとrevertしてみるわ。 やっぱり5.0.7だと大丈夫っぽい。 パッケージ作成時の設定も変わってないみたいなのになんでだろう。 $ zsh --version zsh 5.0.7 (x86_64-unknown-linux-gnu) $ zsh -c 'builtin printf "%-20s" "hoge"' hoge $ zsh -c 'command printf "%-20s" "hoge"' hoge とりあえずは5.0.7で様子見することにします。 ごめん、ちゃんと読んでなかった。うちでも、5.0.7だと正常(左詰めされる)でした。 zsh 5.0.8 (amd64-portbld-freebsd8.4) だと右詰になります。 >>419 どうもです。となるとzshのバグですかね。 どなたかzsh-usersに報告されてました。 http://www.zsh.org/mla/users/2015/msg00609.html というわけで、修正が来るまで?待つことにします。 お騒がせしました。 select ループで選択候補にナンバリングされるけれども、この表示方法は変えられないのかな 桁の変わり目に表示がずれるのがどうしても気になる ファイル選択に select を使うのもあまり便利とは言えないけど… こういうときは皆どうしてるのかな teeみたいなことをやるリダイレクトで ls > /tmp/ls.txt > /dev/sdtin ってできるけど、なぜ stdout じゃなくて stdin に流すのでしょうか? なんとなく stdout に流したくなるのですが /dev/stdoutに すると端末に表示されずに、/tmp/ls.txt にもう一度書きこまれるのでは? 端末に結びつけられていれば /dev/stdin でも /dev/stderr でもいいが どうせスペシャルデバイスを使うのなら /dev/tty の方がわかりやすいかもね zsh使うくらいなら最初からbashだけ使ってた方がいい。 将来、なんかの拍子にbashの仕事が入ってくるかもしれない。 その時にbash使ってましたアピールは大きい。 zsh使ってましたとか何のアピールにもならない。 もう一度言う、たとえ趣味でもbashを使え。 >>422 うちのzsh 5.0.8ではls.txtは作られても画面には何も表示されなかったんだが、オプションか何か? firewalldの補完ファイルどっかに落ちてない? >>422 ls > /dev/stdout > /tmp/ls.txt とか ls >&1 > /tmp/ls.txt でいいんじゃないかな 初心者で申し訳ないが#や$から左のホスト名とかユーザー名、ディレクトリはどこらへんいじれば変えられる? >>435 zsh プロンプト でググればやりかたが見つかる。 .zshrc に書くらしい。 vim .zshrcすると operation not permittedって出ます .の後にスペースを入れたように見えるけど実際には.を使ってたりする じゃあ俺、mkdir .zshrc して帰るから(鬼畜) じゃ俺はそれをrm -rf . zshrcで消しとくね (( )) 内の浮動小数変数のデフォルト型をdoubleにする設定ってないですか? zsh-5.0.8 → zsh-5.1.1(zsh-5.2 も同様) と上げたら、 menu-complete → reverse-menu-complete で reverse-menu-complete が確定→補完開始するようになった。(バグ?) zsh-5.0.8 は確定せずに候補選択の逆順移動をする。 zsh-5.0.8 と同じ動きにする方法ってある? >>448 setopt FORCE_FLOAT でどうでしょう。 と思ったら浮動小数変数のデフォルト型ですか。 何もしなくても double では? 表示の有効桁数のことですか? compinit するとなるようですね。もっというと zle -C reverse-menu-complete .reverse-menu-complete _main_complete でなる。(_main_complete でなくても。) zsh-5.0.8 でも compinit すると complete-word, menu-complete とかで 新しい補完を開始してしまう。 ので、reverse-menu-complete 以外は前から問題があったのかな? zle -C 前の reverse-menu-complete や .reverse-menu-complete なら 新しい補完を開始することはない。 が、menu completion 中以外について、 当然 _main_complete は呼ばれないし、なぜか compinit なしの補完もしない。 menu completion 中しか reverse-menu-complete を使ってないので 姑息ながら、とりあえず .reverse-menu-complete で凌ぐ。 seq 1 10 | echo `grep 5` `grep 3` bashだと5が表示されるけど、zshだと完全に固まるね(^Cも^Zも受け付けない) 5.2 では % seq 1 10 | echo `grep 5` `grep 3` grep: (標準入力): 入力/出力エラーです 3<eof> ← 入力 3 となる。けど % zsh % seq 1 10 | echo `grep 5` `grep 3` でなぜか固まるね。 ↓ は期待通りかな。 % zsh -c 'seq 1 10 | echo `grep 5` `grep 3`' 5<eof> ← 入力 3<eof> ← 入力 5 3 bash とは多分仕様が違うけど、 bash は POSIX compliant なのかな? 正しく動けば zsh の方が使い易そうだけど。 hist_find_no_dupsはどういう意味なんでしょうか? これを設定していても、Ctrl-pを繰り返し押したとき同じコマンドが何回も出てきます。 Ctrl-rで検索したとき一度出たものと重複するものをスキップしてくれますよ。 そういえば.zhistoryも日本語が文字化けしてた history-all等の方で取り出すのは文字化けしないから 困った事にはならなかったが bash_historyの方は化けないから 文字化けは他でもまた偶然直面しそうだ 直し方両方分からないし なんかzshがWindowsに対応とかニュースになってるらしいけどマジ? すごいよ。WindowsでUbuntuのバイナリ互換するんだもんな zshも動くよきっと >>459 ~/.zsh_historyのエンコーディングがLatin1っぽい >>465 nkf で utf-8 に変更しても駄目だったから zshから書き出すまでの方見ないと駄目かもしれない bashのcdでディレクトリだけ補完する、の下記設定は、zshだとどう書けばよいですか? complete -d cd 下記でできましたが、自分には不要な設定もたくさんついてくるので、cdのディレクトリ補完だけ単独で設定したいです。 autoload -Uz compinit; compinit man cdとするとzshではなくbashのビルトインの方が呼ばれるんですがどうしたらいいですか man zshbuiltinはちょっとめんどい zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' これで補完のとき大文字小文字を区別しないようにしているのですが、 Macで/us<Tab>とすると/Usersが先に出てきてしまいます。 これを/usrが先に出てくるようにしたいです。つまり 入力した文字列と大文字小文字が一致した候補がある場合はそちらを先にしたいのですが どうすればいいでしょうか? zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' これじゃダメなんだね? 大文字小文字無視系の設定は、しばらく使ってみないと自分の好みの動作が判らんよな 楽をしようとしてるのに、縛りを少しきつくすると勝手に確定させられて「おいっ!」みたいなことがあるし 俺は最初oh-my-zsh使ってたけど今はantigenで落ち着いたな(´・ω・`) .zshrcにfunctionを書いているのですが、readでユーザ入力を待っている時に、ctrl+c、ctrl+d、esc、どれも押しても強制終了できません。 function hoge(){ .zshrcにfunctionを書いているのですが、readでユーザ入力を待っている時に、ctrl+c、ctrl+d、esc、どれも押しても強制終了できません。 ユーザ入力ができて、入力待ち中に強制キャンセルもできるようにするにはどのようにすればよいでしょうか? function hoge(){ # 入力待ち中に強制キャンセルが何も効かない。。 printf "input: " read string } >>483 function hoge(){ trap 'return 1' SIGINT printf "input: " read string } これでどうだろう >>484 ありがとうございます。 ctrl+cのあとにエンターを押せばtrapに補足されましたが、ctrl+cだけではキャンセルされませんでした。。 バージョンはこれでした。zsh 4.3.11 (x86_64-redhat-linux-gnu) テストで、 trap "echo aaa" SIGINT としたんですが、これ、関数が終わった後も、コマンドライン上でctrl+cすると aaa aaa aaa ... とtrapが発動するようになりますね。。 とりあえず、 read -k 1 str で1文字入力にすることで、ctrl+cが入力されるとそれでキャンセルされたように見えるのでこれで代用しようかな。 >>485 見当違いなアドバイスだが、readに-tつけては >>486 なるほど。 秒数待ちをするんですね。 そのアイデアはまったく考えてませんでした。 案の一つとして検討させていただきます。ありがとうございます。 ここ最近、履歴の共有ができなくなってしまいました inc_append_history と share_history は有効にしてます 何が悪さをしてるでしょうか? zshは5.2です function定義した中身を表示する方法はありますか? aliasはwhichで内容を確認できるのですが、functionはwhichで見れず。。 何か他の方法で見れないでしょうか? >>490 ,491 レスありがとうございます。 すでに違ったとレスいただいていますが、typeコマンド初めて知りましたので一応調べてみたら、functionだとわかるだけでした。 関数定義も普通にwhichで見れると思うけど…… % function foo() { echo hoge; } % which foo foo () { echo hoge } whichが置き換わってるんとちゃう? built-in which でいける >>493 ,494 おお! その通りでした。 whichをwhichするのは初めてだ。 ↓alias登録されてた! % which which which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' これでいけました。ありがとうございます。 % builtin which is_exists 続きます。 続きです。 .zshrcと.zshenv見直してもalias登録してないので、どこで設定されてるかぐぐったら こんなの見つけました。 ttp://d.hatena.ne.jp/BigFatCat/20080601 どうやら下記で設定されてるみたいです。 /etc/profile.d/which-2.sh これはzshの場合デフォルトで読まれるみたいですが、functionが見れなくなる欠陥whichで書き換えるとか迷惑ですね。。 これを読まないようにする設定とか無いでしょうか? 途中で書き込んでしまいましたすみません。 読まないようにする設定が無ければ、無理矢理感があって気持ち悪いですが unalias which を.zshrcに入れて我慢します。 zshはそんなものデフォルトで入れないよ。冤罪だw その手のおせっかいはお使いのディストリビューション固有の事情かと。 curlで&や?を含むURLを取得するとき、いちいちURLをクォートで囲むのが 面倒なんだが、いい方法ないだろうか? URLをコピペするときは bracketed-paste-url-magic が役立つ 自分はその手のコマンドは noglob を使った alias を定義してるな >>504 あれ、確かにそうだよなと思って履歴を見返したら、クォート 途中で切れてしまった。履歴を見返したら & を含む場合はクォートしていたw ごめんち ブラウザ経由で呼び出す機会が多くなったし、端末に張り付ける場合も 正規化した URL を使ってたから、クォートする機会があまりなかった 自分の記憶が全くに当てにならんのが泣ける ttps://github.com/ryoppy/cool-peco を入れたんだけど C-r で cool-peco-history にならんのです。 デフォルトの bck-i-search: になっちまう。 コマンドラインからは cool-peco-history 呼べるし、 alias の hist も呼べる。 $ bindkey | grep peco "^R" cool-peco-history になってるし、コマンドラインから $ bindkey '^r' cool-peco-history しても変わらず。 「やっちまったなぁ!」を使わず解決策教えてほしいです。 pushd +3 とかってしたとき、3つ分スタック全体を循環させるんじゃなくて、 3つ目を取り出してスタックトップに乗せるって挙動なかったですか? つまり最近使った順にスタックが並ぶ。 昔出来た気がするのですが、今マニュアル見てもなくて。 ulimit -aってやると一番下に -N 15: unlimited と出るんですが、この項目は何ですか? extendedglobがmissing delimiterとか言われてエラーになる 何か他のオプションと衝突するとかある? cdr だけ 部分一致で補完したいのですが、どうすればよいでしょうか? 実用途としましては、project名 入力で path が補完して移動です。 zstyle ":completion:*" matcher-list 'm:{a-zA-Z}={A-Za-z} l:|=*' で部分一致になった( l:=|* が 妥当かもわかってません)ので、 zstyle ":completion:*:*:cdr:*:*" matcher-list 'm:{a-zA-Z}={A-Za-z} l:|=*' としてみたのですが、反映されませんでした。 最近.zshrcを見直してzmodload zsh/filesが入ってたことに気付いたけど これもう完全にいらない子なんだな。 たしか引数の最大バイト数を回避する目的で入れた記憶があるけど、 最近のLinuxは引数上限がかなり緩和されたはずだから困ることはまずないし、 むしろPOSIX準拠してないので制約が多い。 というかそもそもこれが作られた目的が緊急時のリカバリ用というのを今頃知った。 ただのPOSIX拡張だと思ってたわ・・・。manは見なきゃ駄目だな。 誰でも簡単にパソコン1台で稼げる方法など 参考までに、 ⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。 グーグル検索⇒『宮本のゴウリエセレレ』 CDVW4G8P2M 世の中pythonが流行ってるけど、案の定xonshっていうシェルも出てきた そのうちイーマック厨みたいにpythonは環境です(キリッとか言い出すやつも現れそうだな >>514 xonsh初めて知った。 機能的にはすごそうだが、ちょっと込み入ったことはシェルスクリプトで書いた方が後々使い回しが楽そうだな... ☆ 日本の、改憲をしましょう。現在、衆議員と参議院の両院で、 改憲議員が3分の2を超えております。『憲法改正国民投票法』、 でググってみてください。国会の発議はすでに可能です。 平和は勝ち取るものです。お願い致します。☆☆ fzfのキーバインドを変更したい時ってどうすればいいんですか? 具体的にはC-tをC-TもしくはM-Tに変更したいです muxer -i input.aac?sbr --file-format m4a -o output.m4a ってコマンドを打ちたいんですが、sbrというオプションを付けるときは頭に?を付けないといけないんですが、 「?」がzshでワイルドカードとして扱われてしまいます。 ワイルドカードとして認識されないようにするにはどうしたらいいでしょうか? 自己レス ?の前にバックスラッシュを入れたら使えました。 zshのデフォルトだと、マッチするファイルがなければ?は?のままのはずだが。 >>520 バックスラッシュ付けないとこのようになってしまいます。 $ muxer -i input.aac?sbr --file-format m4a -o output.m4a zsh: no matches found: input.aac?sbr >>521 NOMATCHかなんか設定してるんでしょ。 man読みな。 >>522 何の設定でしょうか? 何のmanをみたらいいですか? 今ググってみて .zshrcに setopt nonomatch と書いたら?を付けなくてもコマンドが動きました。 $ $PATH<Enter> としたとき$PATHの値が表示されるようにできるみたいなんですが、 そういうオプションがあるんでしょうか? zsh: No such file or directory: のようなおまけがついててもいいなら そのままでも表示はされる場合が多い気がする 確かに。でも$PATHならともかく他の環境変数にもその方法を適用するには リスクが高いですね。 以下のように (( )) で浮動小数演算したところ思わぬ結果になりました。 a と b の型がどのように決まるのか教えていただけないでしょうか? $ cat hoge a=$(( 1e-6 * 1e-6 )) (( b = 1e-6 * 1e-6 )) typeset -p a typeset -p b $ zsh hoge typeset a=9.9999999999999998e-13 #型は文字列? typeset -F b=0.0000000000 #小数点以下10桁固定の型? $ zsh --version zsh 5.4.2 (x86_64-redhat-linux-gnu) よく知らずに答えるけど $(())を使うと文字列 (())を使うと浮動少数や整数 になるんじゃないの? 型はtypeset指定しなければ暗黙的に決まるわけだが、 floatは指数形式と小数点固定形式があるが(())内の暗黙floatは勝手に後者になる そもそも型とその出力表現は別の概念なのにごっちゃになってんのが糞仕様すぎ 知り合いから教えてもらったパソコン一台でお金持ちになれるやり方 時間がある方はみてもいいかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 NQSL6 zsh/filesって今はいらない子なの? これないと引数の最大バイト数の制約がきついよね? 自分が必要なら使えばいい 俺は引数の最大バイト数制限なんてここ10年ひっかかったことないし あったとしたら自分のマシンじゃないからzshじゃなかったはず 昔のLinuxはかなり少なかったらしいね>最大バイト数制限 昔初めて.zshrcを作る際に他人の設定をパクってそのまま惰性で使ってる人多そう・・・ そもそもこれが作られた目的って緊急メンテ用だし http://www.zsh.org/mla/workers/2008/msg00617.html より It wasn't intended to provide full versions of the commands, the commands which are there don't implement all the POSIX options, etc. It's intended to provide enough to be useful in emergencies. Most people shouldn't need to use it. kill screen<TAB> とか補完して候補が1個しかなかった場合、即PIDに補完されるけど、 候補が1個でもメニューを表示するようにできないかな 他のコマンドの場合はいいんだけど、killの場合は確認しないと不安で zstyle ':completion:*' menu select=1 はやってみたけど変わらなかった bash が入ってるが zsh は入ってない環境って例えばどんなの? >>545 20年前のUNIX/Linuxサーバー 10年前のならだいたい入ってると思うけど、それでもデフォルトで入ってるかどうかはわからん そうなのか。実は zsh スクリプトを積極的に書いていっていいものかと悩んでいるんだ。 他人に使ってもらうためのスクリプトは bash で書いていたが、普段使いのシェルが zsh なので なるべくzsh を使いたい。しかし「このスクリプトを使うためにまず zsh 自体をインストールして下さい」 と言うのは避けたい。導入のハードルを上げたくない。 対話的に使うシェルとスクリプトで使うシェルは別でもいいんじゃないの 日常の作業を自動化したくてスクリプトを書くことがよくあるんです。 あと zsh の rcquotes とか zparseopts とかが便利すぎるので… 自分で答え出してるんじゃね 自分しか使わないならzshでいい 他人に使ってほしいならせめてbash >>550 はい。つまり気になっているのはデフォルトで bash が入っているが、 しかし zsh は入ってない環境が実際あるのか。ってことなんです。 「入れれない」ってんならともかく、「入ってない」だけなら入れれば済むワケで 最近のOSXにはプリインストールだから使って良いんちゃう サーバ用途だとzshは明示的に入れないと入らないでしょ。稼働中のサーバでは後から入れるにしても難色を示される事も多いですし、上でどなたか書かれてたように、自分に決定権のある環境以外でも使うのなら、zshでスクリプトを書くのは避けるべき。 最近はデフォルトのshellがbashになってたりするけど、昔はbashですら入っていない環境も多くて、/bin/sh で書くように教育されたよ。 年寄り臭くてスマンね >>547 俺も昔おんなじことで悩んでたけど、 >「このスクリプトを使うためにまず zsh 自体をインストールして下さい」 これが通らないような相手のことを考えてスクリプト書いてやるのが馬鹿らしくなって、 以来悩むのはやめたわ。それ自体が仕事だとそうもいかんのだろうけど。 >>551 パッケージでなら用意されてない環境も今では珍しいと思うけど、 最初からインストールされてるかどうかで言えば、入ってない環境なんて 山ほどあるかと。 他の人も書いてるけど、デスクトップ用途ならともかく、サーバ用途なら sh、csh、bash、tcshぐらいまでしか入ってないとかは普通にあり得る。 csh系は論外とすると、結局無難なのはshかbashだろうか bashがデフォで入ってない環境もあるんで、 無理のない範囲でshにしとくといいよ。 > 年寄り臭くて いいえ、助言助かりますよ。かつてのbashの位置にようやく追いついたということですね。 先輩方どうもありがとう。 サーバーで使うなら、zsh は諦めるけど デスクトップでは使ってもいいなと思えてきた。 そうすると気になるのは、fish や Go との差はどうなのかってこと。 必要ならインストールさせればいい、ってスタンス なら、当然その辺がライバルになってくるけど… まあいいか。スレにみんなにお礼と言ってはナンですが、makefile で zsh を使う方法を考えたので紹介させてください ~ makefile で zsh を使う・Makefile ~ # 設定をまとめた親ディレクトリ. export ZDOTDIR := $(TMPDIR)/make.$(shell echo $$PPID).zsh $(ZDOTDIR): @cd $(@D); mkdir $(@F) $(ZDOTDIR)/.zshenv: | $(ZDOTDIR) @exec 1> $@; echo setopt rcquotes $(ZDOTDIR)/all: $(ZDOTDIR)/.zshenv # マーカーファイル。この行の依存関係に .zshrc などを並べてね. @touch $@ # 依存関係をまとめたいだけなので、中身はからっぽで. -include $(ZDOTDIR)/all # このように include することでレシピの実行などでシェルが使われる前に設定ファイル群を作れる. マーカーファイルはない状態から作るのでエラーメッセージはかならず出る。それを消すための先頭のハイフン. SHELL := /bin/zsh # zsh の設定ファイルは ZDOTDIR 環境変数で渡される. # なおレシピ外の行での $(shell ...) 関数から呼ばれるシェルは、直前のSHELL設定行より下では作られた ZDOTDIR が有効になった zsh が使える。その行より上ではただの /bin/zsh が使われる. hoo: echo 'hoo''bar' ~ makefile で zsh を使う・実行 ~ $ make hoo echo 'hoo''bar' hoo'bar zshwiki.orgってまだ落ちてるの? もしかして閉鎖? fishでshift+tabを押すと補完候補をインクリメンタルに選択出来るんだけど、これに似た機能はzshないかね hoge hoge hoge 〜 hoge と文字列を任意個展開するスマートな方法ないですかね? for文使えとかそういうのはなしでお願いします マニュアルのExpansionの章をくまなく読めばわかるのかもだけど echo $(yes hoge | head -10) あ、repeatコマンドもなしでお願いします {hoge(n)} みたいに短くスマートにやる方法が知りたい forもwhileもrepeatも使ってないからセーフ >>568 あ、bashでこんな手があるんですね yesって何に使うのだろうと思ってた ただ、天下のzshですからもっとzshらしい方法があるはず zsh本来の力の10%も使いこなしてないけど、せめてExpansion系は使いこなしたいわ >>566 fishよく知らないんだけどインクリメンタル補完って何? もしかしてサジェスト系? ぼうやーってわしもちふつうだけど、まーおこめのほうがいいんだけど エラーの原因が分からない? まず確認しよう! 《書き込めない時の早見表》 《掲示板へ戻る》 《スレッド一覧へ戻る》 《スレッドへ戻る》 もしかしてアクセス規制ですか? お使いのプロバイダさんが、原因となった人に対応するまで規制は続きます。 個別の対応・進展については、プロバイダさんへお尋ねください。 その他、5chちゃんねるについては、 初心者の質問 批判要望 運用情報 運用臨時 などへどうぞ。 あーめんどくさいなー、びんぼうだしさいごだし、ぼうそういこかなあれはあるか わしかわいそーきょうじゅうにじょうものんだし、ああじゅよんのむと、ししょーあるksなきのせいかな [ $i -lt 100000 ] と [[ $i -lt 100000 ]] では後者のほうが速い Linux上では2.5倍ぐらい後者が速いが、 WSL上では10倍以上の差をつけて後者が速い 他のシェルでも似たような傾向はあるがこれほどの差はない どうもzshはシステムコール呼びすぎっぽいな [ ] が遅いって言うよりも関数呼び出しが遅い気がするな while [[ $i -lt 100000 ]]; do を ↓ foo() { [[ $i -lt 100000 ]] } while foo; do こんな感じに置き換えてみたら、同じように遅くなった [ ] を使っていた場合、最初から関数呼び出し相当だったということかも ベンチマークで、ループしてevalとそうでない場合の 速度差を調べようと思ったんだが、まさかループの回数判定で evalと同等の差がでるとはwww evalもzshだけ遅い。他のシェルはeval使っていても ほとんど速度は落ちないというのに 俺の知る限り、現在使われてるBourne系シェルの 全てで [ はビルトインになっている setopt forcefloatして(( ))の数値演算すると固定表示で出力される仕様みたい それはいいんだけど、最後の桁に誤差が混じってちょっと困る なにかいい方法ないかな $ echo $(( 1 )) 1. $ echo $(( .1 )) 0.10000000000000001 ←0.1 ってなってほしい >>588 printf じゃだめかな? $ printf "%.1f\n" $((.1)) 0.1 $ printf "%.2f\n" $((5.1)) 5.10 printfで0.999999999999999になったとき どう表示されるのだろうか 先輩、手の空いてる時に教えていただけませんか? ssh接続して、サーバー内で [server:~] $ sudo rm -f `ls -1t /home/user/work/*.mp4 | tail -n+3` は、おkなのですが、 [local:~]$ ssh hostname “sudo rm -f `ls -1t /home/user/work/*.mp4 | tail -n+3`” は、 zsh: no matches found: /home/user/work*.mp4 で、うまくいきません。 サーバー はbash しか入ってないです。 これってどうしたらうまくいくがアドバイスいただけませんでしょうか。 rmするのにsudoしてるのは、docker run -v してるディレクトリで コンテナが吐き出すファイルだからです。 >>591 \*.mp4 みたいにエスケープするとどうなる? レスありがとうです! エスケープ試してみたのですが、 zsh: no matches found: /home/user/work*.mp4 で結果は変わらなかったです。 クライアント側のzshが先にワイルドカード展開しようとしてエラーになってるのかな ダブルクオートをシングルクオートにするのはどうか lsコマンドを囲んだ元のシングルクオートはエスケープするか$()で置き換えるか ls を囲んでるの、シングルクオートじゃなくてバッククオートなんだよ。 だから ssh を呼び出す前にクライアント側のシェルで展開されて、何もマッチしないから空の文字列になってる。 単純にダブルクオートをシングルクオートに変えるだけでいいと思うよ。 >>594-595 ダブルクオートをシングルにしたらいけました。 天才! ありがとうございます! ワイルドカードの質問ですが mkdir ~/hoge touch ~/hoge/fuga ls ~/hoge/fu* 最後の行のfu*がタブ押しても補完してくれません ~が$HOMEだと補完してくれます バグですかね? >>597 バグだろうね 自分の環境では補完されるからキーボードかPC捨てて買い換えろ (( a = 0 )) と (( a = それ以外の数値 )) の終了ステータス $? が それぞれ1と0なんどけど仕様?(( a = 0.0 )) とかにしても1。 変数に設定された値自体が終了ステータスに影響するっておかしくない? エラーがあると困るシェルスクリプトでは最初に set -e するようにしてるんだが これじゃ (( )) で数値演算したいときに超困る >>599 ちょっと調べてみた まずbashでhelp letを見てみると Exit Status: If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise. とあるので((...))は中身が0に評価されたときのみ1を返す じゃあa=0とa=1(これはassignment)がどんな値に評価されるのか?だけど POSIXを見ると$((...))の中身はCのルールに従って評価されると書いてある ((...))もPOSIXには無いけど同じルールに従うはず http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html#tag_17_01_02_01 で、Cだとassignmentはassignされた値を返すので ((a=0))は0、((a=1))は1を返すということになる 一言で言うと(( ... ))の中はCのルールが適用されるからということかな set -eの回避策は((a=0, ..., a>100))とか、: $((a=0))とか、if文の中に押し込むとか色々ある 間違えた修正 誤 ((a=0))は0、((a=1))は1を返すということになる 正 ((a=0))は1、((a=1))は0を返すということになる >>600 ,601 調べてくれてありがとう。Linux歴15年以上あるのに今頃知りましたよ : $(( 〜 )) のスタイルにするしかないかー。面倒だ ちなみにこんなwhile処理で発覚した。致命的なミスをする前に気づけてよかった set -e (( x = xmin )) while : ; do 〜処理〜 (( x += dx )) (( x > xmax )) && break done 変数は全部浮動小数ね gitで M ../a1.txt M ../a2.txt こんな風に親ディレクトリに変更ファイルがあるとき git add <Tab> で候補だしてくれないじゃん。 git add ../<Tab> なら出るんだけど。これ出るようにできないかね? >>602 このスレは始めてきたので今更だが 普通は x=$((xmin)) x=$((x+dx)) [ "$x" -gt "$xmax" ] とかやろ? せっかくzsh使ってんのに-gtだの-leだのまどろっこしい書き方できるかよ ~/.zsh_historyファイルを読んで、コマンド実行の傾向を分析するkibanaのdashboardを作りました。 dockerで作らているので、非常に簡単に始められます。 もし良かったら使ってみてください。 https://github.com/codequokka/shell-history-analyzer lsのソートについて質問 ファイル名先頭の_が無視されるのか hoge1 _hoge2 hoge3 となるのだけど _hoge2 hoge1 hoge3 とするにはどうしたらいいの? >>609 zshの問題じゃなかったんだ 失礼しました ありかとう 新しい macOS のデフォルトシェルが zsh になるってよ! bashですら重いのに、更に重いzshにするのか・・・ 誰が喜ぶんだ? Macのシェルなんて素人さんしか使わねぇよ WSLと同じ 品質なんかどうでも良い タブ補完で例えば、 cp oo/oo kk/kk の oo/から保管して ppppを入力する場合、ooとppppの差分の2文字が上書きされるのですが、回避する方法はありますか? 上の場合だと cp oo/ppppk/kk のような結果になります。 カレントシェルで文法チェックのためにdryrunしたい。 zsh -n $BUFFER で変数 BUFFER をチェックできるけど、 新しくシェルを立ち上げるから setopt がズレてるおそれがあり、 いまのシェルで $BUFFER が実行できることを保証できない。 たとえば ignore_close_braces がオンになっていると args(){ echo $# } はパースエラーになる。 そもそも dryrunである以上、$BUFFER が実行できることなんて保証できない setoptを含め、実行時にしかわからない情報に依存するものは 実行しないdryrunでわかるわけがない >>622 なら zsh -n は何の役にたつの? 文法をチェックする… ただしパーザの挙動を変えるsetoptが起こる場合 結果は正しくない。起こるか否かも動的にしか判らないのだから、 静的に保証できるものは何もないのでは。 622はおそらく間違っている。 現在のオプションを参照するカレントシェルで動く文法チェッカがあれば、 $BUFFERの実行を伴わない文法チェックはできると思う。 setopt によるパーザの変更はひとつのコマンド行が終わった後に効くっぽいからだ。 二行のファイル setopt ignore_close_braces args(){ echo $# } をsourceすると失敗するが、一行に結合してインタラクティブシェルから呼ぶと成功する。 >>623 > なら zsh -n は何の役にたつの? 構文チェックであり、実行時チェックではない。 args(){ echo $# } は ignore_close_braces がオンであろうがオフであろうが そのオプションとは無関係に正しい文法 だからzsh -nでチェックすると正しい文法として扱われる args(){ echo $# } という関数定義命令を実行すると、 パースエラーという "実行時エラー" が出る 「パースエラーなんだから、実行時エラーじゃないやい!」なんて理屈は通じない。 evalで変なコードを実行したらパースエラーになるだろ 実行時パースエラーというのものが存在する dry-runである以上、実行時パースエラーを見つけることは不可能 zsh -nは間違ってる文法を「間違ってる文法」だと保証してくれるが 「正しい文法」だとは保証していない evalがある言語では ソースコードのパースも(一部は)実行時に行われる dry-run=実行しない以上、実行時にしかわからないエラーを見つけられるわけがない。 ignore_close_braces オンで文法チェックしたいなら、 こうすればいいだけ zsh -o ignore_close_braces -n >>626 構文チェックだけして実行時パースはどうでもいいって状況があるのか? ともあれ zsh -n の働きはわかった。構文チェック -> 実行時パース の順で通していくわけだね。 今回の俺の目標は$BUFFERの実行時パースって位置づけか。 >>628 サンクス、現在のコマンドラインの$BUFFERとその時点のオプションを渡せば目標は達成できるぜ。 実行なしでの文法チェックができた。 もちろん$BUFFER内のevalの引数まではチェックしないけど、そこまでは元々期待してない。 いやその理解はおかしい。構文チェックが二段階あるわけではない。 インタラクティブシェルでは実行時パースの単位はコマンド行の実行毎になるというだけ。 そのため$BUFFERのチェックに限っていえば、パースは一回なので、 途中でのパーザ変更は変数中に効果を発揮しない。故にドライランで構文チェックができる。 > args(){ echo $# } > は ignore_close_braces がオンであろうがオフであろうが > そのオプションとは無関係に正しい文法 ノー。zsh -o ignore_close_braces -n ... で判定するとエラーになる。zsh -n の機能は単に構文チェックするというだけ。 その例のようにパーサの変更がない区間での構文チェックで役にたつ。 アドバイスにおいて、レスをよく読まずに一般論でドヤ顔したり、相手の思考を妄想して叩くべきではない。 あとはこんなときとかに使えるね。 make(){ zparseopts -D -M -E -A opts -- n -just-print=n -dry-run=n -recon=n if [[ $opts[(i)-n] ]];then command make -f =(echo '.SHELLFLAGS := -n -c') "$@" else command make "$@" fi } これは make の dryrun をシェルの dryrun に置き換える。スクリプトを表示するだけだったのが、文法もチェックするようになるよ。 $ make -f =(echo 'SHELL = zsh';echo 'hoo:; echo hoo)') -n echo hoo) zsh:1: parse error near `)' >>630 > いやその理解はおかしい。構文チェックが二段階あるわけではない。 二段階あるんじゃないよ。 -nによる構文チェックは実行せずに静的な構文チェックを行う。 実行しないから実行したら文法エラーになるようなものを見逃す。 通常の実行時は静的な構文チェックは行わずに、実行しながら構文チェックを行う 二段階あるんじゃなくて、二種類あるんだよ。 んで、話は最初に戻る そもそも dryrunである以上、$BUFFER が実行できることなんて保証できない setoptを含め、実行時にしかわからない情報に依存するものは 実行しないdryrunでわかるわけがない ノー。$BUFFER 実行時の構文チェックは一回だから >>635 何いってんの? $BUFFERに入ってるのはただのファイル名なんだけど? zsh -n $BUFFER 構文チェックに通ったからと言って、実行したときに構文エラーが出ないとは限らない なぜなら、zsh -nは実行したときの構文チェックとは別物だから。 >>636 いや、man zshzle に書いてあるが zsh の変数 $BUFFER は エディットバッファの中身を格納している。この値は zle のウィジェットから取得できるんだ。 コマンドラインに例えば echo hoo と入力して実行すると BUFFER='echo hoo' になる。 ウィジェットは自作もできて、好きなキーに bindkey 命令で紐づけて呼べる。 読み返して気付いたんだが、620 は書き間違いで zsh -n -c $BUFFER が正しい。 zsh スレだから当然BUFFERくらい知ってるよなと思っていて、会話が繋がっていったので疑いもしなかったんだが これは完全に俺が悪いです。ごめんなさい。 source ~/.zshrc を打とうとして source ~/.zsh_history を実行してしまった悲劇が話題になってた これどう対策する? https://qiita.com/stilo/items/90f6c6e308c85a4a9460 ~/.zshrc を実行するつもりがタブ補完などをスリップしてしまい .zsh_history を実行していまう。 するとヒストリファイル($HISTFILE == .zsh_history)に書かれた過去に実行したコマンドが、順番に source コマンドによって読み込まれて実行される。 記事で紹介されている事故では途中で止められる機会があったから良いものの、運が悪ければ不可逆的・破壊的コマンドが走り重要な情報を含んでるかもしれない現環境がズタズタになる。 ヒストリ先頭に予め終了命令を入れておくという技をtwitterでみた。 手作業だと忘れそうなので、.zshrc にこういうのを書いておけばいいかな。 < $HISTFILE | { mv $HISTFILE{,.bak}; sed '1{/return 1/!i\ echo '"'"'Cannot source `'$HISTFILE'`, Abort.'"'"' >&2;return 1 ;}' > $HISTFILE ;} && rm $HISTFILE.bak >>640 リンク先読んでないけど、それコマンド確認しないでEnter押しちゃ何だってトラブルの元だよね 補完offにしとくか、HISTSIZEを2-3ぐらいにしとけば 設定ファイル編集した後に読み込むならsource !$<tab>でもいいんだし 誰しも失敗はあるし、フェイルセーフはやっぱほしいよ。 >>642 > 補完offにしとくか、HISTSIZEを2-3ぐらいにしとけば それだと普段の作業がちょっと不便では。 >>641 は毎回mv,sedとかが走るのはパフォーマンス的にどうなんだ HISTFILE=~/my_history みたいに換えとくのが単純でいいか。 >>642 ヒストリ展開は便利だけど、ファイル編集した後なんか適当なコマンドを思いつきで打ってしまうとやりにくい。 >>643 いやこのためだけに、$HISTFILEをファンシーな名前にするのはなんだか環境が汚れた感じがする。 これで行けるわ zstyle ':completion:*' ignored-patterns '.zsh_history' .zshrc あたりに追加すればいい 書き直した。ヒストリのバックアップは別でやるべきだわ function ensure-file-head(){ [[ $(< $1 | read -re) == $2 ]] && return < =(print -r -- $2;< $1) > $1 } # ensure preventing `source .zsh_history`. ensure-file-head $HISTFILE 'echo '"'"'Cannot source `'$HISTFILE'`, Abort.'"'"' >&2;return 1' ファイル直接編集を避けるためにヒストリ関連の組み込み命令 fc -R, -W とかを使ってやる方法も考えてみたが、オプションの具合によってはファイルに追記しかしないし、デフォルトでは詳細なタイムスタンプがつかなかったりするので、 「この指定はsetopt 〜 の後で行う必要がある」のような条件がついて美味しくない。 >>645 補完よく知らないのだが、そっちに手を入れるほうが良さそうだね。 試してみたところその指定では tail .zsh_history のようなものも弾かれてしまわない? source だけに限定するのは難しいだろうか >>647 fc のこと? history == fc -l で、リストアップに限定したコマンド。 問題の対策は他にもEnterキーのアクションである accept-line ウィジェットを置き換えるとか、 コマンドライン実行前に呼ばれる preexecフックとかで止める方法がある。後者は記事のブックマークコメントの先で紹介されてた。 でも言われてた通り機構をあらたに作る必要があって煩雑になるし、その辺は元々弄りたい需要が多すぎるのでただでさえゴチャついてるところに手を入れがたい。 インタラクティブシェルだけ source を関数で置き換える方針はどうだろう。 .zsh_historyが引数のときだけ実行を警告するように。これも軽い修正になってよさそうじゃないかな source ~/.zshrcはエイリアスに入れてるわ これで誤爆の心配もないね! >>648 いや history じゃなくてわざわざ tail .zsh_history を使うのってどういう時なの? 何にせよ .zsh_history を開きたいときは command $HISTFILE<tab> でもいいと思うけど >>651 確かに忘れるけど、セーフティ的な意味なら充分役立ってくれるかなと思って…… >>652 ヒストリ関連のオプションをいじってたとき、内部ヒストリがファイルに保存されているかを確認するために tail .zsh_history と history を見比べてた。 テンポラリのヒストリファイルを複数作って実験していたので、tail $HISTFILE はその用途では使いにくい。 このような需要はあまりないとは思うけど、補完を絞る方法がもしあるならモアベターだと思うんだ。 >>651 ひょっとしてサフィックスエイリアスかな? それはよさそう $ alias -s zshrc=source $ ~/.zshrc (source ~/.zshrc が行われる…) HISTFILE=~/.zsh/history_zsh って感じで場所と名前変えてる zshクソ。誰もが使いそうな変数名を特殊扱いすんな statusとかpathとかsecondsとか 遅レスですまないけど、.zhistoryって行頭が:になってるからsourceしてもスルーするんじゃないの? :って何もしないって機能だよね EXTENDED_HISTORY <C> Save each command's beginning timestamp (in seconds since the epoch) and the duration (in seconds) to the history file. The for‐ mat of this prefixed data is: `: <beginning time>:<elapsed seconds>;<command>'. : ... : ... ; rm -rf / いかんでしょw >>660 > :って何もしないって機能だよね なにも "出力しない" 機能であって何もしない機能ではない。 : $(touch /tmp/ttttt) は実際にファイルを作成する。コメントの代わりには使えない。 そもそも>>661 が言ってる通り、;で区切られてるから動く まあ、: コマンド自体が何もしないってのはそのとおりだけど 一行全体で見ると、引数部分を実行するという話 :はなにもしないし引数をすべて無視するけどシェルが:の引数と解釈しなかった部分が実行される よって;とか&&とか$()とか<()とかいろいろ実行される : を使うシーンって何? 意味は知ってたが使ったことない そういや普通にwhile : ;do〜みたいに手癖で使ってたわ あと昔書いてたシェルスクリプトでも冒頭でset -eを設定しておきつつ エラーで止まってほしくない箇所で : を使ってた てかzsh関係ないですねすんません zshが馴染みすぎるとbash、それも素の設定を使わざるを得ない状況になるとストレスがすごいよね 鯖缶の方とかそういうシチュエーション多そうだけどどうやって折り合いつけてるんだろう >>670 zshは基本入ってないんで、bashに戻りつつあるw 自作のZpluginプラグインのほぼ全てが壊れたまま運用していて、 むしろスッピンより不便なはずだが、何も感じなくなってしまった インタラクティブ環境は、慣れやすいものなのかも Macのデフォルトシェル採用って結構影響でかいような 問題なければ追従するUnixやLinuxの鳥も出てくるじゃないかと それはないなー bashとの互換性がね。shwordsplit、あれが最悪だね。 理屈はわかるんだけどね。互換性の点から見れば最悪。 うん。互換モードはあるよ。でもデフォルトじゃないんで代替にできない。 そこまでして変える必要性がない。 そもそもさ、みんな潔癖だからね。POSIX準拠。そっち優先。 debianとかubuntuは bashよりも機能が低いdashとかにしようとしてるぐらい ログインシェルはまあ自由に使っとくれって感じだろうけど デフォルトシェルはPOSIX準拠。これ一択なんでzshにはならんよ 遅いしね。 Macのログインシェルは、はたから見ると、あぁ可哀想 bashのライセンスが受け入れられなかったから 消去法でzshなんだね。ぐらいにしか思ってない。 zshを選びたくて選んだなんて誰も思ってないんだよ。 zshで何も困らない 強いて言うならQiitaとかのzsh初めて使った人の記事が初心者すぎて目障りなくらいw Macユーザのウザさ、もとい声のデカさを信じようじゃないか plugin managerをzinitに変えたら起動が爆速になった オススメ 単なる興味なんですがzshの2系より前って手に入らないですかね? zshの2系、やっと見つかりました。 https://web.archive.org/web/19990828203220/http ://www.cs.elte.hu/pub/zsh/old/?919318967 zshにBASH_ENVに相当する機能はありますか? つまりzshでシェルスクリプトを非対話型で実行した時に 任意の処理を先立って実行したいのです。 >>683 ~/.zshenv かな http://zsh.sourceforge.net/Doc/Release/Files.html スクリプト実行時に限らず対話シェル起動時にも読まれるけど INTERACTIVEオプションの状態をチェックするifで括ればよさそう if [[ ! -o INTERACTIVE ]]; then echo non-interactive fi >>684 ありがとうございます 既存の ~/zshenvは修正できないという制約があるのでINTERACTIVEの チェックは出来ませんが、ZDOTDIRを書き換えればなんとかなりそうなきがします つまりBASH_ENVをセットして起動の代わりに /tmp以下に一時的にファイルを作ってZDOTDIRをセットして実行 初期化処理の中で一時ファイルを削除したりZDOTDIRを元に戻したりとかです 10より大きいファイルディスクリプタを使うにはどうすればいいの? あー、もうやだ、クソzsh。なんでこんなこともできねーんだよクソ しかも5.5?ぐらいから挙動変わってるし、バグなんかこれ changelogみてもなにもわからねーしー、どうすればちゃんと取得できるんだよ うるせーばーか、こっちはzshがクソで困ってるんだ bashの方がいいな zshは機能が多すぎて覚えられない お勧め設定をAI的に徐々に教えてくれたらいいのに 「そのやり方、こんなふうにもできますよ?次回からこうします?」って 互換性を切り捨ててるものは結局デフォルトになることはないしね zshも互換性が完璧とは言えないから驚かれたぐらい bashがライセンス上の都合で選択できない以上どうしようもなかったんだろうが 下記はとある本にのってる zsh のプロンプトの設定なんですが、一番右の % はなんなのでしょうか? いらない気がするのですが? 誤植? # プロンプトの右はじに、false なら終了ステータスを表示。 RPS1="%(?..(%?%))" >>698 %( に対応する閉じ括弧だと解釈されるのを防ぐエスケープ >>700 kshはメンテも終わった終わったシェルだから >>703 AT&Tがそれを全て取り消して93u+をベースに最初からやり直し、だがそれも頓挫かな ksh2020はkshの派生の別物扱い。zshもksh(tchs)の派生だから兄弟のようなもんかw >>704 zshはコード自体は全く別物だったか。フォークという派生とはちょっと違うか 最凶 最凶と呼べるほどにもない全然 使えない おもちゃか パッケージ: ksh (2020.0.0+really93u+20120801-6) https://packages.debian.org/bullseye/ksh これはksh2020なのか93uなのか Debian offers ksh2020[20] in its testing version.[21] ksh2020は完全に放棄されてんな ASTからバグフィックスのためだけにフォークしたおじいちゃんが一番地道に現在活動的 >>711 >>704 AT&Tからフォークしてあくまでもメンテナンスだけを現在熱心にやってるのは https://github.com/ksh93/ksh かな。それの冒頭に>>711 のことも書いてる 一体いくつあるんだよw オリジナルはまあいいとして そこからの派生 オリジナル : 頓挫、終了 オリジナルのちゃんとしたメンテ : 無い、まだ無い 色々やった 2000 : 頓挫 地道に一人で : 地道に継続中 だけだよ。てか、いい加減過疎ってる ksh スレに行けよw zshなんも関係ないぞ >>478 oh my zshとかGrmlの話題もまったくなく何話してたんだここ >>479 使ってないわけないんだが 何故かこんなのしかいなかったからこのざまだったんだろうな zshで拡張した部分を使えば便利だが、zshしか使えない体になってしまうからなw MacでCUIアプリをダブルクリックした際の挙動と、 インタラクティブシェルで起動した際の挙動を変えたいのだけれどフラグとなる 環境変数がなになのかわからん。 bashしか使ったことなかったけど Macがzshなものでドキュメントみてたけど ページ量多すぎだろ 機能が豊富ですから 機能が豊富なzsh固有のに慣れてしまうと他が使えない体質になりそうで使わないけどw ここzshの本スレですか?随分人いないですね。 どこか別にコミュニティあるんですか? >>717 今だとzinitがホットかな でもまぁフレームワークなんて流行り廃りがあるのだし、ライトユーザが無理に使う必要もないよね oh my zshとかzinitってなんのために使うんだろう? プロンプト決めるだけでしょ? 一通り環境作り上げて不満なくなると更新とか動向全くチェックしなくなってしまう せめて数年に一度は見直さないといかんわな この腰の重さは老化のバロメータか 人が書いたやつはちゃんと追いかけておかないといつまにか別物になってる可能性があるな お前のようにここに書くようなネタが無いだけ 使ってるヤツはそれなりにいる 5chだけが世界の全てのお前にはわからんだろうけど zshのそのものの更新が一年無いって話か それでオワコンだって言ってるのか それもまたあたおかな発想だな https://news.mynavi.jp/itsearch/series/devsoft/powershell_core_-.html これ見ながらpowershellを普段のzshのようにしようかと企んだけど途中でアホ臭くなってやめた ちっとも好きになれんわpowershell 普段のユーザとしては zsh と (pd)ksh しか使ってない。 tcsh から乗り換えて zsh はもう17年だよ… そろそろ bash 勉強しなきゃダメかな… zsh を Mac のデフォルトシェルとして使う https://support.apple.com/ja-jp/HT208050 macOS Catalina から、Mac は zsh をデフォルトのログインシェルおよびインタラクティブシェルとして使うようになります。 それ以前のバージョンの macOS でも、zsh をデフォルトにすることができます。 ZLE使えばコマンドライン入力を編集できますが、 ZLEウィジェットとして登録した関数を直接呼び出して zle を呼び出すとエラーが発生します。 外部からコマンドラインを編集する方法はないのでしょうか? pashなんてあるのか いい感じならzshもパクってくれ psprint死んだらしいな Rest in Hell あれは歯が合わなくても保険等級が下に力が入ったのに そういう 本当にアンチだと思われたいんだろうな ハムはなんで今更貼るの? 今買えの馬鹿も何もしないかぎり騒がんだろうな リバウンドせずに大風呂敷広げるからこんなもんでもないままだろうね。 「もう少し待っといて昔の人気漫画だから若い子は食いつかないもんなの 求めないから実質ずっと雨なんだが やってることは結局すぐダメになると思うが zshの生成AI系サジェストってないの? そろそろ出てきていいように思う read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる