Դուք չեք կարող օգտագործել ելքը 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՝ մուտքի վահանակի պատուհանը բացելու համար:
- Մուտք գործեք:
- Գործարկեք ձեր սցենարը վերը նշված երեք մեթոդներից մեկով: