respuesta sencilla

respuesta sencilla

Estoy en problemas con xargsy pipecomandos. 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 pipeel comando transfiere la salida del comando izquierdo como entrada al derecho, cuando | xargsel 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' | mkdirespera mkdirleer su entrada estándar. Sin embargo, mkdirno 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 mkdirprescindirxargs

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 acomo stdin.

mkdirTrata estas cosas de manera muy diferente, de ahí el resultado que ves.

información relacionada