Como posso canalizar o resultado de um which
comando para cd
?
Isso é o que estou tentando fazer:
which oracle | cd
cd < which oracle
Mas nenhum deles funciona.
Existe uma maneira de fazer isso (em vez de copiar / colar, é claro)?
Edit: pensando bem, este comando falhará, porque o arquivo de destino NÃO é uma pasta / diretório .
Então, estou pensando e trabalhando em uma maneira melhor de me livrar da parte "/ oracle" final agora (sed ou awk, ou mesmo Perl) :)
Edit: Ok, isso é o que eu tenho no final:
cd `which oracle | sed 's/\/oracle//g'`
dirname
,basename
?Respostas:
Você usa o pipe nos casos em que o comando espera parâmetros da entrada padrão. ( Mais sobre isso ).
Com o
cd
comando, esse não é o caso. O diretório é o argumento do comando. Nesse caso, você pode usar a substituição de comando. Use crases ou$(...)
para avaliar o comando, armazene-o na variável.path=`which oracle` echo $path # just for debug cd $path
embora possa ser feito de uma maneira muito mais simples:
cd `which oracle`
ou se o seu caminho tem caracteres especiais
cd "`which oracle`"
ou
cd $(which oracle)
que é equivalente à notação de crase, mas é recomendado (crases podem ser confundidos com apóstrofos)
.. mas parece que você quer:
cd $(dirname $(which oracle))
(o que mostra que você pode usar o aninhamento facilmente)
$(...)
(bem como crases) também funcionam em strings entre aspas duplas, o que ajuda quando o resultado pode eventualmente conter espaços.cd "$(dirname "$(which oracle)")"
(Observe que ambas as saídas requerem um conjunto de aspas duplas.)
fonte
cd "$(dirname "$(which oracle)")"
.|
abre um novo processo, portanto, mesmo secd
lido de STDIN,cmd | cd
não funcionaria (ou seja, o diretório atual no processo original permaneceria o mesmo).Com dirname para obter o diretório:
cd $(which oracle | xargs dirname)
EDITAR: cuidado com os caminhos que contêm espaços, veja o comentário @anishpatel abaixo
fonte
cd "$(which oracle | xargs -0 dirname)"
se o caminho puder conter espaços em branco. O sinalizador -0 divide a entrada por nulo em vez de espaço em branco.cd `which oracle`
Observe que esses são crases (geralmente a tecla à esquerda de 1 em um teclado americano)
fonte
cd "`which oracle`"
OK, aqui está uma solução que usa aspas corretas:
cd "$(dirname "$(which oracle)")"
Evite crases, eles são menos legíveis e sempre mencionam substituições de processos.
fonte
Você não precisa de um tubo, você pode fazer o que quiser usando a expansão do parâmetro Bash!
Dica adicional: use "type -P" em vez do comando externo "which" se estiver usando o Bash.
# test touch /ls chmod +x /ls cmd='ls' PATH=/:$PATH if cmdpath="$(type -P "$cmd")" && cmdpath="${cmdpath%/*}" ; then cd "${cmdpath:-/}" || { echo "Could not cd to: ${cmdpath:-/}"; exit 1; } else echo "No such program in PATH search directories: ${cmd}" exit 1 fi
fonte
Em resposta à sua pergunta editada, você pode retirar o nome do comando usando
dirname
:cd $(dirname `which oracle`)
fonte
além da boa resposta acima, uma coisa que precisa ser mencionada é que cd é um shell embutido, que roda no mesmo processo diferente de um novo processo como ls que é um comando.
/unix/50022/why-cant-i-redirect-a-path-name-output-from-one-command-to-cd
http://en.wikipedia.org/wiki/Shell_builtin
fonte