it-roy-ru.com

Как запустить программу с рабочим каталогом, отличным от текущего, из оболочки Linux?

Как использовать оболочку Linux, как запустить программу с рабочим каталогом, отличным от текущего рабочего каталога?

Например, у меня есть двоичный файл helloworld, который создает файл hello-world.txt в текущем каталоге. Этот файл находится внутри каталога /a. В настоящее время я нахожусь в каталоге /b. Я хочу запустить мою программу с запущенным ../a/helloworld и получить hello-world.txt где-нибудь в третьем каталоге /c.

287
Anton Daneyko

Назовите программу так:

(cd /c; /a/helloworld)

Скобки приводят к появлению суб-оболочки. Этот суб-Shell затем меняет свой рабочий каталог на /c, затем выполняет helloworld из /a. После выхода из программы дочерняя оболочка завершает работу, возвращая вас к приглашению родительской оболочки в каталоге, из которого вы начали.

Обработка ошибок: Чтобы избежать запуска программы без изменения каталога, например, если ошибка написана /c, сделайте выполнение helloworld условным:

(cd /c && /a/helloworld)

Сокращение использования памяти: Чтобы избежать потери памяти в оболочке во время выполнения hello world, вызовите helloworld через exec:

(cd /c && exec /a/helloworld)

[Спасибо Джошу и Джулиано за советы по улучшению этого ответа!]

475
David Schmitt

Подобно ответу Дэвида Шмитта , плюс предложение Джоша, но не оставляет работающий процесс Shell:

(cd /c && exec /a/helloworld)

Этот способ больше похож на то, как вы обычно запускаете команды в командной консоли. Чтобы увидеть практическое отличие, вы должны запускать ps ef из другой оболочки с каждым решением.

83
Juliano
sh -c 'cd /c && ../a/helloworld'
17
mihi

Опция, которая не требует подоболочки и встроена в bash

(pushd SOME_PATH && run_stuff; popd)

Демо-версия:

$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
13
Loren

Я всегда думаю, что инструменты UNIX должны быть написаны как фильтры, читать ввод из stdin и записывать вывод в stdout. Если возможно, вы можете изменить двоичный файл helloworld, чтобы записать содержимое текстового файла в стандартный вывод, а не в конкретный файл. Таким образом, вы можете использовать Shell для записи вашего файла в любом месте.

$ cd ~/b

$ ~/a/helloworld> ~/c/helloworld.txt

11
Luther Blisset

Просто измените последний "&&" на ";" и он вернется обратно, независимо от того, будет ли команда выполнена неудачно или успешно:

cd SOME_PATH && run_some_command ; cd -
5
johnnybravo

Один из способов сделать это - создать скрипт оболочки.

Сценарий оболочки изменил бы текущий каталог на/c, затем запустил/a/helloworld. После выхода из сценария оболочки текущий каталог возвращается к/b.

Вот пример сценария bash Shell:

#!/bin/bash
cd /c
/a/helloworld
3
Jin Kim

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

1
Tom Ritter

почему бы не сделать это простым

cd SOME_PATH && run_some_command && cd -

последняя команда 'cd' вернет вас в последний каталог pwd. Это должно работать на всех * nix системах.

1
Sahil

Если вы хотите выполнить это внутри вашей программы, то я бы сделал что-то вроде:

#include <unistd.h>
int main()
{
  if(chdir("/c") < 0 )  
  {
     printf("Failed\n");
     return -1 ;
  }

  // rest of your program...

}
0
Harold

из текущей директории укажите полный путь к директории скрипта для выполнения команды

/root/server/user/home/bin/script.sh
0
Ravi Bhushan