¿Cómo saber qué parámetro se suministra a un comando con un operador de redirección?

9

Esto funciona:

$ echo "notificar-enviar HOLA" | en este momento

Esto no:

$ en este momento <echo "notificar-enviar HOLA"

Dice 'archivo o directorio no encontrado ".

Entiendo que hay una -fopción para este comando, con el cual puedo suministrar el archivo para que se ejecute en un momento dado.

Entonces esto me hizo pensar ... en general, ¿cómo sé para qué parámetro los operadores de redireccionamiento proporcionan el valor?

vlad-ardelean
fuente
55
Tu pregunta no es muy clara. ¿Qué quieres decir con "qué parámetro"? Probablemente su problema sea que usted (erróneamente) piensa eso foo | bary bar < fooes equivalente. No son.
terdon

Respuestas:

16

Estás usando dos cosas diferentes aquí y deberías usar una tercera. Veamos:

  1. |: Este es el operador de tubería , sirve para pasar la salida de un proceso como entrada a otro:

    foo | bar

    Esto ejecuta el programa fooy pasa su salida como entrada al programa bar.

  2. >, <, >>Y <<: Estos son los operadores de redirección , que sirven para enviar datos a / desde archivos :

    • foo > bar: ejecuta el programa fooy guarda su salida en el archivo bar , sobrescribe 1 su contenido y lo crea si no existe.

    • foo >> bar: ejecuta el programa fooy guarda su salida en el archivo bar , agregando su contenido y creándolo si no existe.

    • foo < bar: se ejecuta foo, diciéndole que lea la entrada del archivo bar .

    • El <<es un caso especial, ya que no tiene sentido "agregar" entradas a un comando, <<se usa principalmente (exclusivamente AFAIK) para los documentos de Here :

      $ cat << EOF > file.txt
      > Hello World!
      > EOF

      La construcción << SomeStringHere > Out.fileredirigirá todo el texto escrito hasta que encuentre la cadena final ( EOFen el ejemplo anterior) al archivo de destino. Aquí los documentos le permiten formatear fácilmente cadenas de varias líneas e incluir variables y caracteres especiales.

  3. El <<<operador, la cadena Here , es como un documento Here pero expande las variables. Así por ejemplo:

    grep foo <<< "$bar"

    El comando anterior es equivalente a echo "$bar" | grep foo.

  4. Lo que realmente está buscando se llama sustitución de proceso y es otra forma de pasar la salida de un comando a otro. Consta de <(command).

    foo <(bar) 

    Entonces, por atejemplo, podrías hacer

    at now < <(echo "notify-send HELLO")

    Los trabajos anteriores debido a la sustitución de proceso en realidad crea un archivo (leer el enlace anterior para más detalles) y es el descriptor de archivo de ese archivo que se pasa con <a at now.


1 El comportamiento predeterminado es sobrescribir, esto se puede modificar configurando la noclobberopción bash. Si se establece, echo foo > barfallará si barexiste. En ese caso, se puede forzar su uso echo foo |> bar. Ver la sección 3.6.2 aquí .

terdon
fuente
1
¡Buena respuesta! muy completo (especialmente las diferencias entre los redirectores de archivos)
steeldriver
@steeldriver aww, caramba, gracias :) Y así fue esta bajo joya apreciada. Desearía poder haberte dado un +1 por cada uno de los diversos escollos que tu solución evita en silencio.
terdon
¿Podría también expandir para incluir información sobre <<y <<<(que @steeldriver mencionó en su respuesta)? Además, ¿hay más, algo como >>>>>>o <<<<<<<<<<?
Aditya
@Aditya hecho. Y no se preocupe, se detiene en <<<:)
terdon
12

En este caso, echo "notify-send HELLO"es un proceso, no un archivo, por lo que necesita una sustitución del proceso en lugar de una redirección de archivo

at now < <(echo "notify-send HELLO")

También podría haber usado una cadena here para evitar el echocomando por completo

at now <<< "notify-send HELLO"
conductor de acero
fuente
55
Habiendo visto el tipo de preguntas que sueles gustar (las mismas que yo hago), creo que deberías dedicar más tiempo a Unix y Linux . Vivimos y morimos por trucos geniales por allí ...
terdon
@terdon: ¿lo mismo para los golfistas perl?
Sylvain Pineau
1
@SylvainPineau oooh sí. Mucho :) En serio, el tipo de pregunta que tú, Steeldriver y yo disfrutamos es mucho más común allí. El lugar está lleno de geeks de la línea de comandos, algunos de los cuales tienen un conocimiento absurdo.
terdon