shopt komut satırında çalışır, bir komut dosyasında çalıştırıldığında bulunamaz


13

Bazı dosyaları kopyalamak için bir komut dosyası yazıyorum ve shopt -s dotglob cp gibi dotfiles kopyalamak ve etkinleştirmek için kullanmaya çalışıyorum .jshint.

shopt -s dotglobHata olmadan doğrudan bash isteminde çalıştırabilirim . Ancak, komut dosyasını çalıştırmak hatayı atar:

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

Bu senaryoyu bash kabuğunda, shebang başlığı ile çalıştırıyorum #!/usr/bin/env bash. Hata satırı:

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

Google'da yararlı bir şey bulamadığınızda, sorunun burada ne olduğu hakkında bir fikriniz var mı?


Hatırlatma için teşekkürler, yapabileceğim her şey için seçilmiş cevaplar. Bu sorunun yanı sıra hala iyi bir yanıtı yok.
Kurtosis

3
Daha basit #!/bin/bashbaşlık ile denemek ister misiniz?
ish

Ve hangi Ubuntu sürümü?
ish

2
@izx, bu doğru cevaptır, shoptbash yerleşiktir, shsahip değildir shoptve hata mesajı bir hata mesajı gibi görünür dash. Büyük olasılıkla buradaki hata bir bash betiği çalıştırıyor sh( dashvarsayılan olarak Ubuntu'da ). shBir symlink olsa bile bash, bir bash betiğini shçalıştırmak onunla çalıştırmakla aynı şey değildir bash.
geirha

Yanıtlar:


23

Yorumlardan bir cevap oluşturmak için:

Alışkanlığı olmayan birçok kişi senaryolarını shbunun yerine çalıştırır bash. Bu, taşınabilirliğin bir endişe kaynağı olması durumunda iyi bir uygulamadır, ancak birçok insan bunu gördüğü için bir şeyleri anlamadan kopyaladıkları için yapar.

Komut dosyanızın masaüstü olmayan bir Linux sisteminde çalışması gerekmediği sürece (örn. Android cihazlarda kabuk komut dosyaları çalıştırmak oldukça farklıdır), başlangıçta Bash shebang satırını kullanmanızı öneririz:

#!/bin/bash

Bu satır, koddaki ilk satır olduğunda, yürütmek için hangi yorumlayıcının (bash veya sh, Python vb.) Çağrıldığını belirler. Yukarıdaki satırı kullanırsanız, varsayılan kabuğu kullandığınız varsayılarak, komut satırından yaptığınızla (neredeyse) aynı davranışı elde edersiniz. Taşınabilirlik veya tercih nedenleriyle farklı bir shebang hattı kullanıyorsanız, başvuruda bulunduğunuz kabuk Bash için bir sembolik bağlantı olsa bile , referans verdiğiniz kabuğun belgelerine başvurmanız gerektiğini unutmayın .


5
Tamamen çapraz-sistem olmak için tercih ederim: #!/usr/bin/env bash hangi bashın kullanılacağını bilmek (örneğin yamalı olmanız durumunda) env'nin işi olduğu için.
shrikeh

-1

Zsh'den çıkmanız ve gösterildiği gibi bash'ı etkinleştirmeniz gerekir:

exec bash

Komutu çalıştır

source ~/.bashrc

Bundan sonra zsh reaktif olabilir:

exec zsh

umarım yardımcı olur


Hmmm. 1) OP'nin zsh kullandığını düşünmüyorum, 2) AFAIK ~/.basrcbu durumda başlangıçta bash tarafından çalıştırılıyor, bu yüzden açıkça çağırmaya gerek yok, 3) OP komutu nerede yürütülüyor? ve 4) execiki kez kullanmak , ilk zsh kabuğunda yaptığınız ortam değişikliklerini kaybetmenize neden olur, bu da bash'ı çağırırsanız gerçekleşmez.
xenoid

Benim durumumda, çevre değişikliklerinin toplanması gerekiyordu ve değişiklikler devam etti. Bilgisayarı yeniden başlattım ve tüm değişikliklerim devam etti. Belki de kurmaya çalıştığım anaconda'ya özgü
David Kabii
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.