トップページunix
981コメント260KB

zsh その4

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。05/02/02 20:03:26
zshのスレその4です。

過去スレ
zsh入門
http://pc.2ch.net/test/read.cgi/unix/990283346/
zsh入門 パート2
http://pc3.2ch.net/test/read.cgi/unix/1036324177/
zsh その3
http://pc5.2ch.net/test/read.cgi/unix/1080002786/

>>2-3リンク
0701名無しさん@お腹いっぱい。2007/04/10(火) 17:24:47
>>700
違うよ。

俺は意味わかった。zshが ~の展開の際にシンボリックリンクをたどってしまう
という問題だね。Error: foo はディレクトリ の時点で気づくべき。
0702名無しさん@お腹いっぱい。2007/04/10(火) 17:32:22
いまいちよくわらん。
foo アカウントのホームディレクトリが /usr/home/foo とかになってて、
それが /home/foo へのシンボリックリンクになってる、とかそんな感じ?

つーかなんで rm -r なんてする気になったんだろ。
0703名無しさん@お腹いっぱい。2007/04/10(火) 17:39:59
同じく意味がわからん

少なくとも問題という意識はわからん

(動作の話はそういうものとしか言いようがないし...
>702 も言う通り -r はそれこそ意図的じゃん)
0704名無しさん@お腹いっぱい。2007/04/10(火) 17:41:06
unsetopt chaselinks
で解決したりする?
0705名無しさん@お腹いっぱい。2007/04/10(火) 17:44:18
シンボリックリンクに対して rm -r しても、
そのシンボリックリンクが消えるだけ(先までたどらない)からだろ。
多分、rmでエラーが出たから rm -r にしただけだろ。
まさか、~foo が実体ディレクトリを指してるとは頭から思ってないから、
シンボリックリンクを消す意味で気軽に rm -r したと。
0706名無しさん@お腹いっぱい。2007/04/10(火) 17:57:57
>>705
その「エラーが出たから -r」ってのが意味わからん。
-f ならまだわかるけど。
0707名無しさん@お腹いっぱい。2007/04/10(火) 18:00:07
で、「~foo」っていうファイルはあったのか?
なかったのか?
0708名無しさん@お腹いっぱい。2007/04/10(火) 18:01:32
>>707
お前ずれてる。~fooなんてファイルの話じゃない。
0709名無しさん@お腹いっぱい。2007/04/10(火) 18:02:21
>>708
んじゃどういう話?
0710名無しさん@お腹いっぱい。2007/04/10(火) 18:03:09
>>709
読解力ない香具師だなぁ。
0711名無しさん@お腹いっぱい。2007/04/10(火) 18:04:16
>>710
すまんね。
詳細教えてくれよ。
0712名無しさん@お腹いっぱい。2007/04/10(火) 18:06:19
/etc/passwd には、/usr/home/foo で登録されてる。
/usr/home/foo はシンボリックリンクで、実体の /home/foo を指している。

この状態で、~foo というチルダ展開は、
bashだと /usr/home/foo に展開されるが、
zshでは /home/foo に展開される。
という問題。
0713名無しさん@お腹いっぱい。2007/04/10(火) 18:08:27
では>>699さん、正解をどうぞ。
07146992007/04/10(火) 20:35:00
説明不足で、ごめんなさい。
真相は>>701, >>705さんのおっしゃる通りです。

昔 bash で
/bar$ ln -s /home/foo ~foo
として /bar/~foo を作ったのですが、もう使う必要がなくなったので今日 zsh で
/bar% rm -r ~foo
としたら、ユーザ foo のホームディレクトリ /home/foo 自体が消えてしまった
ということです。

bash では
alias rm="rm -i"
としていたので、rm のエラーに対していつもの勢いで -r の試行をしてしまいました。

