Ich habe eine Anwendung, die beim Start eine Datei relativ zur ausführbaren Datei öffnet (dieser Dateipfad wird statisch in die Programm-Binärdatei kompiliert und ich kann ihn nicht ändern). Ich möchte einen Alias dafür erstellen, der von überall im System ausgeführt werden kann, ohne zuerst per „cd“ in den Ordner zu wechseln, um sicherzustellen, dass die Datei gefunden wird.
Ist das überhaupt möglich ?
Antwort1
Wenn das Programm erfordert, dass Sie cd
in das Verzeichnis gehen, und das Programm nicht geändert werden kann, können Sie das Programm nicht ausführen, ohne cd
mit -ing auf das Verzeichnis zuzugreifen. So einfach ist das.
Sie können jedoch eine zweite Shell starten, die mit -s auf das Verzeichnis verweist und das Programm ausführt. Wenn das Programm beendet ist, wird die zweite Shell beendet und Sie befinden sich immer noch an derselben Stelle, cd
da Ihre Hauptshell dies nicht getan hat .cd
Ein kurzes Beispiel:
$ alias ptmpdir="bash <<< 'cd /tmp ; pwd'"
$ ptmpdir
/tmp
Dies, wie Kamil Maciorowski in den Kommentaren anmerkt, platziert den Befehl in STDIN der Shell. Dies funktioniert einwandfrei, wenn das Programm STDIN nicht verwendet, wie pwd
im Beispiel, und es nicht auf Fehler prüft.
alias lstmpdir="bash -c 'cd /tmp && ls' ls"
prüft auf Fehler und gibt den richtigen Exit-Code aus, wenn dies cd
fehlschlägt:
$ alias ptmpdir="bash -c 'cd /hop && ls' ls"
$ if ptmpdir ; then
> echo yes
> else
> echo no
> fi
ls: line 0: cd: /hop: No such file or directory
no
Wenn Sie dem Befehl auch Argumente übergeben möchten, wird der Alias unübersichtlich und noch schwerer zu verstehen. In diesem Fall wäre eine Funktion besser:
$ hop(){ bash -c 'cd /tmp && exec ls "$@"' ls "$@" ; }
$ hop
7iCipjf8J7 eh._2700550 in.clean.1285563 tmp-ntt.xpi
MozillaMailnews <rest deleted>
$ hop -lrt
total 56496
drwxrwxr-x 3 ljm ljm 4096 Nov 5 17:28 gimp
drwxrwxr-x 2 ljm ljm 4096 Nov 5 18:14 jna-107183
-rw------- 1 ljm ljm 0 Nov 6 00:17 config-err-Ol5gyl
drwx------ 2 ljm ljm 4096 Nov 6 00:17 ssh-FqqWxHh4jhu8
<rest deleted>