У меня есть приложение, которое при запуске открывает файл относительно исполняемого файла (этот путь к файлу статически скомпилирован в двоичный файл программы, и я не могу его изменить). Я хочу создать для него псевдоним, который можно будет запустить из любой точки системы без предварительного перехода в его папку, чтобы убедиться, что файл будет найден.
Возможно ли это вообще?
решение1
Если программа требует, чтобы вы перешли cd
в каталог, и программа не может быть изменена, вы не можете запустить эту программу без cd
-ing в этот каталог. Это так просто.
Однако вы можете запустить вторую оболочку, которая cd
-s в каталог и выполняет программу. Когда программа завершается, вторая оболочка завершается и, поскольку ваша основная оболочка не завершилась cd
, вы все еще находитесь в том же месте.
Вот краткий пример:
$ alias ptmpdir="bash <<< 'cd /tmp ; pwd'"
$ ptmpdir
/tmp
Это, как указал Камил Мациоровски в комментариях, помещает команду в STDIN оболочки. Это работает нормально, если программа не использует STDIN, как pwd
в примере, и не проверяет наличие ошибок.
alias lstmpdir="bash -c 'cd /tmp && ls' ls"
проверяет наличие ошибок и выдает правильный код выхода в случае cd
сбоя:
$ 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
Если вы хотите передать аргументы команде, псевдоним становится запутанным и еще более сложным для понимания. В этом случае функция была бы лучше:
$ 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>