>>713
私が悪いので、皆さん正解です。
0715名無しさん@お腹いっぱい。2007/04/10(火) 21:05:19
シンボリックリンクを消すならunlink
0716名無しさん@お腹いっぱい。2007/04/10(火) 22:04:28
そういえば mycom の連載があったな。すっかり忘れてた。
つっこもうと思ってそれっきりだった。
0717名無しさん@お腹いっぱい。2007/04/10(火) 22:40:44
>>716
では遠慮なくツッコメ。
0718名無しさん@お腹いっぱい。2007/04/10(火) 23:55:45
けっきょく ~foo あったんじゃん。
0719名無しさん@お腹いっぱい。2007/04/11(水) 02:25:44
シンボリックリンクにrm -rやったのがまずいよ。
0720名無しさん@お腹いっぱい。2007/04/11(水) 07:12:17
>>718
なんでやねん。欲嫁。

>>714 では、
$ ln -s /home/foo ~foo
と実行してるから、~fooという名前のsymlinkはできない。
~fooという名前のsymlinkを作るためには、

$ ln -s /home/foo '~foo'
のように、クォートするなり、./~foo みたいに ./を付けるなりしないといけないから。
0721名無しさん@お腹いっぱい。2007/04/11(水) 07:14:15
>>719
シンボリックリンクにrm -rやること自体はまずくない。(変ではあるが)
まずかったのは、それがシンボリックリンクではなかったこと。
0722名無しさん@お腹いっぱい。2007/04/11(水) 08:37:49
>721
いや、シンボリックリンクに対して rm -r するのはおかしいよ。

-r オプションは「当該ファイルをディレクトリとみなして中身もいっしょに
消す」という意図のオプションだから、仮に rm で消せなかったとしてもシン
ボリックリンクだと認識しているファイルに使うのがまずヘン。
だって中身を消したかったわけじゃないでしょ。
0723名無しさん@お腹いっぱい。2007/04/11(水) 09:45:48
>>714
> として /bar/~foo を作ったのですが、
って言ってるんだから、
~foo っていうファイル名のファイル (シンボリックリンク) が
あったんじゃないの?
0724名無しさん@お腹いっぱい。2007/04/11(水) 09:53:03
>>723
そこは確かに曖昧だが、質問者の理解不足によるものだろう。

ln -s /home/foo ~foo
を実行してシンボリックリンクを作っている以上、
~fooは展開されて、実際のパス名になるから、
「~foo」なんて名前のシンボリックリンクができたわけではないことは明らか。
0725名無しさん@お腹いっぱい。2007/04/11(水) 09:58:53
そもそも元質問者のレベルの人が、~が付いたファイルを作ること自体難しいだろう。
(クォートとかで回避する方法も知らないだろうし)
0726名無しさん@お腹いっぱい。2007/04/11(水) 10:30:52
> /bar/~foo を作った

zsh とか以前に極めて悪趣味

> シンボリックリンクにrm -rやること自体はまずくない。(変ではあるが)

まあそうだけど "まずいかどうか" じゃなくて
「意味を理解せず(考えず)」に -r というのは銃殺刑確定
"(変ではあるが)" に集約されるけどな
07276992007/04/11(水) 23:44:00
すいません、今回の件は zsh と関係ありませんでした。
原因は、「~ユーザ名」と「~非ユーザ名」で挙動が異なる事を知らなかったという
私の理解不足にあります。
zshで
foo@example:/bar% sudo rm -r ~foo
でホームディレクトリが消えた後、 bash で
foo@example:/bar$ sudo ln -s /home/foo2 ~foo2
foo@example:/bar$ sudo rm -r ~foo2
(ここで、foo2 は既に存在しないユーザ名。/home/foo2 自体は実在する。)
として、検証してしまいました。

>>718, >>723-725
「/bar/~foo」は、ありました。
しかし、実際には>>720さんの説明の通りにしなければエラーになります。
したがって、作成時にはクォートしたと思います。

>>719, >>721-722
今後は、>>715さんの様にしたいと思います。

>>726
全くその通りです。

