Как узнать местоположение программы в терминале Ubuntu?

Как узнать местоположение программы в Ubuntu? Например у меня OracleКак получить папку Расин (местоположение) из Oracle?

5 ответов

Решение

Вы также можете использовать whereis, Он покажет путь к двоичному файлу, а также некоторые связанные файлы, такие как документация:

whereis program

Bash и Dash имеют command встроенная команда, которая может показать вам местоположение команды с -v переключатель, если команда ссылается на исполняемый файл. Для встроенных команд и псевдонимов результат отличается. Примеры:

$ command -v java
/usr/bin/java
$ echo $?
0
$ command -v echo
echo
$ command -v ls
alias ls='ls -h --color=auto'
$ command -v non-existing_command; echo $?
1

Кроме того, все оболочки, полученные из Sh, знают type Команда, которая говорит вам о характере любой команды.

$ type java
java is /usr/bin/java
$ type ls
ls is aliased to `ls -h --color=auto'
$ type echo
echo is a shell builtin
$ type non-existing_command
bash: type: non-existing_command: not found

Если ваша оболочка (например, Bash) поддерживает это, type -a перечисляет все, к чему может относиться команда:

$ type -a ls
ls is aliased to `ls -h --color=auto'
ls is /bin/ls
$ type -a echo
echo is a shell builtin
echo is /bin/echo
$ type -a touch
touch is /usr/bin/touch
touch is /bin/touch

Ты можешь использовать which определить, какой двоичный файл выполняется.

  • which ssh
  • which Oracle

Это примеры, которые возвращают полный путь к двоичным файлам.

Вы также можете использовать whereis найти дополнительную информацию, но это может сбить вас с толку в этой ситуации.

Как уже упоминал Дэвид Фёрстер, вы можете использовать type -a который покажет все места, где данный исполняемый файл может быть найден в активном $PATH:

$ type -a now
now is /home/rick/bin/now
now is /mnt/e/bin/now

type -a также определит, является ли команда встроенной в оболочку. Например:

$ type -a test
test is a shell builtin
test is /usr/bin/test

type -a также определит, является ли команда ключевым словом оболочки. Например:

$ type -a if
if is a shell keyword

type a перечисляет программы, команды, встроенные функции оболочки и ключевые слова оболочки в иерархическом порядке, в котором они будут вызываться в зависимости от $PATH переменная окружения. Путем изменения PATH= в другом порядке это меняет, какая версия программы называется. Это удобно, когда на одном компьютере установлены версии программ для производства, разработки и тестирования.

Программа не в $PATH

Что делать, если программа не на вашем пути? Самый быстрый способ найти это с locate команда:

$ locate .bashrc
/etc/bash.bashrc
/etc/skel/.bashrc
/home/rick/.bashrc
/home/rick/.bashrc~
/mnt/e/.bashrc
/mnt/e/Temporary Work/.bashrc
/usr/share/base-files/dot.bashrc
/usr/share/doc/adduser/examples/adduser.local.conf.examples/bash.bashrc
/usr/share/doc/adduser/examples/adduser.local.conf.examples/skel/dot.bashrc

Я вроде обманул здесь, потому что .bashrc это не настоящий исполняемый файл, это "исходный" файл для включения в bash-скрипт, который является исполняемым файлом. Однако это служит для соответствующей иллюстрации.

Шеллскрипт

У меня есть скрипт bash, который пытается

  • найти, где находится программа,
  • найти соответствующий пакет и
  • подскажите что за программа

Может быть, использовать имяwhat-about, сделайте его исполняемым и поместите в PATH,

      #!/bin/bash

LANG=C
inversvid="\0033[7m"
resetvid="\0033[0m"

