Encontrei esta ferramenta e quando baixei é um executável bash que contém código binário.
Primeiramente eu não sabia que isso era possível. Alguém sabe quem isso pode ser feito? Também não tenho certeza de quão seguro isso é geralmente, pois não posso ter certeza do que o arquivo bash contém
Jim's questions
Eu tenho uma função que dependendo de um argumento onde a funcionalidade muda.
Eu sei que posso fazer:
function foo {
PARAM1=$1
PARAM2="$2"
VAR=$3
if[[ -z "$VAR" ]]; then
# code here
else
# other code here
fi
}
Eu queria saber se existe uma abordagem mais apropriada para o bash. Isso funcionaria, mas eu não gostaria de ter algo como
foo "x" "y" "blah"
foo "x" "y" "true"
foo "y" "y" "1"
tudo para ser equivalente.
Existe uma abordagem mais adequada ao Bash?
Eu tenho um arquivo que contém novos caracteres de linha.
Estou postando o arquivo via curl
para um servidor que iria analisá-lo como json.
Ele rejeita a solicitação devido aos novos caracteres de linha.
Mas quando eu faço:
$(echo "$MY_DATA" | sed 's/$//' | tr -d '\n\r')
Funciona, mas os novos caracteres de linha sumiram.
Como posso escapar do texto para que ele mantenha os novos caracteres de linha?
Eu tentei tr '\n' '\\n'
e sed 's/\n/\\n/g
e nenhuma abordagem funcionou
Eu tenho 2 ramos diferentes A,B que têm uma versão (ligeiramente diferente) de um arquivo X.
Estou interessado em obter os commits que adicionaram alguns padrões específicos no ramo B.
O que eu faço aproximadamente: diff files| grep "^\+" | grep "$PATTERN" | for loop grep -n.. do git blame -L done
Isso funciona, mas eu queria saber se eu estou reinventando/indo uma rotatória para algo que é prontamente suportado no git.
Existe uma maneira melhor?
Por que o seguinte fornece a linha que estou procurando:
grep '<appointment-id internal:ref=1.2.3/>' test.xml
OUTPUT is <appointment-id internal:ref=1.2.3/>
Enquanto o seguinte o divide em 2 linhas?
a=($(grep '<appointment-id internal:ref=1.2.3/>' test.xml))
for i in "${a[@]}"; do
echo "checking $i"
grep -n "$i" delete.xml
done
A saída é:
checking <appointment-id
checking internal:ref=1.2.3/>
O arquivo é:
<note>
<to>Jim</to>
<from>John</from>
<heading>Reminder</heading>
<body>Some text</body>
<appointment-id internal:ref=1.2.3/>
</note>
Eu tenho um script (vamos chamá-lo scriptC
) que usa getopt
para analisar opções curtas e longas e funciona bem.
Este script está sendo chamado assim:
scriptA
executa scriptB
quais chamadas scriptC
com os parâmetros apropriados.
Pergunta: É possível passar os mesmos parâmetros como argumentos para scriptA
e depois esses serem passados eventualmente para scriptC
?
Os scripts são chamados como:
scriptB "$@"
e scriptB
eventualmente fazscriptC —param1 —param2
Tenho uma string separada por espaços e preciso concatenar a 2ª e a 3ª “palavra”/campo certificando-me de que se mais de um espaço separar as palavras/campos seja tratado corretamente.
O seguinte funciona bem:
tr -s " " |cut -d ' ' -f2 -f3 | tr " " "-"
Eu queria saber se existe uma maneira ainda mais sucinta de fazer isso?
Tenho uma função que retorna um valor.
Mas eu gostaria de adicionar alguns echo
s para facilitar a depuração. Mas isso atrapalha o resultado.
Exemplo:
function foo {
echo "In foo"
VAR="1234"
echo "Calculated item"
echo "$VAR"
}
RESULT=$(foo)
echo "RESULT=$RESULT"
Eu estava esperando para obter 1234
.
Em vez disso, a saída é:
RESULT=In foo
Calculated item
1234
Qual é a maneira correta de corrigir isso?
Eu tenho uma string com 3 campos separados por espaços em branco. Eu gostaria de concatenar os 2 últimos campos -
certificando-se de que a nova linha no final seja removida.
As seguintes obras:
echo -n "abc 1234 5679" | tr -s "" |cut -d ' ' -f2 -f3 | tr " " "-"
Eu queria saber se existe um perl
onliner para isso?
Eu tenho um arquivo que tem recuo.
Eu quero substituir uma linha específica, mas manter o recuo.
O arquivo tem uma linha como
\t\t customerId = "123" // has indentation in the start of line
Eu estou executando isso:
sed -e 's:^\s*customerId = "'${OLD_ID}'": customerId = "'${NEW_ID}':' file
Isso não faz nada. Também estou ciente de que, mesmo que funcionasse, eu estragaria o recuo. Como posso consertar isso?
Nota: A solução não precisa ser sed
, mas eu gostaria que fosse multiplataforma
ATUALIZAÇÃO
Resposta testada de @Gilles Quenot:
OLD_ID="1234"
NEW_ID="5678"
sed -E -i.bk "s:^(\s*)versionName = \"$OLD_ID\":\1versionName = \"$NEW_ID\":" testfile
Teste de amostra:
name="Jim"
customerId = "1234"
O número não foi substituído
Eu tenho uma string que representa um tipo de versão. Eu gostaria de incrementá-lo e se a segunda parte exceder 9 para ir para o próximo número mais alto O seguinte parece funcionar. Eu queria saber se existe uma maneira mais sucinta de fazer isso
FIRST=$(echo -n "$VERSION"| cut -d "." -f 1)
SECOND=$(echo -n "$VERSION"|cut -d "." -f 2)
SECOND=$((SECOND + 1))
if [[ $SECOND -ge 10 ]]; then
SECOND="0"
fi
FIRST=$(($FIRST + 1))
NEW_NUMBER=$FIRST.$SECOND
Exemplos:
Input: 102.8 Output: 102.9
Input: 102.9 Output: 103.0
Eu tenho um script que aceita um argumento e, se não for definido, usa um padrão.
VALUE=$1
if [[ -z "$VALUE" ]];
VALUE=foo #some function returns the default
fi
Então o script continua fazendo algumas coisas.
Eu gostaria de "melhorá-lo" e fornecer algumas dry run
opções. Para que, se isso for aprovado, teríamos algo como
if [[ -z "$DRY" ]];
echo "command x y z"
else
command "x" "y" "z"
fi
Como posso fazer isso?
Então estou testando o seguinte:
foo() {
printf "\nAll the parameters, each on a separate line:\n"
printf "param: %s\n" "$@"
}
foo The "nicely colored" rainbow
A saída é:
All the parameters:
param: The
param: nicely colored
param: rainbow
Portanto, se entendi corretamente, porque IFS
está definido para \t\n
obtermos os parâmetros separados por tabulação (o primeiro caractere de IFS
).
Mas por que eles são impressos em linhas separadas?
É o printf executado para cada parâmetro. Ou seja, o bash converte isso em um loop for?
Além disso, o seguinte (sem aspas duplas) gera o mesmo resultado:
printf "param: %s\n" $@
O que exatamente o seguinte faz?
MY_VAR=${MY_INPUT##*$'\n'}
Então, por que o seguinte funciona, ou seja, imprime a correspondência:
THE_REGEX='^test\/version[0-9]+([.][0-9]+)+$'
if [[ "$SOME_VAR" =~ $THE_REGEX ]]; then
echo "Match!"
fi
Mas o seguinte NÃO:
if [[ "$SOME_VAR" =~ '^test\/version[0-9]+([.][0-9]+)+$' ]]; then
echo "Match!"
fi
Qual é a diferença? É o mesmo regex
Eu tenho um processo em uma instalação do Linux que em algum momento apresenta algum tipo de pico e passa o número máximo permitido de threads/processos permitidos pelo sistema. Eu descobri isso verificando ps -elfT | wc -l
repetidamente.
Mas o que não sei é o que exatamente causa esse pico.
A saída de ps -elfT
tem muitas informações, mas não consigo entender facilmente se existe algum processo filho que faz algum tipo de "blurp" na bifurcação e faz uma bagunça.
Como eu poderia descobrir isso?
Exemplo: ps -elfT | cut -d' ' -f3 | sort |uniq
me dá os processos em execução no momento. Como eu poderia adicionar uma contagem para ver quanto cada um contribui para o total?