Многострочная команда: закомментировать одну строку

11

Мне нравится использовать следующий формат в сценариях для команд с большим количеством параметров (для удобства чтения):

docker run \
 --rm \
 -u root \
 -p 8080:8080 \
 -v jenkins-data:/var/jenkins_home \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v "$HOME":/home \
 jenkinsci/blueocean

Но иногда я хотел бы закомментировать один из этих параметров, например:

# -p 8080:8080  

Это не работает, так как EOL интерпретируется как return и команда не выполняется. Пробовал это тоже:

\ # -p 8080:8080

что тоже не сработало.

Вопрос: есть ли способ закомментировать параметр, поэтому он все еще находится на отдельной строке, но я смогу выполнить сценарий?

Chirlo
источник

Ответы:

11

Вы можете заменить пустую подстановку команд:

docker run \
 --rm \
 -u root \
 $(: -p 8080:8080 ) \
 -v jenkins-data:/var/jenkins_home \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v "$HOME":/home \
 jenkinsci/blueocean
Джефф Шаллер
источник
1
Не очень читаемый (и Vim не распознает :пустую команду или комментарий), но работает.
Трикасс
Мне нравится, что с этим решением я все еще могу скопировать его с помощью мыши, вставить его и запустить. Теперь просто нужен макрос vi, чтобы можно было легко сделать / отменить это изменение, спасибо!
Чирло
1
@tricasse альтернатива :будетtrue
Джефф Шаллер
13

Вы не можете закомментировать часть строки.

Обратите внимание, что, поскольку экранированные строки экранированы, команда на самом деле представляет собой одну строку (для синтаксического анализатора оболочки), и нет способа закомментировать часть одной строки (за исключением самого конца).

Вместо этого, возможно, просто сделайте копию исходной команды в редакторе и закомментируйте ее полностью, оставив измененную команду без комментариев:

docker run \
 --rm \
 -u root \
 -v jenkins-data:/var/jenkins_home \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v "$HOME":/home \
 jenkinsci/blueocean

# Was originally:
# docker run \
# --rm \
# -u root \
# -p 8080:8080 \
# -v jenkins-data:/var/jenkins_home \
# -v /var/run/docker.sock:/var/run/docker.sock \
# -v "$HOME":/home \
# jenkinsci/blueocean

В качестве альтернативы, если вы хотите время от времени удалять или изменять -pпараметр и его аргумент (при условии bashили оболочки с тем же синтаксисом массива):

port=( -p 8080:8080 )

docker run \
 --rm \
 -u root \
 "${port[@]}" \
 -v jenkins-data:/var/jenkins_home \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v "$HOME":/home \
 jenkinsci/blueocean

Затем просто измените или закомментируйте назначение port.

Принимая это дальше:

docker_run_args=(
    --rm 
    -u root 
    -p 8080:8080 
    -v jenkins-data:/var/jenkins_home 
    -v /var/run/docker.sock:/var/run/docker.sock 
    -v "$HOME":/home 
    jenkinsci/blueocean
)

docker run "${docker_run_args[@]}"

Внутри назначения массива нет проблем с закомментированием строки:

docker_run_args=(
    --rm 
    -u root 
#    -p 8080:8080 
    -v jenkins-data:/var/jenkins_home 
    -v /var/run/docker.sock:/var/run/docker.sock 
    -v "$HOME":/home 
    jenkinsci/blueocean
)

docker run "${docker_run_args[@]}"
Кусалананда
источник