shopt ทำงานในบรรทัดคำสั่งไม่พบเมื่อทำงานในสคริปต์


13

ฉันกำลังเขียนสคริปต์เพื่อคัดลอกไฟล์บางไฟล์และพยายามใช้shopt -s dotglob เพื่อเปิดใช้งาน cp เพื่อคัดลอก dotfiles like .jshintand whatnot

ฉันสามารถรันshopt -s dotglobโดยตรงที่ bash prompt โดยไม่มีข้อผิดพลาด อย่างไรก็ตามการรันสคริปต์จะพ่นข้อผิดพลาด:

script.sh: 81: script.sh: shopt: not found

#!/usr/bin/env bashฉันทำงานสคริปต์นี้ในเปลือกทุบตีด้วยส่วนหัว shebang บรรทัดข้อผิดพลาด:

shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/

ไม่พบสิ่งที่มีประโยชน์บน google ความคิดใด ๆ ว่าปัญหาอยู่ที่นี่หรือไม่


ขอบคุณสำหรับการเตือนความจำเลือกคำตอบสำหรับทุกสิ่งที่ฉันทำได้ ยังมีอีกอย่างนอกเหนือจากคำถามนี้ที่ยังไม่มีคำตอบที่ดี
Kurtosis

3
ลองด้วย#!/bin/bashหัวข้อที่ง่ายกว่านี้ไหม
ish

และอูบุนตูเวอร์ชันไหน?
ish

2
@izx นั่นคือคำตอบที่ถูกshoptคือ builtin ทุบตีshไม่ได้และดูข้อผิดพลาดเช่นข้อผิดพลาดจากshopt dashดังนั้นข้อผิดพลาดที่นี่ส่วนใหญ่ใช้สคริปต์ทุบตีด้วยsh(ซึ่งใน Ubuntu เป็นdashค่าเริ่มต้น) แม้ว่าshเป็น symlink ไปbashทำงานสคริปต์ทุบตีด้วยไม่ได้เช่นเดียวกับการทำงานด้วยsh bash
geirha

คำตอบ:


23

ในการสร้างคำตอบจากความคิดเห็น:

หลายคนออกมาจากนิสัยเรียกใช้สคริปต์ของพวกเขาด้วยแทนsh bashนี่เป็นวิธีปฏิบัติที่ดีหากความสะดวกในการพกพาเป็นเรื่องที่น่ากังวล แต่หลายคนทำเช่นนั้นเพราะพวกเขากำลังคัดลอกสิ่งที่พวกเขาเห็นโดยไม่เข้าใจ

ยกเว้นว่าสคริปต์ของคุณจำเป็นต้องทำงานบนระบบที่ไม่ใช่เดสก์ท็อป Linux (เช่นการเรียกใช้เชลล์สคริปต์ในอุปกรณ์ Android นั้นแตกต่างกันมาก) ฉันขอแนะนำให้ใช้บรรทัด Bash shebang ที่จุดเริ่มต้น:

#!/bin/bash

บรรทัดนี้เมื่อเป็นบรรทัดแรกในสคริปต์กำหนดว่าล่าม (เชลล์เช่น bash หรือ sh, Python และอื่น ๆ ) จะถูกเรียกให้เรียกใช้งานมัน หากคุณใช้บรรทัดข้างต้นคุณจะได้รับพฤติกรรมเดียวกัน (เกือบ) เหมือนกับที่คุณทำจากบรรทัดคำสั่งโดยสมมติว่าคุณใช้เชลล์เริ่มต้น หากด้วยเหตุผลของการพกพาหรือการตั้งค่าที่คุณใช้เส้น Shebang ที่แตกต่างกันโปรดทราบว่าคุณจะต้องศึกษาเอกสารประกอบสำหรับเชลล์ที่คุณอ้างอิงถึงแม้ว่าเชลล์ที่คุณอ้างอิงนั้นเป็น symlink ของ Bash


5
เพื่อให้เป็นระบบข้ามอย่างสมบูรณ์ฉันต้องการ: #!/usr/bin/env bash เนื่องจากเป็นหน้าที่ของ env ที่จะรู้ว่าควรใช้ bash ใด (ในกรณีที่คุณได้ทำการแก้ไข)
shrikeh

-1

คุณต้องออกจาก zsh และเปิดใช้งาน bash ดังที่แสดง:

exec bash

การรันคำสั่ง

source ~/.bashrc

หลังจากนั้นคุณสามารถตอบสนอง zsh:

exec zsh

หวังว่าจะช่วย


อืมม 1) ฉันไม่คิดว่า OP ใช้ zsh, 2) AFAIK ~/.basrcรันโดยการทุบตีเมื่อเริ่มต้นในกรณีนี้จึงไม่จำเป็นต้องเรียกมันอย่างชัดเจน 3) คำสั่ง OP ดำเนินการที่ไหน และ 4) การใช้execสองครั้งทำให้คุณสูญเสียการเปลี่ยนแปลงสภาพแวดล้อมใด ๆ ที่คุณทำในเชลล์ zsh เริ่มต้นซึ่งจะไม่เกิดขึ้นหากคุณเพิ่งจะเรียก bash
xenoid

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