Scripting

無法讓腳本在帶有 shebangs 的 Lubuntu (Xenial) Minimal (+LXDE) VM 中執行

  • October 23, 2018

我在這裡因為一個簡單的錯字和一個深刻的無知而讓自己有點尷尬。為自己省點悲傷:

  1. 你的 hasbangs/shebangs 必須總是有一個前導/,例如#!/bin/bash
  2. 準確
  3. 如果您在主機和來賓(虛擬)機器之間工作而沒有啟用複制和粘貼,請停止。錯別字會扼殺你的程式碼和你的問題,(這可能會讓人們失望)。弄清楚如何讓複製和粘貼工作,或在一台機器上工作。手動重新輸入是愚蠢的。
  4. 非常感激。這裡真的有很多樂於助人的人。
  5. 它們都是 linux,但在 shell 和腳本方面,不同的發行版可能有一些特殊性。(這包括發行版的完整和最小版本)。檢查你的外殼(ps -p$$ -ocmd=為我工作。您是否必須手動創建目錄(尤其是在最小發行版中)?
  6. 對我來說,因為它最適用於大多數係統(即“攜帶式”),我將使用 開始我的腳本#!/usr/bin/env <SHELL>,其中 SHELL 是bashsh或其他。許多指導網站似乎只是說“始終以”開頭,#!/bin/bash而沒有任何解釋或警告。只是不正​​確。
  7. 殼牌檢查。這個工具可能很有幫助。(信用 - 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

如果您不確定外殼是否存在,您總是可以使用lsor 來確保路徑正確,或者更便攜的方式來編寫它:

#!/usr/bin/env bash

這將導致系統自動查找路徑bash(或您選擇的任何解釋器)env並使用它找到的第一個。

引用自:https://unix.stackexchange.com/questions/411245