こんな unix の初歩的な事でスレを汚してしまい、
申し訳ないです。
0728名無しさん@お腹いっぱい。2007/04/11(水) 23:51:24
>727
なるほどね。いや悪いってわけじゃないです。

ただ ~user という用法をしらない人がいると
誰も思わなかったから「ネタだろ」位に皆思ってただけで...
0729名無しさん@お腹いっぱい。2007/04/12(木) 02:39:00
ここがUNIX板でよかったね。
0730名無しさん@お腹いっぱい。2007/04/13(金) 09:32:32
ところでディレクトリに張った
シンボリックリンクをrm -rすると実際どうなるの?
0731名無しさん@お腹いっぱい。2007/04/13(金) 09:34:23
>>730
それくらい実験してみろよ。
そのシンボリックリンクだけが消えるだけだよ。
0732名無しさん@お腹いっぱい。2007/04/13(金) 14:53:23
この流れワロタ
0733名無しさん@お腹いっぱい。2007/04/13(金) 20:52:19
% echo {001..005}\\n
001
 002
 003
となって2行目以降にスペースが入ってしまうのは
なんででしょうか?
0734名無しさん@お腹いっぱい。2007/04/13(金) 20:57:26
001\\n 002\\n 003\\n 004\\n 005\\n に展開されるから
0735名無しさん@お腹いっぱい。2007/04/14(土) 02:35:54
>>734 ありがとうございます。
とすると余計な空白なしに出力するのに
最もシンプルな書き方はどうなるのでしょう
echo {001..005} | tr "[:space:]" "\n"
だとベストではないですよね
0736名無しさん@お腹いっぱい。2007/04/14(土) 02:55:22
シンプルというか真っ先に思い付くのは
for i in {001..005}; do echo $i; done
とか。zsh のことだから省略記法があるのかな。
0737名無しさん@お腹いっぱい。2007/04/14(土) 02:58:56
と書きつつ思い付いた。print -l {001..005} でいいか。
0738名無しさん@お腹いっぱい。2007/04/17(火) 22:38:46
zsh 4.3.3 released
0739名無しさん@お腹いっぱい。2007/04/21(土) 00:26:43
zsh 4.3.4 releases
0740名無しさん@お腹いっぱい。2007/04/21(土) 05:16:08
情報ゼロワロタ
http://journal.mycom.co.jp/news/2007/04/20/023/index.html
0741名無しさん@お腹いっぱい。2007/04/21(土) 08:01:49
「マルチバイトサポート」って何回言った?て感じ
0742名無しさん@お腹いっぱい。2007/04/21(土) 09:03:22
>>740
書いたあと一回でも読み返したとは思えん文だなw
0743名無しさん@お腹いっぱい。2007/04/21(土) 10:58:42
> 4.3.4は機能拡張を実施したメジャーリリース。
??メジャーリリース?
0744名無しさん@お腹いっぱい。2007/04/21(土) 11:53:18
そっとしといてやろうぜ…。
0745名無しさん@お腹いっぱい。2007/04/22(日) 02:10:35
ちんこ
0746名無しさん@お腹いっぱい。2007/04/22(日) 04:04:57
ホームをNFSで共有する環境で起動が異常に遅い事があったけど
原因が compinit する時にNFSで共有してる .zcompdump へのロックだったので
compinit -d /tmp/$USER.zcompdump
とかしたら幸せになれた
0747名無しさん@お腹いっぱい。2007/04/27(金) 10:44:22
ウォーニングだバカ……
0748名無しさん@お腹いっぱい。2007/05/06(日) 19:10:15
こんな人が記事書いているのかと思うと。
0749名無しさん@お腹いっぱい。2007/05/06(日) 20:06:07
% echo 'a
c
d'

