24
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

zsh: no matches found:

Last updated at Posted at 2020-11-27

事象 : curlコマンドでGETのパラメータを指定したら怒られた

  • 環境
    • macOS Big Sur バージョン11.0.1
    • curl 7.64.1 (x86_64-apple-darwin20.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.41.0

えっ?bash使っている時はそんなこと言わないのに・・・zshではだめなのか?

% curl https://xx.backlog.jp/api/v2/users/myself?apiKey=ponNoApiKey
zsh: no matches found: https://xx.backlog.jp/api/v2/users?apiKey=ponNoApiKey

原因 : グロッビングでの特殊文字に「?」が該当したため?

setopt EXTENDED_GLOB
でグロッビングでの特殊文字の使用をするという形になっていて、そこに反応したせいで、上の引数の # がグロブでの使用となり、 no matches found となってしまった、、、という。
zsh: no matches found について - えいちゃダイアリー

グロッビング?って何だ?

グロッビングは、主にファイル名の照合やファイル内のコンテンツの検索に使用されます。グロッビングでは、ワイルドカード文字を使用してパターンを作成します。
opensofty | Bash Globbingチュートリアル

わかるようなわからないような・・・

ファイルグロブ・ワイルドカードとは、シェルが * ? {} [] ~ などの文字列を解釈し、ファイル名として展開することである。なお、正規表現と似てはいるが、別物である。
用語集:ファイルグロブ: UNIX/Linuxの部屋

なるへそ今回は「?」が引っかかったのか・・・と思って設定を見てみる・・・

# ない?
% setopt
combiningchars
interactive
login
monitor
shinstdin
zle

# よくわかんない
% unsetopt | grep -i glob
nobareglobqual
nocaseglob
cshnullglob
extendedglob
noglob
noglobalexport
noglobalrcs
globassign
globcomplete
globdots
globstarshort
globsubst
kshglob
nullglob
numericglobsort
shglob
warncreateglobal

EXTENDED_GLOBが設定されているのかよくわからないがこんな情報も見つける・・・でもnomatcもないし・・・

zshの設定がsetopt nomatchの状態でnvmを使用すると以下のようなエラーが出る場合がある
nvm_version:17: no matches found: v*
nvm:175: no matches found: *
これは、setopt nomatchによって、ワイルドカードによるファイル名生成のパターンにマッチするものがなかった場合、エラーメッセージが表示されるわけですね

対応1 : .zshrcでnonomatchを設定する

参考 : 【shell】zshでno matches found。 - 訳も知らないで

何がどこで設定されこうなっているかわからなくてもやつくが、とにかく設定して作業を進めるべし。

# .zshrcに
% subl ~/.zshrc
# nonomatchを設定して
% cat ~/.zshrc| grep setopt
setopt nonomatch
# 反映すると
% source ~/.zshrc
# curlでパラメータが指定できるようになった
% curl https://xx.backlog.jp/api/v2/users/myself?apiKey=ponNoApiKey
{"id":1,"userId":"t-ponsuke","name":"ぽんすけたろう",...

対応2 : URLをダブルクォーテーションかシングルクォーテーションで囲う

@YusukeTagawa さんにコメントで教えていただきましたので早速やってみました。
(2022-03-10追記)「ダブルクォーテーションで囲う」と&を使って複数の引数を送ったら、引数の条件に合わないレスポンスが返ってくるという事象にも対応できるのでお勧めです。

# そのままではエラーになるけど
$ curl https://xx.backlog.jp/api/v2/users/myself?apiKey=ponNoApiKey
zsh: no matches found: https://xx.backlog.jp/api/v2/users/myself?apiKey=ponNoApiKey

# ダブルクォーテーションで囲うとイケる
$ curl "https://xx.backlog.jp/api/v2/users/myself?apiKey=ponNoApiKey"
{"id":1,"userId":"t-ponsuke","name":"ぽんすけたろう",...

# シングルクォーテーションで囲ってもイケる
$ curl 'https://xx.backlog.jp/api/v2/users/myself?apiKey=ponNoApiKey'
{"id":1,"userId":"t-ponsuke","name":"ぽんすけたろう",...
24
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?