Eu quero escrever um script bash que simule o comando Korn cd: cd old new
que substitui old
no new
PWD e depois tenta cd
no novo diretório.
aqui está o roteiro:
#!/usr/bin/env bash
function korn_cd
{
case "$#" in
0 | 1 ) builtin cd $1 ;;
2 ) if ! echo "$PWD" | grep "$old" ; then
echo "bash: cd: bad subsitiution";
return 1;
fi;
new_dir=${PWD//$1/$2};
builtin cd $new_dir; ;;
* ) echo "bash: cd: wrong arg count" 1>&2; return 1 ;;
esac ;
}
em se condição, grep
deve verificar se old
está PWD
ou não. se não estiver em PWD
, a mensagem de erro "substituição incorreta" deve ser impressa. meu problema é que o exit status
of grep
é sempre 0
. então a condição if nunca é executada.
exemplo:
PWD="~/Documents/Code"
korn_cd aaaaa bbbbb
Não vejo a mensagem de erro "substituição incorreta".
como posso corrigi-lo?
Seu problema é que
old
nunca é definido, pelo menos, não na parte do seu código que você postou.grep
sempre corresponderá ao pesquisar uma string nula""
e retornará um código de saída zero:Seria mais eficiente usar uma comparação de strings em
bash
:assumindo que
$old
tem algum valor (não está definido em sua função, que é o seu problema).Eu acho que uma implementação parcial de sua função pode parecer
(emprestando a mensagem de erro da
zsh
qual tem o mesmocd
recurso embutido)Esta função não permitiria que o usuário passasse nenhum outro argumento para
cd
. Para lidar com as opções, você teria que fazer uma análise completa da linha de comando.Ignorando opções: