Դուք չեք կարող օգտագործել ելքը Bash սկրիպտում, ուստի օգտագործեք այս լուծումները


Հիմնական Takeaways

  • Linux-ից դուրս գալու հրամանը չի աշխատում սկրիպտներում, քանի որ դրանք աշխատում են ոչ մուտքի պատյաններում:
  • Վահանակով մուտքի վահանակում դուք կարող եք օգտագործել exec հրամանը՝ սկրիպտը գործարկելու համար, և երբ այն ավարտվի, դուրս կգրվեք:
  • Այլընտրանքային մեթոդները ներառում են աղբյուրի օգտագործումը կամ հրամանի տողում դուրս գալու հրամանի ավելացումը:

Linux-ից դուրս գալու հրամանը չի աշխատում Bash սկրիպտների ներսում: Դա հազվադեպ է, բայց երբեմն ձեզ կարող է անհրաժեշտ լինել այդ գործառույթը: Ահա խնդիրը շրջանցելու և սցենարից դուրս գալու երեք եղանակ:

Ինչու դուրս գալը չի աշխատում սկրիպտներում

Կան մուտքի պատյաններ և ոչ մուտքի պատյաններ: Հենց առաջին կեղևը, որը ստեղծվում է, երբ մուտք եք գործում, մուտքի պատյան է: Բոլոր մյուս պատյանները մուտքի պատյաններ չեն: Կեղևի երկու տեսակների միջև եղած տարբերությունները բխում են համակարգի տարբեր ֆայլերից, որոնք կարդում են կեղևը, երբ այն ստեղծվում է:

Պարզ է, որ դուք չեք կարող դուրս գալ առանց մուտքի պատյանից: Եթե shell-ը չունի մուտք գործելու գաղափար, այն չի կարող ձեզ դուրս գրել:

Shell-ի սկրիպտները չեն աշխատում այն պատյանում, որտեղից գործարկվել են: Նրանց համար ստեղծվում է նոր կեղև: Նույնիսկ եթե դրանք գործարկվել են մուտքի վահանակից, նրանք չեն աշխատում մուտքի պատյանում:

Մենք դա կարող ենք շատ հեշտությամբ տեսնել: Սա Arch Linux-ով աշխատող համակարգչի մուտքի հուշումն է՝ առանց տեղադրված գրաֆիկական աշխատասեղանի միջավայրի: Այն օգտագործում է Bash shell-ը: Ես մուտք եմ գործել և պատրաստվում եմ սեղմել Enter՝ դուրս գալու հրամանի վրա:

logout

Ինչպես և դուք ակնկալում էիք, ես հետ եմ շպրտվել մուտքի հուշումով:

Այսպիսով, ակնհայտորեն, պատյանը, որը ես օգտագործում եմ, մուտքի պատյան է: Եկեք նորից մուտք գործենք և ստուգենք lo.sh կոչվող սցենարի բովանդակությունը: Այնուհետև մենք կգործարկենք այն:

cat lo.sh
./lo.sh

Bash-ը բողոքում է, որ մենք չենք կարող օգտագործել «logout»-ը չմուտքագրված վահանակում: Թեև մեր սցենարը հաստատ գործարկվել է մուտքի վահանակից, այն չի աշխատում: Մենք դուրս չենք եկել:

Այն չի աշխատի նաև գրաֆիկական աշխատասեղանի միջավայր ունեցող համակարգչի տերմինալային էմուլյատորի պատուհանում: Այս դեպքում դա Ubuntu-ն է՝ GNOME աշխատասեղանով:

logout

Ես ասացի, որ դուք ունեք միայն մեկ մուտքի կեղև: Դա խստորեն այդպես չէ: Կան սցենարներ, երբ դուք կարող եք ունենալ մեկից ավելի մուտքի վահանակ, որն աշխատում է ձեր համակարգչում, բայց դուք ունեք միայն մեկ մուտքի վահանակ յուրաքանչյուր օգտագործողի համար:

Յուրաքանչյուր օգտվողի կարիք ունի իր սեփական մուտքի վահանակը, որպեսզի կարողանա մուտք գործել և դուրս գալ: Հնարավոր է մուտք գործել նույն համակարգիչ, մեկից ավելի անգամ, որպես նույն օգտվող: Եթե ձեր համակարգչում կարգավորվել է SSH-ը, որպեսզի աջակցի հեռակա մուտքին, կարող եք նորից մուտք գործել SSH-ի միջոցով՝ ձեր տեղական համակարգիչ, տերմինալի պատուհանի միջոցով:

