Я полагаю, вы упустили из виду один компонент символической ссылки:
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
.
Вы можете поместить элемент в массив и использовать подстановку массива. Это имеет замечательное преимущество, заключающееся в том, что массив без элементов полностью оптимизируется. Вот измененная часть вашего собственного кода:
(
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"