If you're a zsh user there is a fun^wquirky way to achieve similar functionality using the MULTI_FUNC_DEF¹ option. zsh allows you to define multiple functions at the same time, so you can parametrize functions with something like:<p><pre><code> build_ssh qa_ssh test_ssh() {
echo ${(U)0%_*}_SYSTEMIP
}
build_ssh # Produces BUILD_SYSTEMIP
qa_ssh # Produces QA_SYSTEMIP
</code></pre>
(You'd need the 'P' flag to perform secondary expansion to get the value of *_SYSTEMIP if you were using this for the same reason as in the post).<p>You can even use brace expansion in your function definition, <i>iff</i> you define it using the function keyword like "function {build,qa,test}_ssh()".<p>---<p>There might be a nice solution to this with fish too, as you could create per-machine symlinks in your ~/.config/fish/functions to add a new machine.<p>¹ <a href="https://zsh.sourceforge.io/Doc/Release/Options.html" rel="nofollow">https://zsh.sourceforge.io/Doc/Release/Options.html</a>
FYI one can avoid duping a command to echo it out as in some of the examples by using set -x (set -o xtrace). It can be disabled with set +x afterwards, or you can run it and your desired command in a subshell if performance is not a priority.<p><pre><code> (
set -x
ssh ...
)</code></pre>
Having two copies of cmdline in the function is not a good design and probably most easily avoided with metaprogramming by building the cmdline first and then using it to echo and run it.<p>I do suspect the examples are intentionally very simplified though.
I'm partial to defining echoeval()<p><pre><code> echoeval(){
CMD="$@"
echo "$ $CMD"
eval "$CMD"
}
echoeval ssh test -A
</code></pre>
Variants that take a first parameter for coloring output, directing to stdout/stderr, or (for one-shot commands) variant that colors output based on return value -- are functions I have written.