Home > Enterprise >  Do not escape > within a bash variable
Do not escape > within a bash variable

Time:06-09

I have something like this in my bash script:

executor="env UNROLL=${u} TB=${tb} ${APP_DIR}/${tp} ${idx} > output.txt" 
$executor

which is not working. I realized that the problem is that it is "escaping" the > character, because if I do:

executor="env UNROLL=${u} TB=${tb} ${APP_DIR}/${tp} ${idx}" 
$executor > output.txt

then it is working properly.

How can I fix it to have everything in a single line?

CodePudding user response:

Storing Bash code in variables is a recipe for (un)escaping bugs. Not to mention how dramatically the script’s behavior can change due to (untrusted) values of expanded variables, especially when combined with eval.

If you want to store a piece of Bash code for later (re)use, use a function:

executor() {
  env UNROLL="${u}" TB="${tb}" "${APP_DIR}/${tp}" "${idx}" > output.txt
}

executor

A more flexible option would be to get the expanded variables and the target file name from the executor function’s arguments, to make it more self-contained and less context-dependent.

executor() {
  local -n args="$1"
  env UNROLL="${args['UNROLL']}" \
      TB="${args['tb']}" \
  "${args['APP_DIR']}/${args['tp']}" "${args['idx']}" > "${args['output']}"
}

declare -A some_executor_arguments=(
  ['UNROLL']='blah_unroll'
  ['tb']='blah_tb'
  ['APP_DIR']='/some/dir/blah'
  ['tp']='some_app'
  ['idx']='5'
  ['output']='output.txt'
)

executor some_executor_arguments

CodePudding user response:

I just realized I can do that with eval $executor

  • Related