Как передать пустые аргументы в команду

Я полагаю, вы упустили из виду один компонент символической ссылки:

rwxr-xr-x 1 me admin 16 Oct 27 12:50  b2sum ->../../bin/gb2sum
                                                     ^----------here                 

Вы прошли через ../..части, но не выполнили ни одну из:

ls -l bin/gb2sum

или

cd bin
ls -l gb2sum

Вполне вероятно, что /usr/local/bin/gb2sumсама по себе является символической ссылкой, которая приводит к /usr/local/opt/coreutils/bin/gb2sum.

0
04.05.2020, 04:28
1 ответ

Вы можете поместить элемент в массив и использовать подстановку массива. Это имеет замечательное преимущество, заключающееся в том, что массив без элементов полностью оптимизируется. Вот измененная часть вашего собственного кода:

(
  cd "$(dirname "$BASH_SOURCE")"

  docker build --build-arg commit_id -t "test-$commit_id".

  set --
  test -n "$ti_arg" && set -- "$ti_arg"

  docker run "$@" --rm  "test-$commit_id"
)

Если вы используете bash, вы можете не использовать $@и немного упростить задачу

(
  cd "${BASH_SOURCE%/*}"

  docker build --build-arg commit_id -t "test-$commit_id".

  args=()
  [[ -n "$ti_arg" ]] && args+=("$ti_arg")

  docker run "${args[@]}" --rm "test-$commit_id"
)

Оба этих решения удваивают -кавычки "$ti_arg", чтобы защитить их от любой непреднамеренной оценки оболочки. В этом конкретном случае вы, вероятно, могли бы также просто оставить $ti_argбез кавычек в финальном docker run, чтобы оболочка либо интерполировала -ti, либо просто вычислила его, но в качестве общего решения она может сломаться при неожиданном вводе либо в переменную или его контекст (, включая IFS), поэтому я предпочитаю более сложное и полное решение выше.

docker run $ti_arg --rm "test-$commit_id"
3
28.04.2021, 23:16

Теги

Похожие вопросы