ssh dave@localhost
who
logout
who

Մուտք գործելուց հետո մենք գործարկում ենք who հրամանը՝ ներկա օգտվողներին ցուցակագրելու համար, այնուհետև դուրս ենք գալիս և նորից գործարկում who: Մենք կարող ենք տեսնել, որ մենք ժամանակավորապես ունեցել ենք լրացուցիչ օգտվող: Այդ օգտվողն ունի իր սեփական մուտքի պատյան: Բայց դա մեզ չի օգնում մեր սցենարով: Նրանք միակ օգտվողն են, ով կարող է մուտք գործել այդ պատյան, և նրանք կտեսնեն նույն վարքագիծը, ինչ մենք հենց նոր տեսանք:

Ինչպես դուրս գալ՝ օգտագործելով exec

Այսպիսով, դուրս գալը պետք է օգտագործվի մուտքի վահանակում, բայց մեր սկրիպտը չի աշխատի մուտքի վահանակում, նույնիսկ եթե այն գործարկվի մեկից:

Այն, ինչ մենք կարող ենք անել, մեր սցենարը գործարկելն է exec-ով: Սա չի հետևում սցենարը գործարկելու համար կեղև ստեղծելու սովորական գործընթացին: Այն փոխարինում է ընթացիկ կեղևը հրամանով, որը գործարկում է exec-ը: Կեղևը նետված է: Երբ հրամանն ավարտվում է, այն չի կարող վերադառնալ այժմ գոյություն չունեցող կեղևին: Եթե մենք դա անենք մուտքի վահանակից, մենք դուրս կգրվենք:

Մեզ պետք է սցենար փորձարկման համար: Պատճենեք այս չնչին սցենարը ձեր սիրած խմբագրին, ապա պահպանեք այն որպես «lo.sh»:

#!/bin/bash
logout

Մենք կօգտագործենք chmod՝ այն գործարկելի դարձնելու համար:

chmod +x lo.sh

Սցենարը ձախողվում է այժմ ծանոթ սխալի հաղորդագրությամբ.

./lo.sh

Եթե մենք գործարկենք այն exec-ով, ապա տերմինալի պատուհանը փակվում է, երբ սկրիպտը դադարում է աշխատել:

exec ./lo.sh

Իհարկե, մեր Arch համակարգչում միայն վահանակի վրա մենք չենք օգտագործում տերմինալային էմուլյատոր: exec-ը փոխարինում է մեր մուտքի կեղևը սցենարով:

Երբ սցենարն ավարտվում է, մեզ ներկայացվում է մուտքի նոր հուշում: Այսպիսով, այն աշխատում է Linux համակարգիչների վրա կոնսոլային մուտքերի համար՝ առանց տեղադրված գրաֆիկական աշխատասեղանի միջավայրի: Դա օգնո՞ւմ է մեզ մեր Ubuntu համակարգչում, որն աշխատում է GNOME-ով:

Այո, դա այդպես է: GNOME-ում մենք կարող ենք սեղմել Ctrl+Alt+FnKey՝ բացելու ճիշտ նույն տեսակի ամբողջական էկրանը՝ մուտքի վահանակի վահանակը: FnKey-ը կարող է լինել F3-ից F6-ից մեկը:

Մենք կարող ենք մուտք գործել և օգտագործել նույն հրամանը, ինչ արեցինք մեր Arch համակարգչի վրա:

exec lo.sh

Մենք դուրս ենք եկել համակարգից և վերադարձել ենք վահանակի մուտքի հուշում: Սեղմելով Ctrl+Alt+F1-ը ձեզ վերադարձնում է ձեր GNOME նիստը: Մուտքը վերականգնելու համար դուք պետք է մուտքագրեք ձեր գաղտնաբառը:

Նկատի ունեցեք, որ դուք վերադարձել եք ձեր GNOME նիստին այնպես, ինչպես եղել է մինչև Ctrl+Alt+F3 սեղմելը: Ձեր GNOME նիստը դուրս չի եկել, բայց այն պաշտպանված է գաղտնաբառով:

Եթե դուք չեք ցանկանում, որ ձեր GNOME սեսիայի օգտատերը մուտք գործի, դուրս եկեք նրան նախքան ձեր սկրիպտը գործարկելը: Դուք կարող եք սեղմել Ctrl+Alt+F3 Ubuntu-ի մուտքի էկրանին, մուտք գործել վահանակ և գործարկել ձեր սցենարը:

