Estoy en problemas con xargs
y pipe
comandos. Aquí hay un ejemplo =
echo 'a' | xargs mkdir
Este comando crea un directorio cuyo nombre es a
. Entonces puedo entender que este comando es equivalente amkdir a
Pero, ¿por qué no funciona este comando = echo 'a' | mkdir
?
Leí que pipe
el comando transfiere la salida del comando izquierdo como entrada al derecho, cuando | xargs
el comando transfiere la salida del comando izquierdo como argumento al derecho.
1-¿Cuáles son las diferencias entre entrada y argumento?
2- echo 'a' | mkdir
¿Por qué este comando no funciona y cuál es su equivalente?
Gracias...
Respuesta1
respuesta sencilla
Los argumentos son un insumo.
respuesta más larga
También existen otros tipos de entrada.
En su ejemplo, echo 'a' | mkdir
espera mkdir
leer su entrada estándar. Sin embargo, mkdir
no está escrito para hacer esto.
Lo que usted llama entrada es entrada estándar ( stdin
). Y la salida es estándar ( stdout
). Hay todo error estándar ( stderr
). Y un código de salida.
Respuesta aún más larga: entonces, ¿cuál es la diferencia?
Los argumentos deben estar disponibles antes de que se inicie el programa. Generalmente es: breve; contiene opciones, nombres de archivos y texto breve.
Se puede escribir en la entrada estándar mientras se ejecuta el programa; se le pueden enviar datos que no existían cuando se inició el programa; No se garantiza que pueda leerlo en orden (así que léalo secuencialmente); Puede tener una longitud arbitraria; Sólo hay una entrada estándar por proceso, si necesita más nombres de archivos, envíelos como argumentos;
como echo 'a' | xargs mkdir
prescindirxargs
mkdir "$(echo 'a')"
Los $()
medios ejecutan el comando contenido, luego reemplazan $()
y su contenido con el estándar de ese comando.
Respuesta2
Yo también estuve confundido acerca de esto durante mucho tiempo. Tomaré un ejemplo un poco más simple (no soy, ni mucho menos, un experto en bash):
wc "test"
wc <<< "test" (same as: echo "test" | wc)
El resultado de estos dos es muy diferente. El primero intenta leer un archivo test
, el segundo lo muestra 1 1 5
.
El problema aquí es que wc "test"
obtiene elargumento "test"
como entrada, mientras wc <<< "test"
tomaentrada estándar.
Entonces, cuando emite echo 'a' | xargs mkdir
(xargs significa: ejecutar como argumento), está pasando unargumentoa mkdir
; es como hacer: mkdir a
.
Por otro lado, cuando emite echo 'a' | mkdir
(más simple sería mkdir <<< 'a'
:), lo pasa a
como stdin.
mkdir
Trata estas cosas de manera muy diferente, de ahí el resultado que ves.