Globbing in ZSH doesn't work with scp

PublishedSeptember 18, 2015
Read Timeabout 3 min.

Since switching to z shell (zsh) we've run into a variety of issues with globbing1 and other features not working the way we were used to with bash. This post is about resolving another of those issues. For example, while trying to scp some cachegrind files from a remote box the following error was encountered:

scp server-local:/var/www/server/cacheg* ~/Documents/cachegrinds
usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program]
           [[user@]host1:]file1 ... [[user@]host2:]file2

Basically scp is telling us we were using it incorrectly. After doing some searching around we found the following information on the zsh mailing list.

I suspect that you just want setopt no_nomatch so that the glob pattern

is left unexpanded when it doesn't find any matching files. (You may have to unsetopt null_glob csh_null_glob as well.) That's the only way I can think of that this would do as you seem to expect in bash but not in zsh.

After trying the first option—setopt no_nomatch—my command still errored out. The second one—unsetopt null_glob csh_null_glob— did allow me to type in my unmodified scp command and download my cachegrind files. However, we never like the idea of just typing in random commands without knowing what they do. Before making the change persistent we decided to do a little reading on the null_glob option. After doing that we didn't really think turning this on was the best option, so we decided to use the other alternative from the mailing list post.

I could just put single quotes around the server path to get it to

work with globbing but after many years of bash I am having trouble getting into the habbit of using single quotes with scp and it get's pretty frustrating.

That's what we decided to do, and lo, it paid off. Globbing worked as expected.

scp server-local:'/var/www/server/cacheg*' ~/Documents/cachegrinds
cachegrind.out.1426                           100% 2578     2.5KB/s   00:00
cachegrind.out.1427                           100% 2574     2.5KB/s   00:00
cachegrind.out.1428                           100% 9233KB   9.0MB/s   00:00
cachegrind.out.1430                           100% 2574     2.5KB/s   00:00
cachegrind.out.1598                           100% 2574     2.5KB/s   00:00
cachegrind.out.1600                           100% 3021KB   3.0MB/s   00:00
cachegrind.out.1602                           100% 2174KB   2.1MB/s   00:00
cachegrind.out.1604                           100%   30KB  30.4KB/s   00:00
cachegrind.out.1605                           100% 2575     2.5KB/s   00:00
cachegrind.out.1778                           100%  235     0.2KB/s   00:00
cachegrind.out.1919                           100% 9190KB   9.0MB/s   00:00
cachegrind.out.1927                           100% 2174KB   2.1MB/s   00:00
cachegrind.out.2021                           100%  233     0.2KB/s   00:00
cachegrind.out.2157                           100% 2574     2.5KB/s   00:00
cachegrind.out.2293                           100%  233     0.2KB/s   00:00
cachegrind.out.2302                           100% 2578     2.5KB/s   00:00
cachegrind.out.2346                           100%  233     0.2KB/s   00:00
cachegrind.out.2393                           100%  233     0.2KB/s   00:00
cachegrind.out.2428                           100%  233     0.2KB/s   00:00
cachegrind.out.2445                           100% 2443     2.4KB/s   00:00
cachegrind.out.2954                           100%  233     0.2KB/s   00:00
cachegrind.out.3139                           100%  233     0.2KB/s   00:00
cachegrind.out.3170                           100%  233     0.2KB/s   00:00
cachegrind.out.3278                           100%  233     0.2KB/s   00:00

  1. Globbing is a process that expands patterns to filenames.