Por que o comando Linux wall não transmite um argumento de string?

13

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

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

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

Se mesgestiver definido como y, o que está me impedindo de transmitir uma string? Observe que confirmei que a opção de arquivo funciona:

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

Respostas:

21

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

Uso de man wall:

wall [file]

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

Portanto, wallaceita uma das duas fontes para sua mensagem.

Argumento do nome do arquivo

Qualquer argumento de linha de comando fornecido walldeve ser um nome de arquivo. Como não há uma maneira confiável de saber se o argumento é como nome da mensagem ou do arquivo, wallele assumirá que é o último, ignora qualquer coisa que esteja na entrada padrão e tenta ler a mensagem desse arquivo.

Nesse caso, ele tenta ler o arquivo who's out theree 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 sem privilégios, provavelmente sua saída teria sido,wall: will not read who's out there - use stdin.

Entrada padrão

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

$ echo "who's out there" | wall

Outra maneira é usar um documento aqui . A 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 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 à wallentrada padrão do e wallcomeçará a ler até receber um caractere de fim de arquivo ( Ctrl+D):

$ wall
who's out there?
^D

Como Rich Homolka observou nos comentários, alguns shells suportam o here stringsque permite passar uma string literal sem marcadores de comando ou final:

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

Todos alimentam algo com walla entrada padrão. A diferença é que um pipeline conecta a saída de outro comando a ele, while here documentse here stringspassa a string diretamente. A vantagem das duas últimas aqui é estética, já que o echocomando do exemplo de pipe é um comando interno do shell, portanto será o shell que fornece walla entrada em todos os casos.

peth
fonte
1
Bash / zsh tem outro formato para evitar a echo xxx | yyysintaxe, o que eu acho cludgywall <<<'your message'
rico Homolka
Não tenho certeza sobre esse Rich - a sintaxe do muro não deve se basear no shell, a menos que haja um .bashrc ou qualquer que seja o equivalente zsh. Eu também uso o bash.
Mbb
Obrigado, peth - essa é a organização sintática que eu precisava aprender!
mbb
Meu erro, Rich! Com o esclarecimento de Peth, agora vejo que você estava oferecendo a wall <<< stringsintaxe. Isso é ótimo. Algum de vocês pode explicar <<<exatamente o que está fazendo (e por que seria mais eficiente, como disse peth)? Acho estranho que um cmd que exija um arquivo possa aceitar uma sequência depois <<<. Obrigado novamente.
mbb 17/06
1
@mjb Na verdade, é improvável que o herestring seja mais eficiente que o eco - o herestrings funciona criando um arquivo temporário e anexando-o como stdin de um processo (descritor de arquivo 0), e é por isso que o wallaceita (o muro lê stdin se você não ' t especifique um arquivo). Como uma maneira de verificar se as herestrings criam um arquivo, $ readlink /proc/self/fd/0 <<< testimprimirá algo como /tmp/sh-thd-4228536315 (deleted).
Stuart P. Bentley
0

tente com root

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

se o seu arquivo estiver no diretório inicial, tente outro caminho

mohamadali abasnejad
fonte