Como encontro o caminho para um programa no Terminal?

26

Instalei um aplicativo e agora posso acessá-lo via terminal como myapplication. É um apelido, no entanto. Como posso encontrar o caminho completo para o arquivo?

Xitrum
fonte

Respostas:

30

Você pode usar typee whichdeterminar o que é um determinado comando bashe, se for um aplicativo, onde ele reside.

$ type type
type is a shell builtin
$ type cd
cd is a shell builtin
$ type ls
ls is aliased to `ls --color=auto'
$ type -P ls
/Users/danielbeck/bin/ls
$ which which
/usr/bin/which
$ which ls
/Users/danielbeck/bin/ls

Os comandos whiche type -Pfuncionam apenas para programas no seu PATHcomputador, é claro, mas você não poderá executar outros digitando o nome do comando de qualquer maneira.


Se você estiver procurando uma maneira simples de determinar onde um pacote de aplicativos OS X (GUI) está instalado (conforme usado, por exemplo, pelo opencomando), você pode executar o seguinte AppleScript curto na linha de comando:

$ osascript -e 'tell application "System Events" to POSIX path of (file of process "Safari" as alias)'
/Applications/Safari.app

Isso requer que o programa em questão (Safari no exemplo) esteja em execução.

Daniel Beck
fonte
1
Existe uma maneira de obter o mesmo resultado que o seu osascript, mas sem o programa em execução?
Mathieu Westphal
3

Atualmente, este é o método para localizar o diretório de aplicativos Firefox no OSX e Linux. Deve ser fácil de adotar para outro aplicativo. Testado no OSX 10.7, Ubuntu 12.04, Debian Jessie

#!/bin/bash

# Array of possible Firefox application names.
appnames=("IceWeasel" "Firefox")    # "Firefox" "IceWeasel" "etc

#
# Calls lsregister -dump and parses the output for "/Firefox.app", etc.
# Returns the very first result found.
#
function get_osx_ffdir()
{
    # OSX Array of possible lsregister command locations
    # I'm only aware of this one currently
    lsregs=("/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister")

    for i in "${lsregs[@]}"; do
        for j in ${appnames[@]}; do
            if [ -f $i ]; then
                # Some logic to parse the output from lsregister
                ffdir=$($i -dump |grep -E "/$j.app$" |cut -d'/' -f2- |head -1)
                ffdir="/$ffdir"
                return 0
            fi
        done
    done
    return 1
}

#
# Uses "which" and "readlink" to locate firefox on Linux, etc
#
function get_ffdir()
{
    for i in "${appnames[@]}"; do
        # Convert "Firefox" to "firefox", etc
        lower=$(echo "$i" |tr '[:upper:]' '[:lower:]')
        # Readlink uses the symlink to find the actual install location
        # will need to be removed for non-symlinked applications
        exec=$(readlink -f "$(which $lower)")
        # Assume the binary's parent folder is the actual application location
        ffdir=$(echo "$exec" |rev |cut -d'/' -f2- |rev)
        if [ -f "$ffdir" ]; then
            return 0
        fi
    done
    return 1

}


echo "Searching for Firefox..."

ffdir=""
if [[ "$OSTYPE" == "darwin"* ]]; then
    # Mac OSX
    get_osx_ffdir
else
    # Linux, etc
    get_ffdir
fi

echo "Found application here: $ffdir"

# TODO: Process failures, i.e. "$ffdir" == "" or "$?" != "0", etc
tresf
fonte
Esse é um impressionante pedaço de código. Faz algo que faz typee type -Pnão faz? O código não OSX funciona no OS X? Caso contrário, você pode explicar por que não? Se sim, por que você tem duas versões?
G-Man diz 'Reinstate Monica'
1
@ G-Man: Devido às limitações de caracteres, responderei em duas partes ... No OSX, aplicativos de terceiros não estão instalados no /binor /usr/bin, etc., mas instalados no /Applications/My3rdPartyApp.appe o binário é armazenado em um subdiretório, Contents/MacOStornando-o bastante difícil usar qualquer técnica de plataforma cruzada para determinar o local do aplicativo (daí o uso de lsregister) Pior ainda, a estrutura de diretórios OSX coloca o binário em um local separado dos recursos. O trecho acima foi escrito para ajudar na localização do defaults/prefdiretório do Firefox .
Tresf 29/05
No Ubuntu, /usr/bin/firefoxna verdade , não é o binário do Firefox, então eu uso a saída de readlinkpara localizar para onde ele aponta e, em seguida, localizo o defaluts/prefsdiretório a partir daí. Em uma nota lateral, sobre o link simbólico: Doing ls -al /usr/bin/* |grep -- '->' |wc -lilustra cerca de 303 binários nesse diretório, minha configuração do Ubuntu é na verdade links simbólicos. (cerca de 16% deles) Por esse motivo, o código acima ** deve * eventualmente ser modificado para resolver os links simbólicos recursivamente até encontrar o caminho canônico para o binário.
Tresf 29/05
Por fim, para responder à type -Ppergunta, não estou familiarizado o suficiente com esse comando para responder à pergunta. Talvez você possa elaborar um pouco. :)
tresf
Obrigado pela resposta detalhada. (Você pode editar essas informações na sua resposta.) Menciono typeporque foi a base da primeira resposta (aceita). É um shell interno que indica como os nomes especificados seriam interpretados se usados ​​como comandos. A versão POSIX, que é bastante simples, é descrita aqui . ... (continua)
G-Man diz 'Restabelecer Monica'
3

Se o programa estiver em execução, chame

ps -ef | grep PROGRAMM
Matthias M
fonte
0

O caminho dos binários é referenciado na $PATHvariável

Você pode ver o conteúdo com env.

user209678
fonte
erro no os ... sorry: '(
user209678 22/03
Sua resposta não é totalmente clara, desculpe. O que você quer dizer com "error in os ... sorry"? Também $PATHpode ser visto com env, mas echo $PATHseria menos detalhado.
slhck
0

Você pode usar " alias comando " " no terminal para listar todos os seus aliases. Ou, se você estiver em um diretório, poderá usar " pwd " para mostrar seu caminho atual.

Se você souber o nome do arquivo ou parte dele, use " find " para localizar seu arquivo.

find / -name things.jpeg
Steve Butabi
fonte
0

No MAC (OS X), você pode:

  1. Localize o aplicativo no Finder.
  2. Clique com o botão direito do mouse no aplicativo e selecione "Mostrar Conteúdo do Pacote".
  3. Localize o arquivo executável: Normalmente, ele está em Conteúdo → MacOS e tem o mesmo nome que o aplicativo.
  4. Arraste esse arquivo para sua linha de comando do Terminal em branco.

Agora você pode ver o caminho completo para o seu aplicativo na linha de comando e executá-lo a partir daí, se desejar.

Extraído do wikihow

Alex Sed
fonte