Skip to content

Instantly share code, notes, and snippets.

@dekokun
Created December 26, 2011 13:16
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dekokun/1521120 to your computer and use it in GitHub Desktop.
Save dekokun/1521120 to your computer and use it in GitHub Desktop.
zsh使用時にnvmでエラーが出る場合の対処

nvm使用時にzshでエラーが出る場合の対処

zshの設定がsetopt nomatchの状態でnvmを使用すると以下のようなエラーが出る場合がある

nvm_version:17: no matches found: v*
nvm:175: no matches found: *

これは、setopt nomatchによって、ワイルドカードによるファイル名生成のパターンにマッチするものがなかった場合、エラーメッセージが表示されるわけですね

直し方はいくつかあります。

setopt nonomatchをzshrcで指定

まぁ、わかりやすいですね。nomatchを無効にします。

setopt nomatchでのエラーが発生しないようにnvm.shを変更する

具体的に、エラーが出ているのは以下2箇所なので、コマンドの先頭に=をつけてnomatchによるエラーを抑制します。 (ただし、こうするとbashで使えなくなる…) 以下、差分 (追記:これ、別の環境で実行したら何故かエラーがとまらない…)

diff --git a/nvm.sh b/nvm.sh
index 6d589d8..fb88092 100755
--- a/nvm.sh
+++ b/nvm.sh
@@ -34,7 +34,7 @@ nvm_version()
         VERSION=`node -v 2>/dev/null`
     fi
     if [ "$PATTERN" = 'all' ]; then
-        (cd $NVM_DIR; \ls -dG v* 2>/dev/null || echo "N/A")
+        (cd $NVM_DIR; =\ls -dG v* 2>/dev/null || echo "N/A")
         return
     fi
     if [ ! "$VERSION" ]; then
@@ -225,7 +225,7 @@ nvm()
     "alias" )
       mkdir -p $NVM_DIR/alias
       if [ $# -le 2 ]; then
-        (cd $NVM_DIR/alias && for ALIAS in `\ls $2* 2>/dev/null`; do
+        (cd $NVM_DIR/alias && for ALIAS in `=\ls $2* 2>/dev/null`; do
             DEST=`cat $ALIAS`
             VERSION=`nvm_version $DEST`
             if [ "$DEST" = "$VERSION" ]; then

nvm install, nvm alias default を実行(問題は発生しなくなるが原因はそのまま)

$ nvm install v0.5.10
$ nvm alias default

'*'にマッチするファイルが存在しない場合に該当エラーが出現するので、では上記コマンドでファイルを作ってしまおうというもの。 まぁ、完全なる対症療法。

万能の解決方法がない…setopt nonomatchしかないのか…

まぁ、nvm installとnvm aliasが完了していればエラーも出ないし、気にせずに使っていればそのうち出なくなるたぐいのエラーなのでどうでもいいといえばどうでもいいエラーですけどね…

参考: zshのsetopt nomatchの意味を以下で調べました。
http://www.proc.org.tohoku.ac.jp/~kato/doc/dot.zshrc.euc

追記

結局問題は、setopt nomatchによって出力されるエラーの結果が標準エラー出力として取得できていないことなので、それの解決法を探してみた。以下方法でいけそう。これならbashでもいける。

diff --git a/nvm.sh b/nvm.sh
index 6d589d8..fb88092 100755
--- a/nvm.sh
+++ b/nvm.sh
@@ -34,7 +34,7 @@ nvm_version()
         VERSION=`node -v 2>/dev/null`
     fi
     if [ "$PATTERN" = 'all' ]; then
-        (cd $NVM_DIR; \ls -dG v* 2>/dev/null || echo "N/A")
+        (cd $NVM_DIR; (\ls -dG v*) 2>/dev/null || echo "N/A")
         return
     fi
     if [ ! "$VERSION" ]; then
@@ -225,7 +225,7 @@ nvm()
     "alias" )
       mkdir -p $NVM_DIR/alias
       if [ $# -le 2 ]; then
-        (cd $NVM_DIR/alias && for ALIAS in `\ls $2* 2>/dev/null`; do
+        (cd $NVM_DIR/alias && for ALIAS in `(\ls $2*) 2>/dev/null`; do
             DEST=`cat $ALIAS`
             VERSION=`nvm_version $DEST`
             if [ "$DEST" = "$VERSION" ]; then

コマンドがエラー出力を発しているわけではなく、シェルがエラー出力を出しているからサブシェルでコマンドを起動しないとエラー出力を拾えないっていうことですよね。

で、プルリクエストを送ってみました。 nvm-sh/nvm#93
で、なんかコメントがつかないなーと思ってたら、Wikiに以下記載が…
https://github.com/creationix/nvm/wiki/NVM-Forks
「自分の使う機能以外は取り込まない。zsh使いたければforkしなさい」って意味だよねこれ…
というわけで、対応した私のリポジトリを記載しておきます。
https://github.com/dekokun/nvm

追記

ついでに、私のnvmに色々な機能を追加しました。
https://github.com/dekokun/nvm
nvm install latest(最新のnodeをインストール)とか、nvm ls remote(インストール可能なnode一覧を出力)とか。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment