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