Por que o comando do Linux Wall não transmitirá um argumento de string?

12

Eu li aqui que este deve funcionar, mas não funciona:

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

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

Se mesg estiver definido como y , o que me impede de transmitir uma string? Note, eu confirmei que a opção arquivo funciona:

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

2 respostas

20

O problema está na sintaxe usada no artigo vinculado. Para entender o que exatamente dá errado, vamos dar uma olhada em man wall :

Uso de man wall :

wall [file]

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

Então, wall aceita de duas fontes para sua mensagem.

Argumento do nome do arquivo

Qualquer argumento de linha de comando dado a wall deve ser um nome de arquivo. Como não há uma maneira confiável de dizer se o argumento serve como mensagem ou nome de arquivo, wall assumirá que é o último, ignore qualquer coisa que apareça em padrão , e tente ler a mensagem desse arquivo.

No caso dado, ele tenta ler o arquivo who's out there e não o encontra. Observe que a leitura de um arquivo geralmente é restrita ao superusuário. Se você tivesse executado wall "who's out there" como um usuário não privilegiado, provavelmente sua saída teria sido, wall: will not read who's out there - use stdin.

Entrada padrão

Se não obtiver um argumento de nome de arquivo em sua linha de comando, ele começará a ler a partir da entrada padrão. Existem várias maneiras de alimentar informações para a entrada padrão de um comando. Uma é usar um tubo UNIX . Um pipeline conectará a saída padrão de seu comando do lado esquerdo à entrada padrão de seu comando no lado direito:

$ echo "who's out there" | wall

Outra maneira é usar um documento aqui . Um here document é uma construção de shell que passa uma string (até um marcador final especificado em uma linha própria) diretamente para a entrada padrão de um comando, sem que a etapa intermediária de ter um comando distinto produza essa saída:

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

Isso seria um "uso inútil dos documentos aqui", porque por padrão o próprio terminal será conectado à entrada padrão de wall e wall começará a ler a partir dele até receber um fim de arquivo caractere ( Ctrl + D ):

$ wall
who's out there?
^D

Como Rich Homolka observado nos comentários, alguns shells suportam here strings , o que permite passar uma string literal sem comando ou fim marcadores:

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

Todos alimentam algo na entrada padrão de wall . A diferença é que um pipeline conecta a saída de outro comando a ele, enquanto here documents e here strings transmitem a sequência diretamente. A vantagem dos dois últimos aqui é estética, pois o comando echo do exemplo pipe é um comando interno do shell, portanto, será o shell que fornece a entrada wall em todos os casos.

    
por 15.06.2011 / 17:37
0

tente com raiz

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

se o seu arquivo estiver no diretório home, caso contrário, tente outro caminho

    
por 03.08.2018 / 16:01