¿Cómo puedo dividir un comando en varias líneas en el shell, cuando el comando es parte de una if
declaración?
Esto funciona:
if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1
fi
Esto no funciona
# does not work:
if ! fab --fabfile=.deploy/fabfile.py \
--forward-agent \
--disable-known-hosts deploy:$target; then
rc=1
fi
En lugar de ejecutar todo el comando, obtengo:
./script.sh: line 73: --forward-agent: command not found
Más importante aún, ¿qué falta en mi comprensión de Bash que me ayudará a comprender este y otros problemas similares en el futuro?
$ if ! cp -n log/server1.log \ > .; then echo no copy; fi
sin error, con una nueva línea después de\
\
? Son bastante difíciles de ver. Si lo hace, es posible que desee ver si puede hacer que su editor elimine los espacios finales o los haga más visibles.Respuestas:
La continuación de línea fallará si tiene espacios en blanco (espacios o caracteres de tabulación) después de la barra diagonal inversa y antes de la nueva línea. Sin ese espacio en blanco, su ejemplo funciona bien para mí:
Algunos detalles promovidos de los comentarios: la barra invertida de continuación de línea en el shell no es realmente un caso especial; es simplemente una instancia de la regla general de que una barra invertida "cita" el carácter que sigue inmediatamente, evitando cualquier tratamiento especial al que normalmente estaría sujeto. En este caso, el siguiente carácter es una nueva línea, y el tratamiento especial que se evita es terminar el comando. Normalmente, un personaje citado termina incluido literalmente en el comando; una nueva línea con barra invertida se elimina por completo. Pero por lo demás, el mecanismo es el mismo. Y la barra diagonal inversa solo cita el carácter que sigue inmediatamente; si ese carácter es un espacio o una pestaña, solo obtienes un espacio o una pestaña entre comillas, y cualquier nueva línea subsiguiente permanece sin comillas.
fuente
`s. For example, when adding one after the first
`, obtengo./soundops: line 73: --forward-agent: command not found
. Mi problema fue que no entendí este error. ¿Por qué tener un espacio en blanco produce ese error? El espacio en blanco +\n
"niega" el `` y delimita un comando?Para usuarios de Windows / WSL / Cygwin, etc.
Asegúrese de que sus terminaciones de línea sean alimentaciones de línea estándar de Unix, es decir
\n
(LF) solamente.El uso de los finales de línea de Windows
\r\n
(CRLF) terminará el salto de línea de comando.Esto se debe a que tener
\
al final de una línea con final de línea de Windows se traduce en\
\r
\n
.Como Mark explica correctamente anteriormente:
Esto incluye no solo el espacio (
) o las pestañas (
\t
) sino también el retorno de carro (\r
).fuente