Skip to content

Commit

Permalink
fish completions: fix double-evaluation of commandline
Browse files Browse the repository at this point in the history
We capture the commandline tokens using fish's "commandline --tokenize" (-o).
That function turns

	echo 'some argument $(123)'

into two arguments while removing the quotes

	echo
	some argument $(123)

Later we pass "some argument $(123)" without quotes to the shell's
"eval". This is wrong and causes spurious evaluation of the parenthesis
as command substitution.

Fix this by escaping the arguments.

The downside of this change is that things like "$HOME" or "~" will
no longer be escaped. Changing this requires changes in fish, which
I'm working on.

Reproduce the issue by pasting the completion script at
fish-shell/fish-shell#10194 (comment)
to a file "grafana-manager.fish" and running

	function grafana-manager; end
	source grafana-manager.fish

Then type (without pressing Enter)

	grafana-manager public-dashboards delete --organization-id 3 --dashboard-name "k8s (public)" <TAB>

Fixes fish-shell/fish-shell#10194
  • Loading branch information
krobelus committed Jan 6, 2024
1 parent 0dec88e commit eabe4e5
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion fish_completions.go
Expand Up @@ -45,7 +45,7 @@ function __%[1]s_perform_completion
__%[1]s_debug "Starting __%[1]s_perform_completion"
# Extract all args except the last one
set -l args (commandline -opc)
set -l args (commandline -opc | string escape)
# Extract the last arg and escape it in case it is a space
set -l lastArg (string escape -- (commandline -ct))
Expand Down

0 comments on commit eabe4e5

Please sign in to comment.