У меня есть три каталога:

  1. /home/Desktop/1
  2. /home/Desktop/2
  3. /home/Desktop/3

В каталогах 1 и 2 находятся исполняемые программы на Си, которые могут выполняться в терминале, например ./tst1 или ./tst2.

В каталоге 3 у меня есть bash-скрипт, который выполняет программу на C tst3.c из того же каталога.

Я хочу выполнить эти программы на C из каталогов 1 и 2, используя мой скрипт bash в каталоге 3, как это

#!/bin/bash

sudo ./tst3
sleep 1
sudo ./tst1 # from directory 1
sleep 2    
sudo ./tst2 # from directory 2

Есть идеи?

-1
Mark Delphi 24 Апр 2017 в 21:52

2 ответа

Лучший ответ

У вас есть несколько вариантов, в том числе как минимум:

  1. Установите PATH, чтобы включить каталоги, где находятся ваши команды:

    #!/bin/bash
    export PATH="$PATH:/home/Desktop/1:/home/Desktop/2:/home/Desktop/3"
    sudo tst3 # from directory 3
    sleep 1
    sudo tst1 # from directory 1
    sleep 2    
    sudo tst2 # from directory 2
    
  2. Используйте абсолютные пути к командам:

    #!/bin/bash
    sudo /home/Desktop/3/tst3 # from directory 3
    sleep 1
    sudo /home/Desktop/1/tst1 # from directory 1
    sleep 2    
    sudo /home/Desktop/2/tst2 # from directory 2
    
  3. Используйте относительные пути к командам:

    #!/bin/bash
    sudo ../3/tst3 # from directory 3
    sleep 1
    sudo ../1/tst1 # from directory 1
    sleep 2    
    sudo ../2/tst2 # from directory 2
    

Они относятся к каталогам симметрично. Другой альтернативой является размещение команд в каталоге, который уже находится в вашей переменной PATH (например, $HOME/bin), а затем запускать их без указания пути. Это то, что я обычно делаю - убедитесь, что команды для запуска находятся в каталоге в моем PATH.

2
Jonathan Leffler 24 Апр 2017 в 19:08

Если вы просто пытаетесь найти сценарии:

#!/bin/bash
base_dir="$( dirname "$( readlink -e "$0" )" )"/..

sudo "$base_dir/3/tst3"
sleep 1
sudo "$base_dir/1/tst1"
sleep 2    
sudo "$base_dir/2/tst2"

Или

#!/bin/bash
cd "$( dirname "$( readlink -e "$0" )" )"/..

sudo 3/tst3
sleep 1
sudo 1/tst1
sleep 2    
sudo 2/tst2

Если вы хотите, чтобы CWD изменял каталог каждого исполняемого файла перед его выполнением:

#!/bin/bash
cd "$( dirname "$( readlink -e "$0" )" )"
sudo ./tst3

cd ../1
sleep 1
sudo ./tst1

cd ../2
sleep 2    
sudo ./tst2

Эти сценарии будут работать правильно, даже если он запущен из каталога, отличного от каталога, в котором он находится. Они даже будут работать, если они запускаются по символической ссылке!

2
ikegami 24 Апр 2017 в 20:09