10

I have the following function in my .zshrc which, in theory, allows me to write a commit message without needing quotation marks.

cm(){
    git commit -m "$@"
}

When I run it (cm foo bar), I get the following error:

zsh: unknown file attribute

Does $@ mean the same thing in zsh as it does in bash?

Marcel
  • 1,034
  • 1
  • 17
  • 35

2 Answers2

8

Accoring to this article, * and @ both contain an array of the positional parameters.

The parameters *, @ and argv are arrays containing all the positional parameters; thus $argv[n], etc., is equivalent to simply $n.

And...

A subscript of the form [*] or [@] evaluates to all elements of an array; there is no difference between the two except when they appear within double quotes. "$foo[*]" evaluates to "$foo[1] $foo[2] ...", whereas "$foo[@]" evaluates to "$foo[1]" "$foo[2]" ....

Adaephon
  • 16,929
  • 1
  • 54
  • 71
Adam Lee
  • 1,784
  • 1
  • 11
  • 15
  • That seems to work now with ${*} instead of $*. I wonder why zsh would implement this differently. – Marcel May 13 '16 at 23:19
  • You mean that you substituted "$@" in your code with "${@}"? – Adam Lee May 13 '16 at 23:23
  • No sorry that was confusing. I substituted `"$@"` with `"${*}"`. I put the wrong thing in my comment because that's what I started with. I just switched $* to $@ when I was troubleshooting. As I understand it, $@ is like an array and $* is a space-separated string. – Marcel May 13 '16 at 23:26
0

If you are also getting this similar error zsh: unknown file attribute: 1 while running a command then it may be due to character ( and )

For me I was trying to delete a git remote branch with name example-(123) it throws the above mentioned error, you can fix it by wrapping the branch name in single/double quotes e.g below

git push --delete origin "example-(123)"

Sameer
  • 4,758
  • 3
  • 20
  • 41