zsh その6at UNIX
zsh その6 - 暇つぶし2ch919:名無しさん@お腹いっぱい。
12/03/03 10:50:18.07
4.3.16で直し方が半端だったバグがあって、それを完全に修正したってこと?


920:名無しさん@お腹いっぱい。
12/03/03 13:41:34.71
はい

921:名無しさん@お腹いっぱい。
12/03/03 16:35:59.06
zshの設定って面倒くさいな
zshの本読んでたら頭痛くなってきた・・・

うまく構成して見やすいドキュメント整えた配布版ってないの

922:名無しさん@お腹いっぱい。
12/03/03 16:44:15.83
デフォルトでも十分に便利だと思うが。。。

923:名無しさん@お腹いっぱい。
12/03/03 17:14:39.37
oh-my-zshでも使ったら。

924:名無しさん@お腹いっぱい。
12/03/03 20:49:21.06
更に面倒だよ...

925:名無しさん@お腹いっぱい。
12/03/04 01:23:46.40
大丈夫か。辛いなら fish とか使ったら。今どうなってんのか知らんけど。

>>915
いやー主語はどうでもいいんだけどニュアンスでしか読めなかったから
あんまり考えずに聞いてみた。
ニュアンスで読んだら見当違いの内容も浮かんだんでね。

>>919
どっちかというと 4.3.16 に対して完全にバグ修正しかしてないよってことじゃないかな。

926:名無しさん@お腹いっぱい。
12/03/09 03:35:07.50
fish初めて知ったわw
悪くなさそうだが最終更新が2009年・・・

927:名無しさん@お腹いっぱい。
12/03/09 14:06:16.31
fishと名のつくシェルは fish.x しか知らんかった。


928:名無しさん@お腹いっぱい。
12/03/17 19:56:00.78
sudo -s でrootユーザになると、TAB押して補完するときに↓のようになるけど何でじゃろ?
補完自体はできてるんだけど

_path_files:17: command not found: _have_glob_qual
_path_files:201: command not found: _have_glob_qual
_path_files:202: command not found: _have_glob_qual
_path_files:695: command not found: _list_files


929:名無しさん@お腹いっぱい。
12/03/17 21:17:22.57
どうじゃろ?

930:名無しさん@お腹いっぱい。
12/03/17 22:20:52.25
root の設定が悪いとか

931:928
12/03/18 00:45:06.34
「sudo -u 自分 -s」 で自分のアカウントになっても同じっす。
CentOS5.7でそうなる一方、CentOS6.2では出ない。
でも、どちらもzsh4.3.17をソースからビルドしてるし、.zsh*自体も同じなんだよなぁ。

932:名無しさん@お腹いっぱい。
12/03/18 01:35:14.43
ググって最初に出てきたものくらいは当然試してるだろうけど、
「試したけど駄目だった」くらいは書け

> Remove ~/.zcompdump and restart zsh.

933:928
12/03/18 02:16:08.50
>>932
実は.zcompdump消すのは試してたんだけど、問題がでたりでなかったりで
よく分からずじまいだった。・・・で、今一度調べてやっと分かりました。

.zprofileにて
if [[ $SHELL == /bin/zsh ]] ;then
SHELL=$HOME/bin/zsh
exec $SHELL
fi
とすることでログインシェルの/bin/zshを最新のzshに切り替えてたんだけど、
インタラクティブシェルは.zprofileを読み込まないのを忘れてました。
新しいzshが作った.zcompdumpを古いzshで読んだのでこうなったと。
実にくだらないミスで・・・orz。皆さんお騒がせしました。

934:名無しさん@お腹いっぱい。
12/03/21 23:26:33.31
以下のようなディレクトリ構成のところで、hoge下にdir1/dir2へのシンボリックリンクがあるとします。

$tree hoge
hoge
|-- dir1
| |-- dir2
| |-- dir3
| `-- dir4
`-- dir2 -> dir1/dir2/

dir2にcdし、「cd ../」まで打ってからTAB押すと、dir2~dir4が候補表示され、
実際に「cd ..」するとhoge下にcdします。
ここで、補完をdir2~dir4じゃなくて、hoge下のdir1~dir2となるような方法はないですか?
ちなみにbashだとその仕様みたいです。

935:名無しさん@お腹いっぱい。
12/03/21 23:38:28.15
setopt chaselinks ?




936:934
12/03/23 00:19:46.27
>>935
それだと「cd dir2」でdir1/dir2に移動するだけなんで、やりたいことと違います。

937:名無しさん@お腹いっぱい。
12/03/24 04:19:32.53
こんな方向でどか

