launchSystemFile
Windows와 같은 ShellExecuteEx
명령줄이나 C++에서 실행되는 함수를 작성하려고 합니다 .
내가 하면 ShellExecuteEx
기본 blah.txt
편집기에서 열립니다. 내가 실행 파일 ShellExecuteEx
을 firefox.exe
시작합니다.
나는 C++로 해왔고 popen "xdg-open blah"
실행 파일을 제외하고는 잘 작동합니다.
xdg-open
실행을 실행 가능하게 만드는 방법이 있습니까 ? 예를 들어 Firefox의 경로는 /usr/lib/firefox/firefox
?
시도했지만 xdg-open "/usr/lib/firefox/firefox"
다음 오류 메시지와 함께 실패했습니다.
gvfs-open: /usr/lib/firefox/firefox: 열기 위치 오류: 이 파일을 처리하기 위해 등록된 응용 프로그램이 없습니다.
답변1
xdg-open
데스크탑 환경을 감지하고 해당 프로그램(gnome의 경우 gvfs-open, XFCE의 경우 exo-open, mate-open 등)을 호출하는 데 사용되는 쉘 스크립트일 뿐입니다.
따라서 실행 파일 실행에 대한 제한 사항은 각 DE의 해당 실행 프로그램(귀하의 경우 gvfs-open)에서 파생됩니다.
보고 있다gvfs - 매뉴얼 페이지 열기, 이 애플리케이션(다른 DE 애플리케이션과 마찬가지로)은 gvfs-mime
설정에 정의된 대로 파일 유형별로 등록된 기본 애플리케이션만 호출합니다.
귀하의 경우 gvfs-open은 시작할 해당 응용 프로그램을 찾으려고 시도하고 실패합니다 firefox file
.
https://www.google.com
.
xdg-open 쉘 스크립트 기능을 살펴보면 Exec
해당 파일에서 항목을 추출하는 기능이 있고 .desktop
일부 데스크탑 환경에서는 .desktop 파일의 Exec 섹션에 있는 명령이 단순히 xdg-open에 의해 실행됩니다.
즉, Firefox처럼 실행 파일을 호출 xdg-open
하거나 실행할 필요가 없습니다.gvfs-open
"firefox"를 시작하면 실행됩니다(예 popen "/usr/bin/firefox"
:)
추신: 아니면 전화를 해야 할 수도 있습니다.(exec firefox &)
다음과 같이 grep 루프를 사용하여 모든 .desktop 파일에 대한 Exec 항목을 추출할 수도 있습니다.
for file in $(find /usr/share/applications/ -type f -name '*.desktop'); do
executable=$(grep -m1 "^Exec=" "$file") #some files have more than one Exec entry
echo "$file - $executable"
done