![Тестовий тест мікросхем Apple M2 демонструє найвищу продуктивність](/f/041cfa0b99d93dc1d20118b9c07ab20c.jpg?width=100&height=100)
Нещодавно я працював над сценарієм оболонки, і я побачив істотну різницю в тому, як спеціальна змінна bash $
та BASHPID
поводиться. Кожен процес, запущений в Linux буде призначено процесу Посвідчення особи і саме так операційна система обробляє цей процес.
Подібним чином, вашому терміналу bash також буде призначено ідентифікатор процесу. Існує спеціальна змінна, яка називається "$"
та "$ BASHPID"
який зберігає ідентифікатор процесу поточної оболонки.
Далі виконайте команду нижче, щоб побачити, який ідентифікатор процесу є вашою поточною оболонкою. Обидва "$"
та "$ BASHPID"
повертає те саме значення.
$ echo $$ # Друк спеціальної змінної $ $ echo $ BASHPID # Друк змінної $ BASHPID.
У bash, коли ми викликаємо будь -яку зовнішню програму з оболонки, вона створює дочірній процес/підшкілу, і програма буде подана лише у дочірньому процесі. Див. Нижче приклад, де я поміщаю просту команду монітора процесу в сценарій під назвою
"Sample.sh" щоб продемонструвати, як батьківська оболонка створює підоболонку для запуску програми.#!/usr/bin/env bash ps -ef --forest | grep -і баш.
Тепер, запустивши цей скрипт, ми можемо отримати ідентифікатор процесу bash. З наведеного нижче зображення ви можете зрозуміти, коли я викликав сценарій, bash створює дочірній процес і запускає сценарій.
$ ./sample.sh.
Тепер використовуємо обидва "$"
та "$ BASHPID"
всередині сценарію і подивіться, що він повертає.
#!/usr/bin/env bash. ехо "" ps -ef --ліс | grep -і баш. ехо "" echo "PID ВИКОРИСТОВУЄТЬ $ ДЛЯ СКРИПТА $ 0 ==> $$" echo "PID ВИКОРИСТАННЯ BASHPID ДЛЯ СКРИПТА $ 0 ==> $ BASHPID" луна.
Тепер знову запустіть сценарій.
$ ./sample.sh.
Гаразд, він повертає той самий ідентифікатор процесу. Тут настає реальна різниця. Давайте створимо ще один дочірній процес всередині сценарію, виконавши команду всередині круглі скобки()
.
# ЗБЕРІГАННЯ ПІДУ В ЗМІННУ… VAR_HASH = $ (echo $$) VAR_BASHPID = $ (echo $ BASHPID) ехо "VALUE OF VAR_HASH ==> $ VAR_HASH" відлуння "VALUE OF VAR_BASHPID ==> $ VAR_BASHPID"
У біш, Круглі скобки буде викликати дочірній процес і запускати все, що входить у дужки. В такому випадку обидва $
та $ BASHPID
слід зберігати новий ідентифікатор дочірнього процесу. Але з наведеного вище зображення видно, що де є різниця $
магазинів 382 який є батьківським ідентифікатором (ідентифікатор процесу сценарію sample.sh), і $ BASHPID
зберігає створений ідентифікатор дочірнього процесу, створений у дужках.
Тепер спробуємо зрозуміти цю поведінку. Ми подивимось, що говорить сторінка користувача.
$ man bash.
Коли ви використовуєте $
навіть у підоболонці він зберігає ідентифікатор процесу батьківського процесу, з якого він був створений. Але BASHPID
зберігатиме поточний ідентифікатор процесу, тобто при виклику в дужках він зберігатиме ідентифікатор дочірнього процесу.
Ми не можемо призначити або змінити змінну $
, але BASHPID
можна перепризначити, але це не має ефекту.
$ $=10. $ BASHPID = 10. $ echo $ BASHPID.
Можливе відключення BASHPID. Коли ви не налаштовані, він втрачає свій особливий стан, і ви також можете почати використовувати його як звичайну змінну.
$ unset BASHPID. $ echo $ BASHPID. $ BASHPID = "Tecmint" $ echo $ BASHPID.
Навіть якщо ви спробуєте призначити ідентифікатор процесу оболонки, вона буде розглядатися як змінна, визначена користувачем, оскільки вона вже втратила свій особливий стан.
$ BASHPID = $ (ехо $$) $ echo $$; echo $ BASHPID.
У цьому випадку вам доведеться використовувати новий термінальний сеанс для BASHPID отримати його особливий стан.
Ось і все для цієї статті. Ми побачили різницю між $
та BASHPID
і як вони поводяться в цій статті. Перегляньте цю статтю та поділіться з нами своїми цінними відгуками.