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