if [ $# -ne 1 ]
then
 echo "Usage: ${0##*/} <program-name>"
 echo "Will try to find corresponding package"
 echo "and tell what kind of program it is"
 exit 1
fi
command="$1"

str=;for ((i=1;i<=$(tput cols);i++)) do str="-$str";done
tmp="$command"
first=true
curdir="$(pwd)"
tmq=$(which "$command")
tdr="${tmq%/*}"
tex="${tmq##*/}"
if test -d "$tdr"; then cd "$tdr"; fi
#echo "cwd='$(pwd)' ################# d"

while $first || [ "${tmp:0:1}" == "l" ]
do
 first=false
 tmp=${tmp##*\ }
 tmq="$tmp"
 tmp=$(ls -l "$(which "$tmp")" 2>/dev/null)
 tdr="${tmq%/*}"
 tex="${tmq##*/}"
 if test -d "$tdr"; then cd "$tdr"; fi
# echo "cwd='$(pwd)' ################# d"
 if [ "$tmp" == "" ]
 then
  tmp=$(ls -l "$tex" 2>/dev/null)
  tmp=${tmp##*\ }
  if [ "$tmp" == "" ]
  then
   echo "$command is not in PATH"
#   package=$(bash -ic "$command -v 2>&1")
#   echo "package=$package XXXXX 0"
   bash -ic "alias '$command' > /dev/null 2>&1" > /dev/null 2>&1
   if [ $? -ne 0 ]
   then
    echo 'looking for package ...'
    package=$(bash -ic "$command -v 2>&1"| sed -e '0,/with:/d'| grep -v '^$')
   else
    echo 'alias, hence not looking for package'
   fi
#   echo "package=$package XXXXX 1"
   if [ "$package" != "" ]
   then
    echo "$str"
    echo "package: [to get command '$1']"
    echo -e "${inversvid}${package}${resetvid}"
   fi
   else
    echo "$tmp"
   fi
 else
  echo "$tmp"
 fi
done
tmp=${tmp##*\ }
if [ "$tmp" != "" ]
then
 echo "$str"
 program="$tex"
 program="$(pwd)/$tex"
 file "$program"
 if [ "$program" == "/usr/bin/snap" ]
 then
  echo "$str"
  echo "/usr/bin/snap run $command     # run $command "
  sprog=$(find /snap/"$command" -type f -iname "$command" \
   -exec file {} \; 2>/dev/null | sort | tail -n1)
  echo -e "${inversvid}file: $sprog$resetvid"
  echo "/usr/bin/snap list $command    # list $command"
  slist="$(/usr/bin/snap list "$command")"
  echo -e "${inversvid}$slist$resetvid"
 else
  package=$(dpkg -S "$program")
  if [ "$package" == "" ]
  then
   package=$(dpkg -S "$tex" | grep -e " /bin/$tex$" -e " /sbin/$tex$")
   if [ "$package" != "" ]
   then
    ls -l /bin /sbin
   fi
  fi
  if [ "$package" != "" ]
  then
   echo "$str"
   echo " package: /path/program  [for command '$1']"
   echo -e "${inversvid} $package ${resetvid}"
  fi
 fi
fi
echo "$str"
#alias=$(grep "alias $command=" "$HOME/.bashrc")
alias=$(bash -ic "alias '$command' 2>/dev/null"| grep "$command")
if [ "$alias" != "" ]
then
 echo "$alias"
fi
type=$(type "$command" 2>/dev/null)
if [ "$type" != "" ]
then
 echo "type: $type"
elif [ "$alias" == "" ]
then
 echo "type: $command: not found"
fi
cd "$curdir"

Демонстрационные примеры

Иногда есть две альтернативы, например, для , как отдельная скомпилированная программа, так и встроенная команда оболочки. Встроенная оболочка получит приоритет и будет использоваться, если вы не укажете полный путь отдельной программы,

в 18.04.6 ЛТС

      $ what-about echo
-rwxr-xr-x 1 root root 35000 jan 18  2018 /bin/echo
----------------------------------------------------------------------------------
/bin/echo: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0,
BuildID[sha1]=057373f1356c861e0ec5b52c72804c86c6842cd5, stripped
----------------------------------------------------------------------------------
 package: /path/program  [for command 'echo']
 coreutils: /bin/echo 
----------------------------------------------------------------------------------
type: echo is a shell builtin

echoв 22.04 LTS

      $ what-about echo
-rwxr-xr-x 1 root root 35120 Feb  7 17:03 /usr/bin/echo
----------------------------------------------------------------------------------
/usr/bin/echo: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=b56baf290970e98b8056b1a8114a4404b8186689, for GNU/Linux 3.2.0, stripped
dpkg-query: no path found matching pattern /usr/bin/echo
lrwxrwxrwx 1 root root 7 Apr 27 10:02 /bin -> usr/bin
lrwxrwxrwx 1 root root 8 Apr 27 10:02 /sbin -> usr/sbin
----------------------------------------------------------------------------------
 package: /path/program  [for command 'echo']
 coreutils: /bin/echo 
----------------------------------------------------------------------------------
type: echo is a shell builtin

в 18.04.6 ЛТС

Иногда команда связана с программой, которая может быть скрыта, например, версияrenameчто я использую,

      $ what-about rename
lrwxrwxrwx 1 root root 24 maj 12  2018 /usr/bin/rename -> /etc/alternatives/rename
lrwxrwxrwx 1 root root 20 maj 12  2018 /etc/alternatives/rename -> /usr/bin/file-rename
-rwxr-xr-x 1 root root 3085 feb 20  2018 /usr/bin/file-rename
----------------------------------------------------------------------------------
/usr/bin/file-rename: Perl script text executable
----------------------------------------------------------------------------------
 package: /path/program  [for command 'rename']
 rename: /usr/bin/file-rename 
----------------------------------------------------------------------------------
type: rename is /usr/bin/rename

в 18.04.6 ЛТС

У меня есть псевдоним дляrmво избежание ошибок, а псевдоним имеет приоритет над программой вPATH. Вы можете префикс с обратной косой чертой,\rmчтобы пропустить псевдоним и запустить программу напрямую. (Пожалуйста, помните, что псевдоним применяется только для конкретного пользователя, а не дляsudoи другие пользователи, если они не определили аналогичный псевдоним.)

      $ what-about rm
-rwxr-xr-x 1 root root 63704 jan 18  2018 /bin/rm
---------------------------------------------------------------------------
/bin/rm: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for
GNU/Linux 3.2.0, uildID[sha1]=864c9bbef111ce358b3452cf7ea457d292ba93f0,
stripped
---------------------------------------------------------------------------
 package: /path/program  [for command 'rm']
 coreutils: /bin/rm 
---------------------------------------------------------------------------
alias rm='rm -i'
type: rm is /bin/rm

в 18.04.6 ЛТС

      $ what-about firefox
lrwxrwxrwx 1 root root 25 jun  8 23:23 /usr/bin/firefox -> ../lib/firefox/firefox.sh
-rwxr-xr-x 1 root root 2667 jun  8 23:23 ../lib/firefox/firefox.sh
----------------------------------------------------------------------------------
/usr/lib/firefox/firefox.sh: POSIX shell script, ASCII text executable
----------------------------------------------------------------------------------
 package: /path/program  [for command 'firefox']
 firefox: /usr/lib/firefox/firefox.sh 
----------------------------------------------------------------------------------
type: firefox is /usr/bin/firefox

firefoxв 22.04 LTS

      $ what-about firefox
lrwxrwxrwx 1 root root 13 Jun 14 10:17 /snap/bin/firefox -> /usr/bin/snap
-rwxr-xr-x 1 root root 15815640 Apr 21 10:50 /usr/bin/snap
----------------------------------------------------------------------------------
/usr/bin/snap: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2, Go
BuildID=_CKxPPsUzOWnuqfKlk4n/eiKeSmbgVb16CaXm3O1l/-ofceI8uzhaCgwaTtgJt/YygjnGD2ASByLbaEMRR4,
stripped
----------------------------------------------------------------------------------
/usr/bin/snap run firefox     # run firefox 
/usr/bin/snap list firefox    # list firefox
Name     Version    Rev   Tracking         Publisher  Notes
firefox  101.0.1-1  1443  latest/stable/…  mozilla**  -
----------------------------------------------------------------------------------
type: firefox is /snap/bin/firefox
Другие вопросы по тегам