วิธีอัปเดต bash บน Mac OS X Yosemite


25

เพียงแค่พยายามเรียนรู้การทุบตีสคริปต์เล็กน้อย รุ่นทุบตีเก่าของฉัน:

Bash version 3.2.53(1)-release...

ฉันได้อัปเดตทุบตีบน mac os x yosemite ด้วย homebrew:

brew update
brew install bash

จากนั้นในคุณสมบัติขั้วฉันได้เปลี่ยนเส้นทางมาตรฐานเปลือกจาก/bin/bashไป/usr/local/bin/bash(ตามที่ผมเข้าใจนี่คือที่ homebrew ติดตั้งทุบตีปรับปรุง)

จากนั้นฉันตรวจสอบผลลัพธ์อีกครั้ง (และดูเหมือนว่าจะดีทั้งหมด):

$ echo $BASH_VERSION
Bash version 4.0.33(0)-release...

แต่เมื่อฉันพยายามเขียนสคริปต์ทุบตีง่าย:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {0..10..2}
  do
     echo "Welcome $i times"
 done

ผลลัพธ์คือ:

Bash version 3.2.53(1)-release...
Welcome {0..10..2} times

แทน:

Bash version 4.0.33(0)-release...
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 times
Welcome 10 times

ทำไมเวอร์ชั่น Bash เปลี่ยนกลับเป็นเก่าเมื่อฉันพยายามรันสคริปต์ในเชลล์เดียวกัน ??? นี่แค่ทำให้ฉันประหลาดใจ! ได้โปรดอธิบายให้ฉันรู้ว่าปัญหาของฉันคืออะไร))

คำตอบ:


17

ปัญหาของคุณอยู่ในบรรทัดแรกของคุณ คุณมีสิ่งนี้:

#!/bin/bash

/bin/bashซึ่งอย่างชัดเจนระบุว่าเชลล์สคริปต์ควรจะวิ่งกับเก่า สิ่งที่คุณต้องการจริงๆคือ:

#!/usr/local/bin/bash

ที่จะใช้ใหม่จากbash/usr/local/bin


สิ่งแปลก ๆ แต่มันใช้งานไม่ได้จริง ผลยังเหมือนเดิม (((แต่ฉันแน่ใจว่านี่เป็นส่วนหนึ่งของปัญหา)
Drew

ฉันต้องระบุเส้นทางนี้ที่อื่นไหม? ในเชลล์ไฟล์หรืออะไร?
Drew

1
บางทีสภาพแวดล้อมอาจถูกกำหนดโดยเชลล์ที่เรียกเช่น Bash เก่า? @Andrew คุณเรียกสคริปต์ของคุณอย่างไร
slhck

1
@ แอนดรูว์ฉันสงสัยว่าคุณshกำลังเข้า/binมา brewอาจจะไม่ได้ทำให้ symlink สำหรับเรียกว่าbash shกับชุดที่ถูกต้องให้ลองเริ่มต้นเช่นนี้$PATH bash script.sh
BenjiWiebe

8
สำหรับการอ้างอิงในอนาคตคุณควรใช้#!/usr/bin/env bash
pjvandehaar

15

ติดตั้ง bash ใหม่:

brew install bash

ทำให้นี่เป็นเชลล์เริ่มต้น:

chsh -s /usr/local/bin/bash

ตั้งค่าสภาพแวดล้อมในสคริปต์:

#!/usr/bin/env bash

การใช้envจะค้นหา Bash ในของคุณ$PATHและใช้อันแรกที่พบ คุณสามารถดูว่ามันจะใช้โดยการพิมพ์bash which bashถ้ามันเห็น/bin/bashครั้งแรกที่คุณจะต้องตั้งค่าของคุณ$PATHในและ~/.bashrc/.bash_profile


2
หากคุณเห็น "เปลือกที่ไม่ได้มาตรฐาน" พิมพ์ออกมาเมื่อมีการใช้chshคุณจะต้องปรับปรุง /
Scott Willeke

6

ตามที่ pjv ชี้ให้เห็นคุณควรใช้จริงๆ

#!/usr/bin/env bash

ในสคริปต์ของคุณทุกที่ที่จะพกพา เช่นถ้าคุณพยายามเรียกใช้สคริปต์ด้วย

#!/usr/local/bin/bash

มันจะล้มเหลวในระบบส่วนใหญ่ของลินุกซ์

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