¿Cuál es el propósito de cd `(backtick)?

56

Lo siguiente se comporta igual en Fedora y CentOS.

cd mydirectory

trabajos.

cd notadirectory

funciona (obtiene un error de Bash).

Sin embargo,

cd `

me da algún tipo de aviso:

>

Nada de lo que pensé ingresar da respuesta, simplemente se dirige a la siguiente línea para solicitar nuevamente. Simplemente uso CTRL+ Cpara volver a mi root@localhost.

¿Cuál es el propósito de esto y qué se puede hacer con él?

¡Gracias!

Mooseman
fuente
66
Entonces, su pregunta es más sobre el >backtick, ya que eso también puede ocurrir en otras situaciones
Tobias Kienzler

Respuestas:

123

Lo que ha escrito es una marca de retroceso : es el comienzo de una instrucción para golpear y evaluar lo que escribe como comando. Se >muestra para indicar que todavía está ingresando el comando en la línea siguiente.

Si cierra el backtick, encontrará que se ejecutará todo el comando. P.ej

~$ cd `
> echo /var`
/var$
John C
fuente
17
Incluso puedes anidarlos. Para un ejemplo algo realista: cd `dirname \`which ls\``= cd al directorio donde se encuentra el binario "ls". (es decir, cd /binya que es /bin/ls) [edit: phew, escapar de ese descuento es DURO]
MSalters
54
@MSalters Usted ha tropezado quizá la razón por la fiesta moderna prefiere $()a ``. Su ejemplo (más la cita correcta) se volvería cd "$(dirname "$(which ls)")"mucho menos loco.
Muzer
31
@Muzer No es solo bash lo que lo prefiere, sino que se recomienda en la especificación POSIX para usar $()sobre comillas inversas.
Starfish
59

La respuesta de JohnC ya explica el backtick. Pero lo que también se está preguntando es el >aviso. Este es un mensaje de continuación, y no solo se activa por un retroceso, sino siempre cuando su shell claramente sabe que no ha terminado de ingresar un comando. El ejemplo más fácil es poner una continuación de línea explícita \al final de una línea de entrada (que ayuda a dividir la entrada larga):

$ echo \
> hallo

Tenga en cuenta que al igual que PS1controla el aspecto del símbolo del sistema, también puede configurarlo PS2para cambiar el mensaje de continuación, p. Ej.

$ export PS2="(cont.) "
$ echo \
(cont.) hallo

Hay muchas razones para que ocurra la continuación. Un solo backtick está incompleto, pero también podría ingresar algo como

ls -l `which cp`

en una sola línea (nota al margen: se recomienda su uso $(y ), en cambio, los paréntesis hacen que sea obvio dónde comienza y termina la expansión, mientras que los backticks simples hacen que sea más difícil ver dónde falta uno. Y anidar ...). Otras posibles razones para un aviso de continuación:

  • una falta donedespués whileofor
  • un desaparecido fidespués de unif
  • un desaparecido esacdespuéscase
  • falta un paréntesis de cierre, por ejemplo, en subcapas (cd $HOME; cat .bashrc)
  • falta un comando después de la canalización |, así como la ejecución condicional ||y &&( &aunque no , ya que eso solo hace que el comando se ejecute en segundo plano)
  • una cita de cierre faltante ( 'o ")

Curiosamente, una llave faltante }después de una expansión variable ${también provoca una solicitud de continuación, pero fallará debido al espacio insertado:

$ echo ${
> PS2}
bash: ${
PS2}: bad substitution
Tobias Kienzler
fuente
2
Y lo mismo sucede cuando se usan citas :)
Steen Schütt
1
Ya conocía la respuesta a esta pregunta cuando la vi en la barra lateral, pero quería darle un +1 adicional, aunque imaginario, para obtener una respuesta en profundidad muy agradable. Este es el tipo de contenido que hace que los sitios de StackExchange sean increíbles. Entonces ... Gracias y sigue siendo genial.
Unkwntech
4

Significa que su comando aún no está completo. De hecho, el carácter de retroceso del carácter `, se usa para delimitar un comando en línea.

Ejemplo:

cd /tmp # Go to /tmp
pwd # Prints the current working  directory
ls `pwd` # Lists the content of the current working directory
Slyx
fuente
0

El backtick inicia / finaliza la sustitución del comando. El shell lee el comando dentro de los backticks, interpreta los resultados y coloca esos resultados en el comando. P.ej:. ls which cpproduce la ejecución de "which cp" y el resultado de ese comando, es decir, / bin / cp se utilizará como argumento para el comando ls. Sin embargo, este comportamiento está en desuso, a favor de la sustitución de comandos $ (cmd) más explícita y legible.

Al escribir cd `El shell espera que se ejecute un comando para seguir, y, para estar cerca con una tecla de retroceso.

En el caso de la expansión variable usando llaves, el shell presenta la solicitud de continuación porque esas llaves se evalúan léxicamente antes de que se complete la expansión.

Nicole Stevens
fuente