У меня есть три каталога:
/home/Desktop/1
/home/Desktop/2
/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
Есть идеи?
2 ответа
У вас есть несколько вариантов, в том числе как минимум:
Установите 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
Используйте абсолютные пути к командам:
#!/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
Используйте относительные пути к командам:
#!/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.
Если вы просто пытаетесь найти сценарии:
#!/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
Эти сценарии будут работать правильно, даже если он запущен из каталога, отличного от каталога, в котором он находится. Они даже будут работать, если они запускаются по символической ссылке!
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.