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, filtermas 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.
sedprovavelmente fará a nova linha extra - mas você deve lidar com isso filternã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 sedque sedpossam substituí- los por outros dados que o shell armazenou na memória para sedcanalizá-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 sedsubstituindo-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.
filterlevastdin- corresed. Você pegastdinem$GIT_INPUTseguida, imprimir que volta aostdoutlongo de um tubo parafiltere pegar o seustdoutno$FILTERED_OUTPUTe, 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.