Как запустить программу с другим рабочим каталогом из текущего, из оболочки Linux?
Использование оболочки Linux, как мне запустить программу с другим рабочим каталогом из текущего рабочего каталога?
Например, у меня есть двоичный файл helloworld
, который создает файл hello-world.txt
в текущем каталоге. Этот файл находится внутри каталога /a
. В настоящее время я в каталоге /b
. Я хочу запустить свою программу под управлением ../a/helloworld
и получить hello-world.txt
где-то в третьем каталоге /c
.
Ответы
Ответ 1
Вызвать программу следующим образом:
(cd /c; /a/helloworld)
Скобки приводят к появлению суб-оболочки. Затем эта под-оболочка меняет рабочий каталог на /c
, затем выполняет helloworld
из /a
. После выхода программы суб-оболочка завершается, возвращая вас в приглашение родительской оболочки в каталоге, в котором вы начали.
Обработка ошибок:. Чтобы избежать запуска программы без изменения каталога, например. при ошибке с ошибкой /c
выполните выполнение helloworld
условное:
(cd /c && /a/helloworld)
Сокращение использования памяти: Чтобы избежать использования памяти отходов в режиме "подоболочки", пока выполняется мир приветствия, вызовите helloworld
через exec:
(cd /c && exec /a/helloworld)
[Спасибо Джош и Джулиано за советы по улучшению этого ответа!]
Ответ 2
Как и Давид Шмитт, а также предложение Джоша, но не покидает процесс оболочки:
(cd /c && exec /a/helloworld)
Этот способ больше похож на то, как вы обычно запускаете команды в оболочке. Чтобы увидеть практическую разницу, вам нужно запустить ps ef
из другой оболочки с каждым решением.
Ответ 3
sh -c 'cd /c && ../a/helloworld'
Ответ 4
Я всегда думаю, что инструменты UNIX должны быть написаны как фильтры, читать входные данные от stdin и записывать вывод в stdout. Если возможно, вы можете изменить свой двоичный файл helloworld, чтобы записать содержимое текстового файла в stdout, а не в определенный файл. Таким образом, вы можете использовать оболочку для записи файла в любом месте.
$ cd ~/b
$ ~/a/helloworld > ~/c/helloworld.txt
Ответ 5
Опция, которая не требует подоболочки и встроена в bash
(pushd SOME_PATH && run_stuff; popd)
Демо:
$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
Ответ 6
Просто измените последний "& &". в ";" и он будет обратно cd независимо от того, будет ли команда неудачной или успешной:
cd SOME_PATH && run_some_command ; cd -
Ответ 7
Один из способов сделать это - создать оболочку оболочки script.
Оболочка script изменит текущий каталог на /c, а затем запустит /a/helloworld. После выхода оболочки script текущий каталог возвращается к /b.
Вот пример bash shell script:
#!/bin/bash
cd /c
/a/helloworld
Ответ 8
Если вы всегда хотите, чтобы он перешел в /C, используйте абсолютный путь, когда вы пишете файл.
Ответ 9
Если вы хотите выполнить это внутри своей программы, я бы сделал что-то вроде:
#include <unistd.h>
int main()
{
if(chdir("/c") < 0 )
{
printf("Failed\n");
return -1 ;
}
// rest of your program...
}
Ответ 10
почему бы не сохранить его простым
cd SOME_PATH && run_some_command && cd -
последняя команда "cd" вернет вас в последнюю директорию pwd. Это должно работать на всех системах * nix.
Ответ 11
из текущего каталога укажите полный путь к каталогу script, чтобы выполнить команду
/root/server/user/home/bin/script.sh