cat < file
imprime o conteúdo do arquivo em stdout.
cat > file
lê stdin até que Ctrl+ Dseja detectado e o texto de entrada seja gravado no arquivo .
cat <> file
, pelo menos na minha versão do Bash, imprime o conteúdo do arquivo com satisfação (sem erros), mas não modifica o arquivo nem atualiza o carimbo de data / hora da modificação.
Como o padrão Bash justifica o aparentemente ignorado >
na terceira declaração - e, mais importante, está fazendo alguma coisa?
fonte
4<>file
) é útil, e suponho que 0 seja um padrão tão bom quanto qualquer outro quando você o deixa de fora. Ler do stdout não é melhor.<>
também é útil em alguns sistemas (como Linux) para abrir pipes nomeados sem bloquear até que outro processo o abra para gravação.<>
operador pode ser útil ao escrever um aplicativo que funcione com vários terminais e que ocasionalmente deseje iniciar um shell. Esse shell, por sua vez, seria incapaz de executar aplicativos executados a partir de um terminal de controle comum, a menos que pudesse fazer uso de<>
... como ... o pagermore
, que lê o erro padrão para obter seus comandos, portanto entrada e saída padrão ambos estão disponíveis para o uso habitual.cat food | more - >/dev/tty03 2<>/dev/tty03
<> file
abre o arquivo (em descritor de arquivo 0 (stdin) por padrão, como<
) em + write leitura modo , sem cortes e criar o arquivo se ele não existia previamente .Isso corresponde aos
O_RDWR|O_CREAT
sinalizadores passados para aopen()
chamada do sistema. Pelo contrário,<
éO_RDONLY
e>
éO_WRONLY|O_CREAT|O_TRUNC
e>>
O_WRONLY|O_CREAT|O_APPEND
.Ter stdin gravável geralmente não é útil, pois os aplicativos geralmente não gravam no stdin. Os aplicativos geralmente não esperam ler e escrever em um descritor de arquivo que recebem na inicialização; eles geralmente leem do stdin (ou um descritor de arquivo que se abrem) e escrevem para stdout ou stderr (ou um descritor de arquivo que se abrem).
<>
pode ter seus usos:cat <> file
maiscat < file
se você não deseja que o comando falhar sefile
não existe, mas um vaziofile
criado em seu lugar.O aspecto não truncante
<>
torna útil substituir arquivos no local. Nesse caso, no entanto, você geralmente não o usa no descritor de arquivo 0:substitui os 3 primeiros bytes de
file
comxxx
.Em alguns sistemas como o Linux,
<>
em um canal nomeado (FIFO), abre o canal nomeado sem bloquear (sem esperar por outro processo abrir a outra extremidade) e garante que a estrutura do canal permaneça ativa. Por exemplo, em:sed
lida com dados recebidos de qualquer número de outros processos gravados nele e nunca os vêeof
.fonte
<>
padrão é1<>
(stdout) em vez de0<>
(stdin). Este é um bug de conformidade com POSIX que relatei e será corrigido na próxima versão. github.com/att/ast/issues/75 Mas até as versões atuais do ksh93 ficarem fora de uso, você deverá incluir o número do descritor de arquivo para usar<>
portably.mkfifo fifo; exec 3<>fifo
bloqueariam?