Fish Shell: 実行形式エラー

Fish Shell: 実行形式エラー

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

  1. 次の方法も機能します。

    sudo ./<your script>

基本的にbashを実行するのでSudoほとんどのディストリビューションでコマンドを使用します。しかし、スクリプトを変更したくない場合は、おそらく理由があります。

ノート:これは、この種の問題にアクセスするための誤った方法です。以下を変更してください。Gillesが提案した

関連情報