Respuestas:
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.
$()
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, incluidas Shift
).
$( )
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
sudo chown $(id -u) /somedir
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 .
Si la sustitución aparece entre comillas dobles, la división de palabras y la expansión de nombre de archivo no se realizan en los resultados.
$(...)
anida mejor.
$()
y "``"
no funcionan de la misma manera
Una 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:
file `which hostname`
funcionará como se esperaba, pero en:
file `which hostnameX`
which
devolverá un error, y esa salida irá al error estándar, en lugar de sustituir en la línea de comando al lado de file
; no habrá salida estándar, que puede confirmar ejecutando:
which hostnameX
which hostnameX 2>/dev/null
En este caso,
file `which hostnameX`
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 comando
esencialmente se reducirá a solo:
file
que, por supuesto, es un mal uso y devolverá un error de uso.
(si desea verificarlo usted mismo, puede probar:
file `which hostnameX 2>/dev/null` # just the file-command bad-usage error msg is printed
file `which hostnameX 2>/dev/null` 2>/dev/null # now nothing is printed on the screen :)
La tecla de retroceso `ejecuta el contenido de la cadena incluida, así que algo como esto
file `which hostname`
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.
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: $()
.
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.
thedate=$(date)
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.
$(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