Me encontré con el siguiente comando:
sudo chown `id -u` /somedir
y me pregunto: ¿cuál es el significado del `
símbolo? Noté, por ejemplo, que si bien el comando anterior funciona bien, el siguiente no:
sudo chown 'id -u' /somedir
Esto es un retroceso . Un backtick no es un signo de cita. Tiene un significado muy especial. El shell evalúa (ejecuta) todo lo que escribe entre backticks antes del comando principal (como chown
en sus ejemplos), y ese comando usa el resultado de esa ejecución, como si escribiera ese resultado en ese lugar en el línea de comando.
Y qué
sudo chown `id -u` /somedir
se ejecuta efectivamente (según su ID de usuario )
sudo chown 1000 /somedir
\ \ \ \
\ \ \ `-- the second argument to "chown" (target directory)
\ \ `-- your user ID, which is the output of "id -u" command
\ `-- "chown" command (change ownership of file/directory)
`-- the "run as root" command; everything after this is run with root privileges
Eche un vistazo a esta pregunta para saber por qué, en muchas situaciones, no es una buena idea usar backticks.
Por cierto, si alguna vez quisiste usar una barra de retroceso literalmente, por ejemplo , en una cadena, puedes escapar colocando una barra invertida ( \
) antes.
$(your expression)
es una mejor manera de hacer lo mismo, ya$()
que le permite anidar expresiones. por ejemplo: locd $(dirname $(type -P touch))
colocará en el directorio que contiene eltouch
comando$()
en la mayoría de las situaciones, no hace que los backticks sean peores . Para fines prácticos, hay que admitir que son mucho más rápidos de escribir en la línea de comando (2 pulsaciones de teclas en comparación con al menos 5, incluidasShift
).$( )
definitivamente es más fácil de escribir que` `
al menos en un teclado francés.Me gustaría agregar algunos puntos más aquí.
El backtick en
`…`
realidad se llama sustitución de comando . El propósito de la sustitución de comandos es evaluar el comando que se coloca dentro del backtick y proporcionar su resultado como argumento para el comando real.La sustitución de comandos se puede hacer de dos maneras se está utilizando
$(…)
y el otro es`…`
. Ambos funcionan igual, pero la$(…)
forma es la forma moderna y tiene más claridad y legibilidad.Y entonces
Se puede preferir sobre el otro.
Y una cosa más que debe tener en cuenta aquí es la relación de sustitución de comandos con las reglas de citas bash como se menciona en el documento bash .
fuente
$(...)
anida mejor.$()
y"``"
no funcionan de la misma maneraUna nota de aclaración rara vez se cubre:
Los backticks (a veces también llamados Graves porque también funciona como acento común en francés y otros idiomas) sustituyen solo la Salida estándar , pero no el Error estándar.
Entonces para continuar con el ejemplo anterior:
funcionará como se esperaba, pero en:
which
devolverá un error, y esa salida irá al error estándar, en lugar de sustituir en la línea de comando al lado defile
; no habrá salida estándar, que puede confirmar ejecutando:En este caso,
producirá dos mensajes de error (el primero, debido
which hostnameX
y el segundo justo después del primero, debido al archivo en sí, que encuentra que falta el nombre del archivo y, por lo tanto, todo el comandoesencialmente se reducirá a solo:
que, por supuesto, es un mal uso y devolverá un error de uso.
(si desea verificarlo usted mismo, puede probar:
fuente
La tecla de retroceso `ejecuta el contenido de la cadena incluida, así que algo como esto
encontrará la ruta al comando hostname y luego le dirá cómo se creó.
El comando que ingresó en su pregunta se ejecuta
id -u
para obtener la identificación de usuario efectiva y luego cambia la propiedad de / somedir a ese usuario.fuente
Este símbolo significa que cualquier cosa dentro de él se interpreta como el resultado de ese comando.
por ejemplo:
Lo anterior hace que el
three
directorio se copie en mi/home
directorio.fuente
Los backticks se asemejan a la sustitución de comandos. Esta sintaxis acentos abiertos es arcaico, y saber el signo de dólar con dos paréntesis es común:
$()
.¿Qué es la sustitución de comandos?
La sustitución de comandos es una operación única con sintaxis dedicada tanto para ejecutar un comando como para tener su salida almacenada en una variable para su uso posterior.
Un ejemplo con fecha:
Entonces podríamos imprimir el resultado: 'La fecha es% s \ n' "$ thedate" `.
$()
.date
.$(date)
cuál es su salida la sustitución.printf
, según el comando anterior.fuente