¿Por qué el comando de pared de Linux no transmite un argumento de cadena?

13

Leí aquí que esto debería funcionar, pero no es así:

# usage: wall [file]
root@sys:~> mesg
is y

root@sys:~> wall "who's out there"
wall: can't read who's out there.

Si mesgse establece en y, ¿qué me impide transmitir una cadena? Tenga en cuenta que he confirmado que la opción de archivo funciona:

root@sys:~> wall test
Broadcast Message from root@sys (/dev/pts/1) at 15:23 ... 
Who's out there?
mbb
fuente

Respuestas:

21

El problema radica en la sintaxis utilizada en el artículo vinculado. Para entender qué sale mal exactamente, echemos un vistazo a man wall:

Uso de man wall:

wall [file]

Wall displays the contents of file or, by default, its standard input

Entonces wallacepta cualquiera de las dos fuentes para su mensaje.

Argumento de nombre de archivo

Cualquier argumento de línea de comando dado a walldebe ser un nombre de archivo. Como no hay una manera confiable de saber si el argumento se entiende como mensaje o nombre de archivo, wallasumirá que es el último, ignorará todo lo que ingrese en la entrada estándar e intentará leer el mensaje de ese archivo.

En el caso dado, intenta leer del archivo who's out therey no lo encuentra. Tenga en cuenta que la lectura de un archivo generalmente está restringida al superusuario. Si hubiera ejecutado wall "who's out there"como un usuario sin privilegios, probablemente su salida hubiera sido,wall: will not read who's out there - use stdin.

Entrada estándar

Si no obtiene un argumento de nombre de archivo en su línea de comando, comenzará a leer desde la entrada estándar. Hay varias formas de alimentar información a la entrada estándar de un comando. Una es usar una tubería UNIX . Una tubería conectará la salida estándar de su comando del lado izquierdo a la entrada estándar de su comando del lado derecho:

$ echo "who's out there" | wall

Otra forma es usar un documento aquí . A here documentes una construcción de shell que pasa una cadena (hasta un marcador final especificado en una línea propia) directamente a la entrada estándar de un comando, sin el paso intermedio de tener un comando distinto que produzca esa salida:

$ wall << .
who's out there?
.

Esto sería un "uso inútil de los documentos aquí", porque de manera predeterminada el terminal en sí estará conectado a wallla entrada estándar y wallcomenzará a leer de él hasta que reciba un carácter de fin de archivo ( Ctrl+D):

$ wall
who's out there?
^D

Como Rich Homolka señaló en los comentarios, algunos shells admiten here stringsque permiten pasar una cadena literal sin comando o marcadores finales:

$ wall <<< "who's out there?"

Todos alimentan algo a wallla entrada estándar. La diferencia es que una tubería conecta la salida de otro comando, here documentsy here stringspasa la cadena directamente. La ventaja de los dos últimos aquí es estética, ya que el echocomando del ejemplo de tubería es un comando incorporado de shell, por lo que será el shell que proporcione wallla entrada en todos los casos.

peth
fuente
1
Bash / zsh tiene otro formato para evitar la echo xxx | yyysintaxis, lo cual me parece confusowall <<<'your message'
Rich Homolka
No estoy seguro de ese Rich: la sintaxis de wall no debe basarse en el shell a menos que haya un .bashrc o lo que sea el equivalente de zsh. Yo también uso bash.
mbb
Gracias Peth, ¡esa es la organización sintáctica que necesitaba aprender!
mbb
Mi error Rich! Con la aclaración de Peth, ahora veo que wall <<< stringofrecías el sintax. Eso es genial ¿Puede alguno de ustedes explicar qué <<<está haciendo exactamente (y por qué sería más eficiente como dijo Peth)? Me resulta extraño que un cmd que requiere un archivo pueda aceptar una cadena después <<<. Gracias de nuevo.
mbb
1
@mjb En realidad, es poco probable que la herejía sea más eficiente que el eco: las herejías funcionan creando un archivo temporal y luego adjuntándolo como un stdin de proceso (descriptor de archivo 0), razón por la cual lo wallacepta (las lecturas de pared de stdin si no lo hace ' t especificar un archivo). Como una forma de verificar que las herejías crean un archivo, $ readlink /proc/self/fd/0 <<< testse imprimirá algo así /tmp/sh-thd-4228536315 (deleted).
Stuart P. Bentley
0

prueba con root

root@username:~# wall /home/username/yourfile_name 

si su archivo está en el directorio de inicio, de lo contrario intente otra ruta

mohamadali abasnejad
fuente