Em um script de shell ...
Como capturar stdin em uma variável sem remover nenhuma nova linha à direita?
Agora eu tentei:
var=`cat`
var=`tee`
var=$(tee)
Em todos os casos $var
, não haverá a nova linha à direita do fluxo de entrada. Obrigado.
TAMBÉM: Se não houver uma nova linha à direita na entrada, a solução não deve adicionar uma .
ATUALIZAÇÃO À LUZ DA RESPOSTA ACEITADA:
A solução final que usei no meu código é a seguinte:
function filter() {
#do lots of sed operations
#see https://github.com/gistya/expandr for full code
}
GIT_INPUT=`cat; echo x`
FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter)
FILTERED_OUTPUT=${FILTERED_OUTPUT%x}
printf '%s' "$FILTERED_OUTPUT"
Se você deseja ver o código completo, consulte a página do github para expandr , um pequeno script de shell de filtro de expansão de palavra-chave git de código aberto que desenvolvi para fins de segurança da informação. De acordo com as regras configuradas nos arquivos .gitattributes (que podem ser específicos da ramificação) e no git config , o git canaliza cada arquivo através do script shell expandr.sh sempre que o fizer dentro ou fora do repositório. (É por isso que era fundamental preservar as novas linhas finais, ou a falta delas). Isso permite limpar informações confidenciais e trocar diferentes conjuntos de valores específicos do ambiente para teste, preparação e ramificações ativas.
filter
, ele adicionará caracteres de nova linha ao final de qualquer fluxo de entrada que não tenha terminado em nova linha inicialmente. De fato, originalmente fiz isso, filter
mas encontrei o problema que me levou a essa solução, porque nem "sempre adiciona novas linhas" nem "sempre tira novas linhas" são soluções aceitáveis.
sed
provavelmente fará a nova linha extra - mas você deve lidar com isso filter
não com todo o resto. E todas essas funções que você tem basicamente fazem a mesma coisa - a sed s///
. Você está usando o shell para canalizar os dados salvos em sua memória, para sed
que sed
possam substituí- los por outros dados que o shell armazenou na memória para sed
canalizá-los de volta para o shell. Por que não apenas [ "$var" = "$condition" ] && var=new_value
? Também não recebo as matrizes - você está armazenando o nome da matriz e [0]
depois sed
substituindo-a pelo valor [1]
? Talvez conversar?
filter
? Funciona perfeitamente como está. A respeito de como o código no meu link funciona e por que eu o configurei da maneira que fiz, vamos falar sobre isso em uma sala de bate-papo.
filter
levastdin
- corresed
. Você pegastdin
em$GIT_INPUT
seguida, imprimir que volta aostdout
longo de um tubo parafilter
e pegar o seustdout
no$FILTERED_OUTPUT
e, em seguida, imprimi-lo de volta parastdout
. Todos os 4 linhas na parte inferior do seu exemplo acima pode ser substituído com apenas este:filter
. Sem querer ofender aqui, é só ... você está trabalhando demais. Você não precisa das variáveis do shell na maioria das vezes - basta direcionar a entrada para o lugar certo e repassá-la.