Как запустить программу с другим рабочим каталогом из текущей оболочки 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 из другой оболочки с каждого решения.


sh -c 'cd /c && ../a/helloworld'

опция, которая не требует подсхемы и встроена в 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

Если вы всегда хотите, чтобы он шел в /C, используйте абсолютный путь при записи файла.


почему бы не сохранить его простым

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