_directorys_symlink () { local pre="${PREFIX%/*}/"; local -a tmp; tmp=($(cd "$pre" && echo *)); compadd -f -p "$pre" -W "$(cd "$pre" && pwd -P)/" "$@" -a tmp }
_cd_symlink () { local expl; _wanted directorys-symlink expl 'directory when retain symbolic links' _directorys_symlink }
_cd_wrapped () { local pre="./${PREFIX%/*}" ret=1; [[ "$(cd "$pre" 2>/dev/null && pwd -P)" != "$(cd -P "$pre" 2>/dev/null && pwd)" ]] && _cd_symlink && ret=0; _cd && ret=0; return ret }
compdef _cd_wrapped cd

色々足らんけど

938:934
12/03/24 18:36:46.18
>>937
非常に申し訳ないですけど、さすがにそれは使う気がしないですw
でも、ありがとうございます。

939:名無しさん@お腹いっぱい。
12/03/24 22:21:42.30
それは残念。でもないか。
よく知らないけど、多分 cd の補完処理を直さないと無理じゃないかな。
ワーキングディレクトリのシンボリックリンクを残して path を辿るのは
cd の特殊な仕様みたいだけど、
cd の補完がそれを考慮せず通常の path 補完をしているようだ。
なんで _cd を直すか cd の compdef を対応版に変える必要がある
…ように見える。

940:名無しさん@お腹いっぱい。
12/03/24 22:27:23.24
関係ないけど compadd の -P と -p の違いがよくわからない。
なんか前調べた気もするけどなんだったかな…

941:名無しさん@お腹いっぱい。
12/03/27 22:42:55.78
今日rsyncを使ってて妙なことに遭遇したのですが、zshスクリプトにおいて
ディレクトリのコピーを以下のようにしていたところ、たまにrsyncのコピーが
正しくなされないことが分かりました。

while :;do
rsync -av dir.org/ dir
~dir内のファイルを書き換える処理~
done

rsyncの直前で dir.org と dir の中身を見ると確かに更新されているのですが、
rsyncはそれらのコピーをスルーしていました。今のところ以下が分かっています。

①上記現象は再現性が一定でない(正常コピーできるときもある)
②rsyncの直前でsleep 1を入れると何故か正常にコピー
③bashだと無問題

zshの問題とも限らない気がしますが、このスレの方々は経験豊富だと思うのでお尋ねします。
何かアドバイスあればお願いします。