Մի երկու կետ. Երբ դուք օգտագործում եք exec այսպես, սկրիպտում դուրս գալու հրամանն ավելորդ է: Դա այն փաստն է, որ սկրիպտը ավարտվում է առանց կեղևի՝ վերադառնալու համար, ինչը ձեզ արդյունավետորեն դուրս է մղում:

Դուք կարող եք օգտագործել exit-ը դուրս գալու փոխարեն, կամ ընդհանրապես չօգտագործել որևէ հրաման: Սցենարն ավարտվելուց հետո դուք դուրս եք եկել: Եթե դուք ունեք կատարման ճյուղեր ձեր սցենարում, և այն կարող է ավարտվել տարբեր վայրերում, կարող եք օգտագործել ելքը՝ ավարտելու կատարման հնարավոր ուղիներից յուրաքանչյուրը:

Մեկ այլ խնդիր այն է, որ քանի որ դուք չեք կատարում ձեր սկրիպտը կեղևի ներսում, դուք մուտք չունեք shell-ի առանձնահատկություններին, ինչպիսիք են նիշերի ընդլայնումը, ոչ էլ անուն-ազգանունները և shell գործառույթները: Եթե ձեր սցենարին անհրաժեշտ են դրանք, կարող եք օգտագործել ստորև ներկայացված մյուս տեխնիկաներից մեկը:

Ինչպես դուրս գալ՝ օգտագործելով աղբյուրը

Linux աղբյուրի հրամանի օգտագործումը մեկնաբանում է ձեր սկրիպտի ներսում եղած հրամանները՝ առանց սկրիպտը կեղևի մեջ գործարկելու: Հրամանները մեկնաբանվում են ընթացիկ կեղևով:

Բացեք վահանակի պատուհանը, ինչպես վերևում, օգտագործելով Ctrl+Alt+F3 և օգտագործեք աղբյուրի հրամանը՝ ձեր սցենարի հրամանները մեկնաբանելու համար:

source ./lo.sh

Դուք կարող եք օգտագործել աղբյուր բառը կամ կետը:

. ./lo.sh

Այս տեխնիկայի միջոցով դուք պետք է օգտագործեք ելք կամ դուրս գալ սցենարից: Սցենարի ինքնուրույն դադարեցումը ձեզ դուրս չի գա:

Ինչպես դուրս գալ՝ օգտագործելով Bash ֆունկցիան

Գոյություն ունի ցանկացած սկրիպտ գործարկելու և այն ավարտվելուն պես դուրս գրելու միջոց՝ առանց դուրս գալու կամ բուն սցենարից դուրս գալու: Պահպանեք այս սկրիպտը որպես պարզ.sh.

#!/bin/bash
echo "This script doesn't call any other commands."

Դարձրեք այն գործարկելի՝ մուտքագրելով.

chmod +x simple.sh

Մուտքի վահանակի էկրանին սկրիպտի անունից հետո ավելացրեք «ելք» հրամանը: Սցենարի անվանումը անջատեք դուրս գալու հրամանից՝ կետ-ստորակետով:

./simple.sh; logout

Երբ մեր սցենարն ավարտվում է, մենք դուրս ենք գալիս:

Եթե դա հաճախակի եք անում, ապա հարմար կլինի նման փոքրիկ Bash ֆունկցիան ստեղծել:

run-logout () {
  $1; logout
}

Դուք կարող եք զանգահարել այս գործառույթը և փոխանցել սկրիպտի անունը: Երբ դա անում եք մուտքի վահանակում, դուք դուրս կգրվեք, երբ սցենարն ավարտվի:

run-logout simple.sh

Արագ ամփոփում

Եթե ցանկանում եք, որ ձեր բացակայության դեպքում սկրիպտը ավարտվի, և երբ այն ավարտվի, օգտագործողը դուրս գա համակարգից, այնպես որ ընդհանրապես մուտք գործած օգտվողներ չլինեն, հետևեք այս քայլերին:

  • Դուրս գրեք բոլոր օգտվողներին համակարգչից:
  • GNOME-ի մուտքի էկրանին սեղմեք Ctrl+Alt+F3՝ մուտքի վահանակի պատուհանը բացելու համար:
  • Մուտք գործեք:
  • Գործարկեք ձեր սցենարը վերը նշված երեք մեթոդներից մեկով: