Many web developers and some filemaker developers likely use bash while using the terminal. You may have come across some odd issues when you use a command like “rm *”, when you’re in a folder with a lot of files or a file that starts with dash. The challenge is that bash expands * to be a list of the files and folders rather than passing it on the command. The issue with a lot of files is there’s a max command length and the issue with files that start with a dash is the command your trying to call might think your trying to pass it a argument and not a file. This feature can get fun when you use something like gnu tar.
There’s a nice write-up of the feature/issue here.
$ touch -- "--checkpoint=1"
$ touch -- "--checkpoint-action=exec=sh shell.sh"
$ echo "whoami" > shell.sh
$ touch a
$ sudo tar cf archive.tar *
root
What happens when you run “tar cf archive.tar *” is bash turns that into “tar cf archive.tar a --checkpoint=1 --checkpoint-action=exec=sh shell.sh shell.sh“. GNU tar tries to be as helpful as it can process each -- parameter in to something it should act on regardless of where it is in the command.
The question quickly becomes “What should I do to prevent issues like this?”. For most commands there’s two methods around it. The first is prefix the * with ./ (tar cf archive.tar ./*) because that will cause bash to prefix what’s passed with ./. The second solution that works with most commands is pass -- before the * (tar cf archive.tar -- *) as most commands take that as a hint that everything that’s after it is a filename.
Have questions? Let us know in a comment below, or contact our team directly. You can also check out our other posts on software development.