942:名無しさん@お腹いっぱい。
12/03/30 11:06:21.55
           , -'"´  ̄`丶、_
           ,.∩         `ヽ
         〃∪'´ ̄`二二人\  ヽ
         | ツ´ ̄ ̄ ̄ ̄´ ヾ ヽ. ',
         |ハ ,ニ、   ,. - 、 | | | l |
         | ハ ィハ     ,二ヽ. | | | | | 同じ板にコピペするとそのままだけど、
         | | | じ'   |トJ〉  /)} l | 違う板にコピペすると鬼のような怖い顔
         | ハ  、'_,   ̄,, 厶イ川| に変わる摩訶不思議な佳子様コピペ。
         l l /\    .. イV\川 |
         ,' l l ,イ `l ̄´ /   /ヽl l
         l | l ハ  `メ、    〃  ヽヽ、__ノ


943:名無しさん@お腹いっぱい。
12/03/31 00:58:41.59
dir内の~ がなにかによるんじゃないの。
つーか dir が dest なんだよね。それだとコピーしない気がするけど、するんだね。
rsync はよーしらんから勘違いしてるかな。

944:941
12/03/31 21:41:34.17
すいません、自己解決しました。以下、zshとは関係ない話で恐縮ですがいちおう報告します。

rsyncはタイムスタンプを見てコピーするか否か判断しますが、>>941のファイル書き換え処理が
一瞬で終わるためにタイムスタンプが変化しないのが原因でした。
実際、ls -l --full-timeで見ると↓のように秒以降が全部0になっています。

-rw-r--r-- 1 hoge users 326 2012-03-31 21:24:24.000000000 +0900 file

ちなにみ環境はCentOS6.2です。おそらく、秒以降のタイムスタンプも記録するシステムならば
今回の問題は起こらないはずだと思います。あと、>>941で言った①と②も勘違いでした。
この現象がランダムに出たために、誤って解釈してしまいました。失礼いたしました。

945:名無しさん@お腹いっぱい。
12/04/27 23:45:48.02
ls とかのソートって unsetopt numeric_glob_sort の場合は以下の順ですよね?

特殊文字( _ を除く)
数字
大文字
_
小文字

実は、あるホストへ自宅からログインすると上記の通りなのが、
職場からログインすると「 _ 」の存在が無視されたようにソートされます。
たとえば、A _b C というファイルがA C _b の順でソートされます。

こんなことってあるんですかね?全く同じホストにログインしてるのだから、
もう残る違いはログイン元の端末環境ぐらいしか・・・

946:名無しさん@お腹いっぱい。
12/04/27 23:58:15.17
>>945
> 大文字
> _
> 小文字

> たとえば、A _b C というファイルがA C _b の順でソートされます。

大文字 大文字 _ の順になってる ってのは正常な動作じゃないのか?

947:名無しさん@お腹いっぱい。
12/04/28 00:11:03.30
>>946
すいません、間違えました。以下の意味に訂正します。

「辞書順で A C _B となるのが、A _B C となってしまう」

948:名無しさん@お腹いっぱい。
12/04/28 00:34:14.98
LC_COLLATEの値は?

949:名無しさん@お腹いっぱい。
12/04/28 14:06:53.07
>>948
自宅からの接続ですが、空でした。
こうなったら、自宅からと職場からとで環境変数が同じかどうか調べるしかないですね。

ところで「 _ 」って特殊文字には入らないんですかね?

950:名無しさん@お腹いっぱい。
12/04/28 17:38:50.08
LC_COLLATEをみるなら
それより優先されるLC_ALLと
最後の砦のLANGも見ないと…


951:名無しさん@お腹いっぱい。
12/04/28 21:22:15.90
>>949
ていうか ascii 順でしょ。

952:名無しさん@お腹いっぱい。
12/04/28 21:32:43.75
$ LC_COLLATE=en_US.UTF-8 ls
a _a b _b

$ LC_COLLATE=C ls
_a _b a b

953:名無しさん@お腹いっぱい。
12/04/28 21:59:07.34
てか、「lsとかのソート」の時点でzshもsetoptも関係なくね?

954:名無しさん@お腹いっぱい。
12/04/28 22:08:06.56
そうは思ったがきっとglobの展開のことだと汲み取ってあげたい。


955:名無しさん@お腹いっぱい。
12/04/28 22:10:50.41
lsは表示するファイルを自力でソートしているのでlsの問題。
(directory entryの出現順のままソートせずに表示するオプションがある)
glob展開の結果の順序はシェルの問題。

956:名無しさん@お腹いっぱい。
12/04/28 22:15:19.85
$ LC_COLLATE=en_US.UTF-8 zsh -c 'echo *'
a _a b _b
$ LC_COLLATE=C zsh -c 'echo *'
_a _b a b

957:名無しさん@お腹いっぱい。
12/04/30 00:17:44.41
最近はzshあんま更新されてないし、bashのがいいってまじ?

958:名無しさん@お腹いっぱい。
12/04/30 07:45:44.90
そろそろ5を出そうかというタイミングで何言ってるんだ?


959:名無しさん@お腹いっぱい。
12/05/04 23:55:38.50
>>952
>>956
両方 _a _b a b になるじゃねーか。試しちまった。

960:名無しさん@お腹いっぱい。
12/05/05 11:39:09.60
>>959
え? お前の環境変だろ。LC_ALL設定してしまってるとか。

961:名無しさん@お腹いっぱい。
12/05/05 12:00:08.94
en_US ロカールが定義されているか、未定義かで変わる?


962:名無しさん@お腹いっぱい。
12/05/05 12:10:33.40
各地域ロケールの内容ってどこかで決まってたりするの? 環境依存だと思ってた。

963:名無しさん@お腹いっぱい。
12/05/05 12:12:56.73
>>959 ではないけどやってみた。OSX Lion。

普段の環境は LC_ALL 未定義、LC_MESSAGES=C、LC_TIME=C、他のLC_xxxは未定義、LANG=ja_JP.UTF-8

$ LC_COLLATE=en_US.UTF-8 zsh -c 'echo ZSH_VERSION=$ZSH_VERSION LC_ALL=$LC_ALL LC_COLLATE=$LC_COLLATE; echo *'
ZSH_VERSION=4.3.11 LC_ALL= LC_COLLATE=en_US.UTF-8
_a _b a b

$ LC_COLLATE=C zsh -c 'echo ZSH_VERSION=$ZSH_VERSION LC_ALL=$LC_ALL LC_COLLATE=$LC_COLLATE; echo *'
ZSH_VERSION=4.3.11 LC_ALL= LC_COLLATE=C
_a _b a b



964:名無しさん@お腹いっぱい。
12/05/05 12:21:42.24
多分、en_US localeをインストールしてない環境ってオチ。それならLC_COLLATE=C と同じになって当然。

965:963
12/05/05 13:42:40.15
うちのzshはここ見てないのかねぇ。

$ ls -l /usr/share/locale/en_US.UTF-8/LC_COLLATE
lrwxr-xr-x 1 root wheel 28 2011-08-02 23:22 /usr/share//locale/en_US.UTF-8/LC_COLLATE -> ../la_LN.US-ASCII/LC_COLLATE
$ ls -l /usr/share/locale/la_LN.US-ASCII/LC_COLLATE
-r--r--r-- 1 root wheel 2086 2011-08-02 23:22 /usr/share/locale/la_LN.US-ASCII/LC_COLLATE
LNってどこだよw


966:963
12/05/05 13:52:07.08
$ strings =zsh | grep strcoll

少なくとも strcoll は呼んでないわー。 libiconvとかはリンクしてるけど。




967:名無しさん@お腹いっぱい。
12/05/05 22:53:05.58
>>960
片方 a _a b _b になるじゃねーか。LC_ALL設定失念しちまった。
なにこれ _a を 1文字として扱ってるの?

>>966
% echo $ZSH_VERSION
4.3.17
% strings =zsh | grep strcoll
strcoll

968:名無しさん@お腹いっぱい。
12/05/06 04:10:16.92
>>967

configure 次第か。


969:名無しさん@お腹いっぱい。
12/05/13 00:17:40.31
以下のように拡張子の前の数字を取り除きたいのですが、zmvでどのように実行をすれば良いでしょうか?
  hoge1.mp3 → hoge.mp3 #数字を取り除く
  hoge1hoge.mp3 → hoge1hoge.mp3 #そのまま
試行錯誤したのですが、うまく行きません。

以下のように実行すると、"hoge1.mp3"と"hoge1hoge.mp3"を"hoge.mp3"に変換しようとして失敗します。
zmv -n '([a-z]*)[0-9]*.mp3' '$1.mp3'

以下のように実行すると".mp3"に変換しようとして失敗します。
zmv -n '^([a-z]*)[0-9]*.mp3$' '$1.mp3'

970:名無しさん@お腹いっぱい。
12/05/13 00:22:52.56
>>>969
basename使うわけにはいかないの?

971:名無しさん@お腹いっぱい。
12/05/13 02:07:28.60
いつも for で zmv 使ってないから知らんけど '(*)<->.mp3' じゃないか?
多分それ re じゃないよ。

972:名無しさん@お腹いっぱい。
12/05/13 10:25:40.61
それだと

(hoge12)3.mp3

になるぜ

973:名無しさん@お腹いっぱい。
12/05/13 12:02:16.55
自分も普段は for 文を使っちゃうけど
zmv '(*)[0-9]##.mp3' '$1.mp3'
とかでいいのかな。まあ便利なのかもw

974:名無しさん@お腹いっぱい。
12/05/13 12:06:46.39
ああ>>972と同じになってしまうのか
zmv '(*).mp3' '${1%%[0-9]##}.mp3'
かな?

975:名無しさん@お腹いっぱい。
12/05/13 15:41:51.71
おお、たしかに。こうする必要があるか。 '(*[^[:digit:]])<->.mp3'

976:名無しさん@お腹いっぱい。
12/05/13 16:34:24.13
そうか shortest match flag とかはないんだな。

うーん *(#c,)<-> で落ちる。こんなパターン使わないけど。

977:969
12/05/13 17:35:45.22
ありがとうございます。

>zmv '(*).mp3' '${1%%[0-9]##}.mp3'
でうまく行きました。
これは$1のうちの%%と##で挟まれた正規表現を取り除くという書式なのでしょうか?

>おお、たしかに。こうする必要があるか。 '(*[^[:digit:]])<->.mp3'
<-->はどういう処理ですか? こちらは使いかたがよく分かりませんでした。

すみません。zmvのパラメータについて解説しているサイトはありませんか? zmvの書式が難しくて。

978:名無しさん@お腹いっぱい。
12/05/13 18:03:15.98
man zshcontrib

979:名無しさん@お腹いっぱい。
12/05/13 19:04:25.29
>>978
ありがとうございます。
man zmvで見つからない、とか思っていたので。

980:名無しさん@お腹いっぱい。
12/05/13 21:42:08.02
>>977
man zshexpn すれば詳しいことが載っているが ${name%%pattern} と x## の組み合わせだよ
前者はシェルスクリプト一般でよく使われる
<-> は <[x]-[y]> の特殊例で数字にマッチする

981:名無しさん@お腹いっぱい。
12/05/15 01:08:56.08
>>980
ありがとうございます。
ようやく理解できました。

982:名無しさん@お腹いっぱい。
12/05/15 19:43:39.12
man zshall しかうたないな

983:名無しさん@お腹いっぱい。
12/05/16 01:24:52.01
>>982
俺もman zshall派
でもそうすると目当てのものみつけにくいんだよなw

984:名無しさん@お腹いっぱい。
12/05/16 01:34:37.45
使うのは zshall でも人に示すときは絞る
昔から言われてるけど zsh 関係のドキュメントは読み物としては面白くないな

985:名無しさん@お腹いっぱい。
12/05/16 23:36:44.49
言われてた気もするけど今思うに特別そうでもない

986:名無しさん@お腹いっぱい。
12/05/17 12:33:01.23
うん。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch