電子書籍の厳選無料作品が豊富!

zshのワイルドカード展開について、初歩的な質問ですがよろしくお願いします。


ホームディレクトリの親ディレクトリ内に、"test1.txt"と"test2.txt"というファイルを作った上で、
 > files=~/../te*.txt
 > ls $files
とやると
 ls: ..../te*.txtにアクセスできません。 No such file or directory
とエラー表示されてしまいます。


zshrcの設定が影響しているのかと思い、zshrcを一旦カラにしてみましたが、
結果は同じでした。
bash等だと、
 > ls $files
でワイルドカードが展開され、
 test1.txt test2.txt
と表示されるのですが、zshの場合はワイルドカードを展開させる方法が特殊なのでしょうか?

A 回答 (2件)

zshは、変数への代入の右辺では、ファイル名展開が行われないようですね。


何かオプションが無いかと、man zshexpn を見てみましたが、よくわかりません。

とりあえずでよければ、
files=$(echo ~/../te*.txt)

この回答への補足

> setopt GLOB_SUBST
をzshrc、もしくはzsrenvに追記することで、ワイルドカードが展開されるようです。

ホームディレクトを/home/user1/として、
> file=~/../te*.txt
> echo $file
/home/user1/../test1.txt /home/user1/../test2.txt
> ls $file
/home/user1/../test1.txt
/home/user1/../test2.txt
となり、エラーが表示されなくなりました。

スクリプトとして利用することもあるので、
私の場合は.zshenvの方に上記"setopt GLOB_SUBST"を追記することにしました。

補足日時:2013/02/24 20:44
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
デフォルトだと、やはりファイル名展開がされないようですね。
最適な方法かは分からないのですが、一応自己解決しましたので、
補足に追記させていただきます。

最後までご回答ありがとうございました。

お礼日時:2013/02/24 20:37

今、動作確認できないのですが。



 > files=~/../te*.txt
このあと、
echo $files
したらどうなります?



念のため。
ファイル名展開は、files=の時点で行われます。lsは、その展開されたファイル名一覧を引数にもらうだけで、*等の展開は行いません
そのエラーメッセージからすると、zshでは echo $files でその入力されたままの~/../te*.txt が出力されると思います。

この回答への補足

ご回答ありがとうございます。
ホームディレクトリを/home/user1として

> files=~/../te*.txt
> echo $files
 /home/user1/../te*.txt

と表示されます。
ご指摘いただいたとおり、files=の時点のファイル名展開がなっていないようなのですが、
これはなにが原因なのでしょうか?

私の.zshrcで補完に関する部分の記述は、以下のようなものです。
(.zshrcを消去してデフォルト状態に戻しても同じなので、原因がここにはなさそうなのですが)
==========================================
autoload -U compinit; compinit -u
compinit -u
setopt list_packed# 補完リストを詰めて表示
setopt extended_glob# 拡張補完機能
bindkey "^[[Z" reverse-menu-complete# Shift-Tabで補完候補を逆順でたどる
setopt nonomatch

compdef _files zsh "*.zsh"
zstyle ':completion:*:vim:*' ignored-patterns '*?.o' '*?~' '*.exe' '*\#'
===========================================

補足日時:2013/02/22 16:43
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
補足に間違いがありました。失礼しました。
.zshrc内の2行目
compinit -u
は1行目と重複しているので不必要でした。

お礼日時:2013/02/22 19:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!