Ubuntuから( $ uname -a
:)Linux kumanaku 4.15.0-43-generic #46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
ちょうどインストールしました魚( $ fish --version
:)fish, version 2.7.1
次のコマンドを使用します。
sudo apt-add-repository ppa:fish-shell/release-2
sudo apt-get update
sudo apt-get install fish
chsh -s /usr/bin/fish
echo /usr/bin/fish | sudo tee -a /etc/shells
実行しfish
て使用できますが、次の単純なシェルファイルを実行すると次のようになります。
echo "something"
次のメッセージを受け取りました。
$ ./myscript.sh
Failed to execute process './myscript.sh'. Reason:
exec: Exec format error
The file './myscript.sh' is marked as an executable but could not be run by the operating system.
いいえシェルボーン私のスクリプトから。を追加すると、#!/usr/bin/env fish
すべてがうまく機能します(スクリプトが正常に起動した場合など)、スクリプトが他のシェルと互換性を保つようにするには、このような行を避けたいと思います。
どんなアイデアがありますか?
答え1
実行可能ファイルをカーネルでデフォルトで実行できない場合は、shebang行が必要です。カーネルは特定の形式の機械語コードのみを実行できます(非常に低い周波数ほとんどのUnixバリアントでは、または時には他の形式(たとえば、Linuxでは実行可能な形式を登録できます)binfmt_misc)。実行ファイルに必要な場合通訳その後、カーネルはどのインタプリタを呼び出すかを知る必要があります。これはシェルボーン行は次のとおりです。
スクリプトが Fish 構文を使用する場合、最初の行は次のようになります。
#!/usr/bin/env fish
fish
(絶対パスを使用できますが、実行可能ファイルが別の場所にある/usr/bin/fish
システムで実行するには(例:と)スクリプトを変更する必要があります/usr/local/bin/fish
。)
スクリプトがsh構文である場合は、以下を使用してください。
#!/bin/sh
(すべての最新のUnixシステムにはPOSIXシャットがあるため、/bin/sh
必要ありませんenv
。)
スクリプトが bash 構文 (sh や bash 関連の拡張など) になっている場合は、次のようにします。
#!/usr/bin/env bash
実際にはLinuxでも#!/bin/bash
動作します。
これらはすべてスクリプトを呼び出すシェルとは無関係です。重要なのは、スクリプトがどの言語で書かれているかです。
答え2
パスを参照してスクリプトを実行するには、shebangが必要です。それ以外の場合、オペレーティングシステムは実行を試みますが、バイナリ実行ファイルではないため失敗します。
Shebangを無効にするには、スクリプトを実行するターゲットを指定する必要があります。あなたの場合はfish
。
fish myscript.sh
答え3
次の方法も機能します。
sudo ./<your script>
基本的にbashを実行するのでSudoほとんどのディストリビューションでコマンドを使用します。しかし、スクリプトを変更したくない場合は、おそらく理由があります。
ノート:これは、この種の問題にアクセスするための誤った方法です。以下を変更してください。Gillesが提案した