ทำไมสคริปเรียบง่ายของฉันไม่ทำงาน


1

ฉันแค่เขียน Bash script ง่ายๆบน CentOS 6.2:

[root@hadoop1 ~]# vi bash_startup

#! /bin/bash
export r=1

กลับไปที่บรรทัดคำสั่ง: และทำงานโดยใช้. /bash_startup

[root@hadoop1 ~]# echo $r

[root@hadoop1 ~]#

เสียงสะท้อน $r ให้ผลลัพธ์กับฉันทำไม


จะเกิดอะไรขึ้นกับสคริปต์ของคุณหากคุณเปลี่ยน ! /bin/bash (ซึ่งไม่ถูกต้อง) ถึง #!/bin/bash ซึ่งถูกต้อง?
JakeGould

คำตอบ:


3

การเปลี่ยนแปลงตัวแปรสภาพแวดล้อมในสคริปต์จะมีผลกับการเรียกเชลล์เท่านั้นหากคุณเรียกใช้สคริปต์เช่น:

. ./script.sh

หรือ:

source ./script.sh

ไม่:

bash ./script.sh

หรือ:

./script.sh

นี่เป็นเพราะสองวิธีก่อนหน้านี้เรียกใช้สคริปต์ในเชลล์ปัจจุบันในขณะที่สองวิธีหลังเริ่ม subshell และการเปลี่ยนแปลงตัวแปรสภาพแวดล้อมจะไม่แพร่กระจายขึ้นจาก subshells


เกี่ยวกับสิ่งนั้น ! /bin/bash. ไม่ควรจะเป็น #!/bin/bash? สิ่งที่คุณพูดถูกต้อง แต่ดูเหมือนว่าสคริปต์นี้มีปัญหาเล็กน้อย
JakeGould

1
@ JakeGould แม้ว่ามันจะผิดเช่นกัน แต่ฉันไม่คิดว่ามันเกี่ยวข้องกับปัญหาที่ OP ถาม
Joseph Sible

1
ค่อนข้างมีความเกี่ยวข้อง ! /bin/bash จะวิ่ง bash และปฏิเสธสถานะการออก เปลือกใหม่นี้อาจแยกไม่ออกจากเปลือกหอยเก่า (การจัดหา) ในแวบแรก OP อาจคิดว่าทุกอย่างมีที่มาและลอง echo $r; มันจะส่งคืนบรรทัดว่างเปล่าราวกับว่าโซลูชันของคุณไม่มีอะไรเปลี่ยนแปลง export r=1 จะมีแหล่งที่มาในเชลล์เก่าหลังจากออกเชลล์ใหม่เท่านั้น
Kamil Maciorowski

1
@ Mat คำตอบอย่างชัดเจนบอกว่าคุณควรแหล่งที่มาของไฟล์ไม่ได้เรียกใช้
Kamil Maciorowski

1
คุณลองคำสั่งสองคำสั่งที่ฉันบอกว่าใช้ไม่ได้
Joseph Sible
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.