複数行の履歴を編集する時に改行のつもりで RET を打鍵すると accept-line
が呼ばれてしまうのだけど、これを回避する方法ってありますか?
0750名無しさん@お腹いっぱい。2007/05/06(日) 20:11:17
>>749
C=v C-j かな?
0751名無しさん@お腹いっぱい。2007/05/07(月) 06:14:08
>>750
できました。ありがとう
0752名無しさん@お腹いっぱい。2007/05/09(水) 12:10:15
...微妙な記事だ

http://journal.mycom.co.jp/column/zsh/index.html
0753名無しさん@お腹いっぱい。2007/05/09(水) 13:01:30
おまいも微妙だな
0754名無しさん@お腹いっぱい。2007/05/09(水) 13:17:14
zsh-loversにのってるような変態tipsを紹介すればいいのに
0755名無しさん@お腹いっぱい。2007/05/25(金) 03:27:08
builtin sleep が欲しいなと思ったら zselect -t が使えた
0756名無しさん@お腹いっぱい。2007/05/25(金) 04:26:49
bash の complete-into-braces (M-{) って zsh だと
どうすればいいんでしょうか?
0757872007/06/09(土) 00:33:14
% wget http://www.zsh.org/pub/zsh-4.3.4.tar.gz
% tar xzvf zsh-4.3.4.tar.gz
% cd zsh-4.3.4
% ./Util/preconfig
% ./configure --enable-multibyte --enable-locale
% make
% sudo make install

どこに記述すればいいんだいよう
0758名無しさん@お腹いっぱい。2007/06/14(木) 03:25:54
tab補完でtab押すごとに補完候補が順に入力された状態になるけど
行き過ぎたときに戻る方法ってありませんか?
shift+tabとか押してみたけどダメだった
0759名無しさん@お腹いっぱい。2007/06/14(木) 03:28:36
Ctrl+Pは?
0760名無しさん@お腹いっぱい。2007/06/14(木) 03:40:28
>>759
コマンド自体が一個前のに戻るだけでした
0761名無しさん@お腹いっぱい。2007/06/14(木) 05:52:05
>>758
# 補完候補を←↓↑→で選択。
zstyle ':completion:*:default' menu select true

で、矢印キーで移動するのはダメですか?
0762名無しさん@お腹いっぱい。2007/06/14(木) 09:37:53
自分は undo を使う
0763名無しさん@お腹いっぱい。2007/06/14(木) 11:34:06
>>758
C-/
0764名無しさん@お腹いっぱい。2007/06/14(木) 15:27:19
みなさんレスありがとうございます

>>761
おぉ、そんな便利なこともできるんですね

>>762
>>763
できました
0765名無しさん@お腹いっぱい。2007/06/14(木) 21:35:57
undo したあと redo ってどうやりますか?
0766名無しさん@お腹いっぱい。2007/06/14(木) 23:03:04
unko したあと redo ってどうやりますか?
0767名無しさん@お腹いっぱい。2007/06/15(金) 10:39:14
>>766
気合いで尻の穴に吸い込め
0768名無しさん@お腹いっぱい。2007/06/15(金) 12:23:07
redoをbindkeyで好きなキーに割り当てればいいのではないでしょうか
0769名無しさん@お腹いっぱい。2007/06/17(日) 12:07:51
あるコマンドで hogehoge=filename などとファイル名を渡すときに、
=(nannkano_command) の一時ファイルで物臭をやろうとすると
hogehoge==(nannkano_command) となって == の解釈でエラーに
なってしまう。エスケープしても別のエラーになる。うまくやる方法は
ないかな。
0770名無しさん@お腹いっぱい。2007/06/17(日) 12:23:31
zfsから誘導されてきました

http://pc11.2ch.net/test/read.cgi/unix/1181716111/27

できればこのキチガイをzshから出さないようにしてください。
迷惑です。
0771名無しさん@お腹いっぱい。2007/06/17(日) 12:35:51
>>769
$ hogehoge='=(nannkano_command)'
$ echo "$hogehoge"
=(nannkano_command)

↑ってできるけど、これじゃ駄目なの?
0772名無しさん@お腹いっぱい。2007/06/17(日) 12:57:39
いや駄目だと思うが…
0773名無しさん@お腹いっぱい。2007/06/17(日) 13:03:22
>769
=(command) の一時ファイルはすぐ消えちゃうよ。かりに hogehoge=... に渡せても、それを再利用したときにはもう消えてると思うんだけど、どういう風に利用することを考えているの?
っていうか、やりたいのは `...` の方だったりしない?


あと、わたしの手元では
hogehoge==(command)
でも一時ファイル名はちゃんと取れるけどなあ。
0774名無しさん@お腹いっぱい。2007/06/17(日) 13:33:25
>>773
ファイルの要る部分だけを抜き出して渡したいんですよ。履歴に突っ込んでおいて
たまに呼び出したいぐらいの軽い用途です。

たしかに単独の変数代入だと自分ところでも動きますが、コマンド途中だとエラーに
なってしまいます。例えば、
$ echo hogehoge==(command)
zsh:  not found
0775名無しさん@お腹いっぱい。2007/06/17(日) 19:10:37
watch と打ったあとに引数のところでコマンド名の補完して欲しいんだけど
どう設定したらいいですか?
0776名無しさん@お腹いっぱい。2007/06/17(日) 19:19:04
compdef _precommand watch
かな
0777名無しさん@お腹いっぱい。2007/06/17(日) 19:29:19
>>776
できました
ありがとうございます
bashから乗り換えたけど色々と便利ですね
0778名無しさん@お腹いっぱい。2007/06/27(水) 03:40:21

拡張子に応じたコマンドを自動実行
http://journal.mycom.co.jp/column/zsh/016/
0779気まぐれアナスイ2007/06/27(水) 11:53:22
>>778
なるほど? そういう事ですか…
0780名無しさん@お腹いっぱい。2007/06/27(水) 13:56:37
mycom の zsh の連載、まだ続いてたのか
0781名無しさん@お腹いっぱい。2007/06/27(水) 14:50:24
こないだなんかネタを募集してたぞ
http://journal.mycom.co.jp/column/zsh/015/
0782名無しさん@お腹いっぱい。2007/07/01(日) 21:04:02
bindkey -v でコマンドスタックが使えないんですが
bindkey '^Q' push-line だとだめ、bindkey の出力にはちゃんとでてるのに
bindkey '^P' push-line だとできるが P は別で使ってるので...

bindkey -v の人スタックどうしてるんだろう?使ってないとか?
0783名無しさん@お腹いっぱい。2007/07/03(火) 04:42:58
bindkey "^Q" push-lineで普通に使えるが。
0784名無しさん@お腹いっぱい。2007/07/03(火) 16:58:40
今までtcshを使っていましたが、 zshならscreenでsshをする場合、
screenのウィンドウ名にログイン先のホスト名が自動で付けれる ので最近zshに乗り換えたものです。

聞きたいのですが、

% history
1 less .zshrc
2 ls
3 man man
4 history

という履歴において先ず、l(小文字のLです)とタイプして ↑を押す時、
tcshの場合は 「history」 や 「man man」 を飛ばして ll(小文字のLです)から始まる 「ls」 を表示してくれますが
zshの場合は 「history」 と表示されます。

ネットで調べたら

autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end

と.zshrcに書いて Ctrl+P、Ctrl+Nでtcsh上の矢印を使った履歴検索が実現できました。
しかし、自分はやはり慣れた↑や↓を使いたいのですが どう書けばzshで実現できるのでしょうか?

どなたかご教授おねがいします。
0785名無しさん@お腹いっぱい。2007/07/03(火) 18:48:30
bindkey で矢印キーに割り当てる
0786名無しさん@お腹いっぱい。2007/07/03(火) 18:48:48
"^[[A" "^[[B"っつーことか?

ついでに「ご教授」でもググってみることをすすめるとく
07877842007/07/03(火) 20:33:42
>>785
そうなんです 結局矢印キーは
どういうコードで表わされるかを
聞きたかったんです。


意味不明な文ですみませんでした。

>>786
ありがとうございました。
"^[[A" "^[[B" で実現できました。

「ご教授」を「教えてください」の丁寧語の意味で使っていました。
こういう場合は「ご教示」なのですね。
失礼しました。
0788名無しさん@お腹いっぱい。2007/07/03(火) 20:40:42
通常の設定なら、「Ctrl-v 何らかのキー」でそのキーの端末コードがわかる
0789名無しさん@お腹いっぱい。2007/07/03(火) 23:02:51
> screenのウィンドウ名にログイン先のホスト名が自動で付けれるので最近
> zshに乗り換えたものです。

自動で付けてくれるような機能あんだっけ?
07907842007/07/03(火) 23:27:25
>>788
あっ 本当ですね
こんな機能、全く知りませんでした。
教えてくれてありがとうございました。


>>789
すみません、文章が不正確でした。
正しくは、.zshrcに

function ssh_screen(){
eval server=?${$#}
screen -t $server ssh "$@"
}
if [ x$TERM = xscreen ]; then
alias ssh=ssh_screen
fi

を記述したらできます。
ttp://d.hatena.ne.jp/naoya/20051223/1135351050


でも自分の環境は2行目の
eval server=?${$#}
で失敗するので、この2行目を
A=$#
eval server=$"$A"
としています。
0791名無しさん@お腹いっぱい。2007/07/03(火) 23:41:57
「教授する」という動詞もあるので「ご教授願います」でも構わない、
と聞いたこともある。
0792名無しさん@お腹いっぱい。2007/07/04(水) 00:52:42
単に大仰かどうかという話だ
0793名無しさん@お腹いっぱい。2007/07/04(水) 01:11:04
>>790
これはリモートでコマンドを実行するんじゃなくて、リモートログインするという前提なのか?
それなら
function ssh_screen {
    screen -t $@[-1] ssh "$@"
}
とかでいいんじゃないの。
07947842007/07/04(水) 02:12:45
>>793
>これはリモートでコマンドを実行するんじゃなくて、リモートログインするという前提なのか?
そうです。

>function ssh_screen {
> screen -t $@[-1] ssh "$@"
>}
>とかでいいんじゃないの。
今まで動けばいいと思って、大して気にしていませんでした。

指摘されたこの機会に見直してみました。
自分はsshを使うとき
% ssh ホスト名 -l リモートのユーザー名
と使うので

function ssh_screen {
screen -t $1 ssh "$@"
}
としてみました。
0795名無しさん@お腹いっぱい。2007/07/04(水) 08:46:05
>>791
間違いではないが、
本来言いたいこととは意味がちょっと違う。
http://www.tt.rim.or.jp/~rudyard/torii009.html
0796名無しさん@お腹いっぱい。2007/07/07(土) 00:11:03
http://pc11.2ch.net/test/read.cgi/unix/1079601220/132-133n
に「諸君、私はzshが好きだ」が張られているわけだが。
どうしてこのスレに書かないのか疑問だ。w
0797名無しさん@お腹いっぱい。2007/07/07(土) 00:27:05
>>796
「zsh! zsh! zsh!」
0798名無しさん@お腹いっぱい。2007/07/09(月) 04:54:36
今いるフォルダ(フォルダ名:number)に one two three というフォルダがあるとして

    ls *~two

とすると one three が表示されます

    cd ..
    ls number/*~two

だと one two three が全部表示されてしまって two が除外されないのですがなぜでしょうか?
つД`) タスケレ !!
0799名無しさん@お腹いっぱい。2007/07/09(月) 07:31:37
ls number/*~number/two とか。
0800名無しさん@お腹いっぱい。2007/07/09(月) 09:49:08
ls number/(*~two)
■ このスレッドは過去ログ倉庫に格納されています