Skrypt powłoki Bash – komendy Linux dla Ubuntu, Mint i Debian

Niektóre parametry linii poleceń narzędzi

Page content

Nie jest to bardzo kompleksowa lista, tylko kilka użytecznych dla mnie elementów

bash and shell anniversary!

Więcej narzędzi dla programistów i przepływów pracy znajdziesz w Narzędzia dla programistów: Kompletny przewodnik po nowoczesnych przepływach pracy.

Jeśli potrzebujesz interaktywnego wzorca podpowiedzi w skryptach, zobacz Zatrzymywanie skryptów z komunikatem ‘Naciśnij dowolny klawisz’ w Bash, CMD, PowerShell i macOS.

Jak sprawdzić wersję Linux Ubuntu

Więcej szczegółów na temat sprawdzania wersji Ubuntu znajdziesz w Sprawdź wersję Linux Ubuntu.

Metoda 1

lsb_release -a

wygeneruje coś w stylu:

No LSB modules are available.
Distributor ID:	Linuxmint
Description:	Linux Mint 22.1
Release:	22.1
Codename:	xia

Metoda 2

cat /etc/os-release

wygeneruje coś w stylu:

NAME="Linux Mint"
VERSION="22.1 (Xia)"
ID=linuxmint
ID_LIKE="ubuntu debian"
PRETTY_NAME="Linux Mint 22.1"
VERSION_ID="22.1"
HOME_URL="https://www.linuxmint.com/"
SUPPORT_URL="https://forums.linuxmint.com/"
BUG_REPORT_URL="http://linuxmint-troubleshooting-guide.readthedocs.io/en/latest/"
PRIVACY_POLICY_URL="https://www.linuxmint.com/"
VERSION_CODENAME=xia
UBUNTU_CODENAME=noble

Archiwizacja i rozpakowywanie w Bash z użyciem Tar

Kompresowanie

tar -zcvf archive-name.tgz directory-name

Rozpakowywanie

tar -zxvf archive-name.tgz

Dostęp do zdalnego serwera w Bash za pomocą SSH i SCP

Przesyłanie tożsamości użytkownika na zdalny serwer

ssh-copy-id user@10.0.0.225

Dzięki temu kolejne logowanie będzie możliwe bez podawania hasła, np.

ssh user@10.0.0.225

Przesyłanie pliku

scp ~/file.ext user@host-ip:/home/user/file.ext

Pobieranie katalogu z zawartością rekurencyjnie

scp -r user@host-ip:/home/user/dir ~/dir

Zarządzanie katalogami i plikami w Bash

Sprawdzanie istnienia

# utworzenie katalogu, jeśli nie istnieje, wraz ze wszystkimi pośrednimi katalogami
[ -d $repdir ] || mkdir -p $repdir

# lub
if [ -d $fname ]; then
  echo "Plik nie istnieje: $fname"
  return
fi

Tworzenie katalogu dla konkretnego użytkownika

sudo mkdir dir1
sudo chown specific_user dir1
sudo chown :specific_group dir1

Iterowanie po plikach w katalogu

# ten fragment konwertuje wszystkie pliki jpg w danym folderze do formatu fits
for f in some-folder/*.jpg
do
  convert "$f" "${f/.jpg/.fits}"
done

Scalanie wszystkich plików w jeden

cat ./* > merged.txt

Dodawanie poleceń do Crontab

(crontab -l 2>/dev/null | \
  grep -v control-marker-1; \
  echo '*/15 * * * * /bin/bash /home/user/stest/stest.sh /home/user/stest >> /home/user/stest/stest.log 2>&1 #control-marker-1') | \
  crontab -

gdzie:

  • */15 - uruchom co 15 minut
  • control-marker-1 - identyfikator tego polecenia w konfiguracji cron do jego aktualizacji kolejnym razem tym samym skryptem
  • /bin/bash - polecenie do wykonania
  • /home/user/stest/stest.sh - parametr bash - bash uruchomi ten skrypt
  • /home/user/stest - parametr skryptu - dostępny jako $1
  • /home/user/stest/stest.log - plik logu z wyjściem konsoli stest.sh

Sprawdzenie

grep /home/user/stest/stest.sh /var/log/syslog
crontab -e

Obserwowanie plików logów w Bash

Obserwacja pliku logu na żywo

sudo tail -f /var/log/megalog.log

Pobieranie kodu stanu HTTP za pomocą curl w Bash

response=$(curl --write-out '%{http_code}' --silent --output /dev/null servername)
  
# lub

url='http://localhost:8080/'
status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})

[[ $status == 500 ]] || [[ $status == 000 ]] && echo restarting ${url} # logika uruchamiania/powtórnego uruchamiania

Utrzymywanie działania polecenia SSH po wylogowaniu

https://stackoverflow.com/questions/954302/how-to-make-a-program-continue-to-run-after-log-out-from-ssh

Zakładając, że masz program działający w pierwszym planie, naciśnij

  • ctrl-Z, a następnie:

[1]+ Stopped myprogram

  • disown -h %1
  • bg 1

[1]+ myprogram &

  • logout

Generowanie JSON w Bash za pomocą jo

Instalacja jo

sudo apt-get install jo
a="123"
b="456"
jo "model=a" "prompt=b" "stream=false"

wygeneruje:

{"model":"a", "prompt":"b", "stream":false}

Trochę bardziej skomplikowany przykład:

jo -p name=Jane point[]=1 point[]=2 geo[lat]=10 geo[lon]=20
{
   "name": "Jane",
   "point": [
      1,
      2
   ],
   "geo": {
      "lat": 10,
      "lon": 20
   }
}

Formatowanie JSON w Bash za pomocą jq

Użyj

| jq .

Aby sformatować wyżej wygenerowany json:

a="123"
b="456"
jo "model=$a" "prompt=$b" "stream=false" | jq .

Sformatowany json będzie wyglądał tak:

{
  "model": 123,
  "prompt": 456,
  "stream": false
}

Parsowanie JSON i wyciąganie wartości pól w Bash

Najpierw zainstaluj jq

sudo apt-get install jq

Użyj

  | jq -r '.fieldName'

Np. przy parsowaniu wyniku wywołania Ollama:

curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "Dlaczego niebo jest niebieskie?",
  "stream": false
}'  | jq -r '.response'

Liczenie słów w pliku w Bash

Liczenie słów:

wc -w filename.txt

zwróci coś w stylu:

261 filename.txt

Jeśli chcesz tylko liczbę całkowitą, możesz odcinać pierwsze słowo, które jest liczbą

words=`wc -w filename.txt | cut -f1 -d' '`
echo "$words words"

Lub użyj wc tak:

words=`wc -w < filename.txt`
echo "$words words"

Sprawdzanie użycia dysku w katalogu

du ~/dirname

Pobieranie ścieżki katalogu skryptu w Bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )

Mierzenie czasu wykonania skryptu w Bash

Jedną z opcji jest użycie funkcji time

time your_script.sh

Inny sposób jest nieco bardziej skomplikowany:

start=`date +%s`

# bardzo ważny kod
# znajduje się tutaj

end=`date +%s`

runtime=$((end-start))

Porównywanie dwóch plików w VS Code

code -d <plik 1> <plik 2>

Sprawdzanie dostępnych pakietów w repozytorium Ubuntu

sudo apt-cache policy <nazwaPakietu>

Przydatne linki

Subskrybuj

Otrzymuj nowe wpisy o systemach, infrastrukturze i inżynierii AI.