Więc umieram, żeby to zapytać, ale nie chciałem ryzykować utraty reputacji, jednak w tym momencie naprawdę potrzebuję wkładu bezpośredniego. Jestem Newb Linuksa, używając Raspberry Pi, aby skonfigurować serwer lampy i lubię tworzyć pliki powłoki wszystkich moich poleceń montażowych, ale lubię również utrzymywanie rzeczy modułowych, na przykład:

#!/bin/sh
#LAMPinstall.sh
./apacheinstall.sh
./mysqlinstall.sh
./phpinstall.sh

Jestem przyzwyczajony do kodowania środowisk, w których takie wywołania są trywialne, ale oczywisty problem z tym skryptem polega na tym, że wymaga on, aby bieżący katalog roboczy był katalogiem skryptu w momencie wywołania.

Zrobiłem dużo czytania specyficznego dla Linuksa na ścieżkach VS Absolute vs względne, zaopatrzenie VS Calling, Bash vs Shell i różne metody, aby cytować ścieżkę skryptu jako rozwiązanie do względnej ścieżki wywołuje poza CWD, ale na końcu Dzień nie doszedłem bliżej rozwiązania, o którym czuję się dobrze, a może nigdy nie będzie. Na razie jestem zadowolony z zastosowaniem bezwzględnych ścieżek przechowywanych w zmiennej, takich jak:

#!/bin/sh
#LAMPinstall.sh
thisdir=/path/to/scripts
${thisdir}/apacheinstall.sh
${thisdir}/mysqlinstall.sh
${thisdir}/phpinstall.sh

Chociaż musiałbym modyfikować skrypt za każdym razem, gdy zmienia się ścieżka.

Tak więc moje pytanie jest bardziej najlepsze pytanie praktyczne niż prośba o rozwiązanie do konkretnego problemu (choć jest to konkretny problem), aby pokryć następujące całkowicie zamiast artykułów i pytań, które czytałem o każdym indywidualny kawałek:

  1. Czy to zły pomysł, aby organizować wywołania skryptów powłoki w sposób, którego używam?
  2. Czy to zły pomysł na cytowanie ścieżki skryptu przy użyciu czegoś takiego jak $(dirname "$0"). Jeśli tak, jak w przeciwnym razie utrzymasz organizację wielu plików powłoki?
  3. Podczas rozważań, takich jak # 2, ważne jest, aby wziąć pod uwagę wszystkie możliwe zastosowania twojego skryptu (np .: jeśli istnieją podkatalogi i jest on pozyskiwany) przez kogoś innego, czy wystarczy powiedzieć "Ten skrypt musi być tylko wywołany, a nie pochodzący , jeśli ktoś go nadużywa, to na nim. ” Przepraszam, że nie mogłem tego lepiej wyrazić.

Ponadto, proszę, wybacz mi, jeśli jest to naiwne pytanie, naprawdę tak naprawdę lubiłbym na to.

3
spiff 8 styczeń 2020, 12:54

1 odpowiedź

Najlepsza odpowiedź

Powłoka nie oferuje zbyt wyrafinowanych urządzeń do utrzymania biblioteki powiązanych skryptów. Wspólne hacki obejmują sugerowane lub przynajmniej dorozumiane

#!/bin/sh
here="$(dirname "$0")"
"$here"/apacheinstall.sh
"$here"/mysqlinstall.sh
"$here"/phpinstall.sh

Lub trochę podobnie

#!/bin/sh
PATH="$(dirname "$0")":$PATH
apacheinstall.sh
mysqlinstall.sh
phpinstall.sh

Lub wymagające użytkownika, aby ustawić odpowiednią zmienną:

#!/bin/sh
: ${LAMP_INSTALL_PATH?Need this variable to be set}
"$LAMP_INSTALL_PATH"/apacheinstall.sh
"$LAMP_INSTALL_PATH"/mysqlinstall.sh
"$LAMP_INSTALL_PATH"/phpinstall.sh

Podobna, powiązana technika polega na domyślnym ustawieniu czegoś takiego jak /usr/local/lib/lampinstall i umożliwieniu użytkownikowi zastąpienia tej ścieżki w podobny sposób.

#!/bin/sh
: ${LAMP_INSTALL_PATH=/usr/local/lib/lampinstall}
"$LAMP_INSTALL_PATH"/apacheinstall.sh
"$LAMP_INSTALL_PATH"/mysqlinstall.sh
"$LAMP_INSTALL_PATH"/phpinstall.sh

Oczywiście, z dowolną dość nowoczesną dystrybucją, prawdziwym rozwiązaniem tego konkretnego problemu jest pakowanie rzeczy potrzebnych w pakiet i po prostu zainstalować to. Na przykład na platformach Debianish

sudo apt install -y local-lamp-stuff

Gdzie po prostu musisz utworzyć local-lamp-stuff.deb i mieć to Depends: na pakietach, których potrzebujesz jako wymaganie wstępne.

2
tripleee 8 styczeń 2020, 10:15