無法讓腳本在帶有 shebangs 的 Lubuntu (Xenial) Minimal (+LXDE) VM 中執行
我在這裡因為一個簡單的錯字和一個深刻的無知而讓自己有點尷尬。為自己省點悲傷:
- 你的 hasbangs/shebangs 必須總是有一個前導
/
,例如#!/bin/bash
- 準確
- 如果您在主機和來賓(虛擬)機器之間工作而沒有啟用複制和粘貼,請停止。錯別字會扼殺你的程式碼和你的問題,(這可能會讓人們失望)。弄清楚如何讓複製和粘貼工作,或在一台機器上工作。手動重新輸入是愚蠢的。
- 非常感激。這裡真的有很多樂於助人的人。
- 它們都是 linux,但在 shell 和腳本方面,不同的發行版可能有一些特殊性。(這包括發行版的完整和最小版本)。檢查你的外殼(
ps -p$$ -ocmd=
為我工作)。您是否必須手動創建目錄(尤其是在最小發行版中)?- 對我來說,因為它最適用於大多數係統(即“攜帶式”),我將使用 開始我的腳本
#!/usr/bin/env <SHELL>
,其中 SHELL 是bash
、sh
或其他。許多指導網站似乎只是說“始終以”開頭,#!/bin/bash
而沒有任何解釋或警告。只是不正確。- 殼牌檢查。這個工具可能很有幫助。(信用 - roaima)
我無法讓腳本在帶有 shebangs 的 Lubuntu (Xenial) Minimal (+LXDE) VM 中執行 - 沒有,它們很好。
根據上一篇文章中的建議,我製作了一個非常簡單的腳本,有 4 個版本,僅在 shebang 上有所不同:
echotest(沒有shebang線):
#blantantly simple test to figure out script problems echo "this is working - type something for me to repeat it" read input echo $input
echotest-bin-bash
#!bin/bash #blantantly simple test to figure out script problems echo "this is working - type something for me to repeat it" read input echo $input
還有兩個,對應於
#!bin/dash
和$$ EDIT: inserted “bin” in the following, in this text not the script $$
#!bin/sh
. 這些文件保存在~/bin
我在某處閱讀論壇後手動創建的目錄中。從那裡測試腳本會產生:
x@computer:~$ echotest this is working - type something for me to repeat it test1 test1
即它可以在沒有任何shebang的情況下工作,但是
x@computer:~$ echotest-bin-bash bash: /home/x/bin/echotest-bin-bash: bin/bash: bad interpreter: No such file or directory x@computer:~$ echotest-bin-dash bash: /home/x/bin/echotest-bin-dash: bin/bash: bad interpreter: No such file or directory x@computer:~$ echotest-bin-sh bash: /home/x/bin/echotest-bin-sh: bin/sh: bad interpreter: No such file or directory
更遠,
x@computer:~$ ./echotest-bin-bash bash: ./echotest-bin-bash: No such file or directory
為了測試我在論壇/部落格上閱讀的另一個建議,我從其中刪除了腳本
~/bin
並在保存為/usr/local/bin
.x@computer:~$ echotest bash: /home/x/bin/echotest: No such file or directory
對於所有其他變體也是如此。
然而,
x@computer:~$ sudo /usr/local/bin/echotest this is working - type something for me to repeat it test test
(即有效)
x@computer:~$ sudo /usr/local/bin/echotest-bin-bash sudo: unable to execute /usr/local/bin/echotest-bin-bash: No such file or directory Hangup
請注意,所有權限都已被授予
chmod +x <filename>
或很少使用chmod 777 <filename>
,並仔細檢查ls -l /rele/vant/directory
。x@computer:~$ echo $PATH /home/x/bin:/home/x/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
為了回答我第一次嘗試這個問題時的回复,Lubuntu Minimal 顯示了這些已安裝:
||/ Name Version Architecture Description +++-==============-============-============-================================= ii dash 0.5.8-2.1ubu amd64 POSIX-compliant shell ii bash 4.3-14ubuntu amd64 GNU Bourne Again SHell
使用從論壇收集的我不完全理解的命令:
x@computer:~$ file "$(type -P bash)" 2>/dev/null /bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=[redacted for the forum], stripped x@computer:~$ type -p bash /bin/bash
墨菲,如果你正在閱讀 - 我沒有運氣嘗試呼叫 bin/bash,得到提示。我不知道我的搜尋詞是如何帶來太多脫靶材料的。
最後,我在 .desktop 文件中測試了功能正常的腳本(即沒有 shebang),它執行良好(
Exec=echotest
)。為什麼shebangs不起作用?在我的 Ubuntu Mate (Xenial) 主機中工作的等效腳本
#!bin/bash
很好。我確信這是一個非常基本的錯誤,但我很難過。這是我的第二個劇本,所以我很高興被引導到相關的基礎材料。
提前致謝
編輯
謝謝杰西_b。
Edit1.1 - 不,我錯了。#!/bin/bash 確實有效。我已經搜尋了終端歷史記錄,但找不到我之前提到的那個條目。
此外,
#!/usr/bin/env bash
完美執行。編輯 2
謝謝墨菲
使用 hashbang
#!/bin/sh
並且#!/bin/bash
工作得很好。更遠
x@computer:~$ ls -l /bin/bash -rwxr-xr-x 1 root root 1037528 May 16 2017 /bin/bash x@computer:~$ /usr/bin/env | grep bash SHELL=/bin/bash x@computer::~$ ls -l /bin/*sh -rwxr-xr-x 1 root root 1037528 May 16 2017 /bin/bash -rwxr-xr-x 1 root root 154072 Feb 17 2016 /bin/dash lrwxrwxrwx 1 root root 4 May 16 2017 /bin/rbash -> bash lrwxrwxrwx 1 root root 4 Feb 17 2016 /bin/sh -> dash
最後的編輯- 不同的發行版或多或少會嚴格限制你的 hashbangs/shebangs 的格式。我發現這篇文章有人描述了早期版本的 Mint/Xfce 和 Lubuntu/LXDE 的類似問題。
(當我手動將主機 Ubuntu Mate 中的腳本重新輸入到 Lubuntu Minimal/LXDE 客戶機時遇到了麻煩。我以為我觀察到發行版之間的不同行為,但是 a)我不理解 shebang 格式的重要性, b) 有些網站提供的建議可能不太好,c) 我很容易出現拼寫錯誤。作為一個實驗,看看你的腳本是否可以在沒有 shebang 的情況下工作。)
您的雜湊爆炸必須以前導正斜杠開頭
/
#!bin/bash
幾乎可以肯定不是有效的目錄/文件路徑,應該是#!/bin/bash
如果您不確定外殼是否存在,您總是可以使用
ls
or 來確保路徑正確,或者更便攜的方式來編寫它:
#!/usr/bin/env bash
這將導致系統自動查找路徑
bash
(或您選擇的任何解釋器)env
並使用它找到的第一個。