Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Metaprogramming in Bash (younglogic.com)
23 points by jandeboevrie 11 months ago | hide | past | favorite | 6 comments


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:

    build_ssh qa_ssh test_ssh() {
        echo ${(U)0%_*}_SYSTEMIP
    }
    build_ssh  # Produces BUILD_SYSTEMIP
    qa_ssh  # Produces QA_SYSTEMIP
(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).

You can even use brace expansion in your function definition, iff you define it using the function keyword like "function {build,qa,test}_ssh()".

---

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.

¹ https://zsh.sourceforge.io/Doc/Release/Options.html


Nice, thanks for sharing!


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.

   (
       set -x
       ssh ...
   )


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.

I do suspect the examples are intentionally very simplified though.


I'm partial to defining echoeval()

  echoeval(){
    CMD="$@" 
    echo "$ $CMD"
    eval "$CMD"
  }
  echoeval ssh test -A
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.


I like it, but once you get that far it's probably better to have a tiny python script parse the config file and then use it.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: