ฉันแค่เขียน Bash script ง่ายๆบน CentOS 6.2:
[root@hadoop1 ~]# vi bash_startup
#! /bin/bash
export r=1
กลับไปที่บรรทัดคำสั่ง: และทำงานโดยใช้. /bash_startup
[root@hadoop1 ~]# echo $r
[root@hadoop1 ~]#
เสียงสะท้อน $r
ให้ผลลัพธ์กับฉันทำไม
ฉันแค่เขียน Bash script ง่ายๆบน CentOS 6.2:
[root@hadoop1 ~]# vi bash_startup
#! /bin/bash
export r=1
กลับไปที่บรรทัดคำสั่ง: และทำงานโดยใช้. /bash_startup
[root@hadoop1 ~]# echo $r
[root@hadoop1 ~]#
เสียงสะท้อน $r
ให้ผลลัพธ์กับฉันทำไม
คำตอบ:
การเปลี่ยนแปลงตัวแปรสภาพแวดล้อมในสคริปต์จะมีผลกับการเรียกเชลล์เท่านั้นหากคุณเรียกใช้สคริปต์เช่น:
. ./script.sh
หรือ:
source ./script.sh
ไม่:
bash ./script.sh
หรือ:
./script.sh
นี่เป็นเพราะสองวิธีก่อนหน้านี้เรียกใช้สคริปต์ในเชลล์ปัจจุบันในขณะที่สองวิธีหลังเริ่ม subshell และการเปลี่ยนแปลงตัวแปรสภาพแวดล้อมจะไม่แพร่กระจายขึ้นจาก subshells
! /bin/bash
. ไม่ควรจะเป็น #!/bin/bash
? สิ่งที่คุณพูดถูกต้อง แต่ดูเหมือนว่าสคริปต์นี้มีปัญหาเล็กน้อย
! /bin/bash
จะวิ่ง bash
และปฏิเสธสถานะการออก เปลือกใหม่นี้อาจแยกไม่ออกจากเปลือกหอยเก่า (การจัดหา) ในแวบแรก OP อาจคิดว่าทุกอย่างมีที่มาและลอง echo $r
; มันจะส่งคืนบรรทัดว่างเปล่าราวกับว่าโซลูชันของคุณไม่มีอะไรเปลี่ยนแปลง export r=1
จะมีแหล่งที่มาในเชลล์เก่าหลังจากออกเชลล์ใหม่เท่านั้น
! /bin/bash
(ซึ่งไม่ถูกต้อง) ถึง#!/bin/bash
ซึ่งถูกต้อง?