zsh: no matches found:

# 事象 : 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ではだめなのか？

```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 について - えいちゃダイアリー](https://eitya.hatenadiary.org/entry/20110707/1310023383)

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

> グロッビングは、主にファイル名の照合やファイル内のコンテンツの検索に使用されます。グロッビングでは、ワイルドカード文字を使用してパターンを作成します。
> [opensofty | Bash Globbingチュートリアル](https://opensofty.com/ja/2019/8/15/bash-globbing%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB/)

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

> ファイルグロブ・ワイルドカードとは、シェルが * ? {} [] ~ などの文字列を解釈し、ファイル名として展開することである。なお、正規表現と似てはいるが、別物である。
> [用語集:ファイルグロブ: UNIX/Linuxの部屋](http://x68000.q-e-d.net/~68user/unix/pickup?%A5%D5%A5%A1%A5%A4%A5%EB%A5%B0%A5%ED%A5%D6)

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

```zsh
# ない？
% 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。 - 訳も知らないで](https://shirusu-ni-tarazu.hatenablog.jp/entry/2013/01/18/034233)

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

```zsh
# .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追記)「ダブルクォーテーションで囲う」と[&を使って複数の引数を送ったら、引数の条件に合わないレスポンスが返ってくる](https://qiita.com/ponsuke0531/items/9f68e5b54846fdd444eb#%E4%BA%8B%E8%B1%A1--curl%E3%81%A7%E3%82%A2%E3%83%B3%E3%83%91%E3%82%B5%E3%83%B3%E3%83%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AE%E5%BC%95%E6%95%B0%E3%82%92%E9%80%81%E3%81%A3%E3%81%9F%E3%82%89%E5%BC%95%E6%95%B0%E3%81%AE%E6%9D%A1%E4%BB%B6%E3%81%AB%E5%90%88%E3%82%8F%E3%81%AA%E3%81%84%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%8C%E8%BF%94%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%9F)という事象にも対応できるのでお勧めです。

```zsh
# そのままではエラーになるけど
$ 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":"ぽんすけたろう",...
```