시스템에서 실행 파일의 위치/등록을 구문 분석하시겠습니까?

시스템에서 실행 파일의 위치/등록을 구문 분석하시겠습니까?

저는 Ubuntu 11.04, Gnome 2를 사용하고 있습니다. 어느 시점에 Adobe Reader( )를 설치했지만 acroread"트리 외부"(비표준 위치) - 방금 이 실행 파일에서 이상한 점을 발견했습니다.

1. which보고:

$ which acroread
/media/mydisk/AdobeReader/Adobe/Reader9/bin/acroread

좋습니다. 시스템 루트와 다른 파티션에 있습니다 /. 이 경우에는 에서와 같이 acroread이에 대한 심볼릭 링크가 있어야 합니다 . 그럼 한번 시도해 봅시다 :$PATH/usr/binlocate

$ locate acroread
~/.icons/All-blacks/scalable/apps/acroread.png
/usr/lib/pymodules/python2.7/orca/scripts/apps/acroread
/usr/lib/pymodules/python2.7/orca/scripts/apps/acroread/__init__.py
/usr/lib/pymodules/python2.7/orca/scripts/apps/acroread/__init__.pyc
/usr/lib/pymodules/python2.7/orca/scripts/apps/acroread/script.py
/usr/lib/pymodules/python2.7/orca/scripts/apps/acroread/script.pyc
/usr/share/app-install/desktop/acroread.desktop
/usr/share/app-install/icons/acroread.png
/usr/share/pyshared/orca/scripts/apps/acroread
/usr/share/pyshared/orca/scripts/apps/acroread/__init__.py
/usr/share/pyshared/orca/scripts/apps/acroread/script.py
/usr/share/scribus-trunk/icons/acroread16.png
/usr/share/scribus-trunk/icons/acroread22.png
/usr/share/scribus-trunk/icons/acroread32.png

이상하다 - 그것 외에는 관련성이 없는 것 같다 acroread.desktop. Gnome에서는 .desktop해당 시스템 디렉토리에 파일을 배치하여 애플리케이션을 "등록" 할 수 있다는 것을 기억합니다 acroread.desktop.

$ cat /usr/share/app-install/desktop/acroread.desktop
[Desktop Entry]
X-AppInstall-Package=acroread
X-AppInstall-Proprietary=true
X-AppInstall-Channel=natty-partner
X-AppInstall-LicenseUri=/usr/share/app-install/channels/natty-partner.eula
X-AppInstall-Architectures=i386,amd64
Encoding=UTF-8
Name=Adobe Reader 9
Icon=acroread.png
Terminal=false
Type=Application
Categories=Application;Office;Viewer;
StartupNotify=true

/media/mydisk... 거기 위치에 대한 정보 는 없나요 ? ! 실제로 이 .desktop파일은 클릭하면 설치 프로그램이 실행되도록 미리 준비된 아이콘처럼 보입니다. !

그렇다면 which이 실행 파일이 시스템 파티션이 아닌 다른 파티션에 있는 이유는 무엇입니까? 어쩌면 내 것일까요 .bashrc? :

$ grep 'acro\|Adobe' ~/.bashrc
$ 

아니요, 거기에는 아무것도 없습니다.

acroread그렇다면 터미널에 입력 하면 실행되어야 한다는 것을 시스템이 어떻게 알 수 있습니까 /media/mydisk/.../acroread? 하지만 시스템 경로에 심볼릭 링크가 없고 에 언급된 내용이 없으며 루트 파일 시스템에 관련 Gnome 파일 ~/.bashrc도 없습니다..desktop

편집: 내가 사용하고 있는 쉘은 bash이며 type다음을 보고합니다.

$ type acroread 
acroread is hashed (/media/mydisk/AdobeReader/Adobe/Reader9/bin/acroread)

나는 또한 이것을 시도했습니다 :

$ while read line; do if [ -f "${line}" ]; then grep -rH 'acroread' "${line}"; fi; done < <(locate applications)
/usr/share/application-registry/gnome-vfs.applications:acroread
/usr/share/application-registry/gnome-vfs.applications: command=acroread

그러나 gnome-vfs.applications위치에 대한 많은 정보가 포함되어 있지 않습니다.

$ grep -A7 acroread /usr/share/application-registry/gnome-vfs.applications 
acroread
    command=acroread
    name=Adobe Acrobat Reader
    can_open_multiple_files=true
    expects_uris=false
    requires_terminal=false
    mime_types=application/pdf

applix

편집 2: @MichaelHomer가 지적했듯이 쉘이 이 실행 파일을 호출할 수 있는 이유는 디렉토리가 다음 위치에 있기 때문입니다 $PATH.

$ for path in ${PATH//:/ }; do echo "$path" | grep 'Adobe\|acro'; done
/media/mydisk/AdobeReader/Adobe/Reader9/bin

그러나 이제 이상한 점은 이 디렉토리가 어떻게 나타나게 되었는가입니다 $PATH. 앞서 언급했듯이, 확실히 내 항목에 추가하거나 .bashrc다음 항목에 추가하는 것은 아닙니다 bashrc.

$ while read fnline; do if [ -f "${fnline}" ]; then echo "...(${fnline})..."; grep -rH 'acro\|Adobe' "${fnline}"; fi; done < <(locate bashrc)
...(/etc/bash.bashrc)...
...(/etc/skel/.bashrc)...
...(~/.bashrc)...
...(~/.bashrc-orig)...
...(~/.bashrc_mine)...
...(/home/aaa/.bashrc)...
...(/home/bbb/.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)...

...이제 질문은 이 디렉토리가 경로에서 어떻게 끝나는가 하는 것입니다.

답변1

글쎄요, 전체 파일 시스템을 탐색하지 않고도 이 질문에 대한 답을 찾을 수 있었으면 좋겠지만 분명히 그것은 불가능합니다. 특히 그것이 PATH제가 하는 일이기 때문에 더욱 그렇습니다.:)

따라서 먼저 파일 시스템 경계를 넘지 않도록 전체 루트 파일 시스템을 grep하고( -xdev) -ao실행 파일의 전체 경로 acroread또는Adobe

find / -xdev -type f -print0 2>/dev/null \
  | xargs -0 grep -Hao 'acroread\|Adobe....' 2>/dev/null \
  | tee /media/mydisk/found.txt

결과를 찾은 후 시각적으로 검사한 결과 found.txt결과 파일을 가져오는 이 명령이 결국 답을 제공한다는 것을 알았습니다.

while read tline; do \
  IFS=":"; declare -a arrIN=($tline); \
  grep -H Adobe/ "${arrIN[0]}" \
  | grep '\$PATH'; \
done < \
  <(grep Adobe/ /media/mydisk/found.txt | sort | uniq)

...정답은:

~/.profile:PATH="/media/mydisk/AdobeReader/Adobe/Reader9/bin:$PATH"

~/.profile따라서 추가 항목도 등록/실행되는 파일이 분명히 있습니다 . 분명히 Adobe Reader 디렉토리를 환경 변수 PATH에 추가했습니다 .PATH

자, 미스터리는 해결되었습니다. 의견을 보내주신 모든 분들께 감사드립니다!

관련 정보