「sh」または「bash」コマンドを使用せずにシェルスクリプトを実行するにはどうすればよいですか?


261

「sh」または「bash」コマンドを使用せずに実行したいシェルスクリプトがあります。例えば:

の代わりに: sh script.sh

使いたい: script.sh

これどうやってするの?

PS(i)私はシェルスクリプトをあまり使用せず、エイリアスについて読んでみましたが、エイリアスの使い方がわかりませんでした。

(ii)スクリプトをPATH変数内の別のファイルにリンクする方法についても読みました。大学のサーバーを使用していますが、これらの場所にファイルを作成する権限がありません。


1
答えは、スクリプトを実行可能にする方法を示していますが、アクセス可能にする方法をカバーしていないようです。そのために、自分でbinディレクトリを作成します- $HOME/binまだ持っていない場合は、PATHに追加します(フロントの近くにあります)。ここにパス名を指定せずに直接実行するスクリプト(およびその他のプログラム)を配置するか、実際のプログラムがある場所へのシンボリックリンクをここに配置します。
Jonathan Leffler、2012年

1
以下の回答に従って、「。sh」を削除するには、ファイルの名前を変更します。mv example.sh exampleその後example、それ自体で機能するはずです。
PJ Brunet

回答:


434

ファイルの先頭に「シバン」を追加します。

#!/bin/bash

そして、ファイルを実行可能にします(chmod +x script.sh)。

最後に、パスを変更して、スクリプトが配置されているディレクトリを追加します。

export PATH=$PATH:/appropriate/directory

(通常、$HOME/bin独自のスクリプトを保存する必要があります)


返信ありがとうございます。試してみました。これで、「sh」コマンドなしで実行できます。ただし、コマンドの前に "./"を付ける必要がありますが、これは不要です。:)
Rameez Hussain、2012

5
パスに関するコメントを参照してください。PATHに追加する必要があるディレクトリにスクリプトを配置する必要があります。
2012年

2
私の場合はうまくいきませんでした。しかし、source script.shうまく機能したか、それとも source <filename_without_any_extension_type>
MycrofD 2017年

4
source ./my-cool-script(または. ./my-cool-script)は、スクリプトで定義された変数で現在のシェルセッションを汚染します。環境変数を設定したり、ディレクトリを変更したりして、シェルセッションを明示的に変更したい場合を除き、ソーシングは使用しないでください。1つのスクリプト実行からの変数がソース経由で実行された場合、別のスクリプト実行に影響を与える可能性があるため、本当にひどいバグが発生する可能性があります。
Daniel Waltrip 2017年

3
スクリプトフォルダーが確実にPATHにあり、それでもがなければ機能しない./場合は、名前が競合している可能性があります。名前を変更してみてください。
2017

66

これらは、スクリプト名を直接使用するための前提条件の一部です。

  1. she-bang (#!/bin/bash)一番上の行を追加します。
  2. 使用してchmod u+x scriptnameスクリプトを実行可能にします。(scriptnameスクリプトの名前はどこですか)
  3. スクリプトを/usr/local/binフォルダーの下に配置します。
  4. スクリプトの名前だけを使用してスクリプトを実行します。

注:/usr/local/binフォルダーに配置することを提案した理由は、ほとんどの場合、パスが既にに追加されているためPATH variableです。

更新:

/usr/local/binフォルダーにアクセスできない場合は、次の操作を行います。

  1. ホームディレクトリにフォルダを作成し、それを呼び出しましょうmyscripts
  2. やるls -lartお使いのシェルが使用され、起動スクリプトを識別するために、あなたのホームディレクトリに。.profileまたはである必要があります.bashrc
  3. 起動スクリプトを特定したら、スクリプトに次の行を追加します- export set PATH=$PATH:~/myscript
  4. 追加したら、起動スクリプトをソーシングするか、ログアウトして再度ログインします。
  5. を使用してスクリプトを実行しますscriptname

これを試してみましたが、/ usr / local / binフォルダーにアクセスする権限がありません。私は大学のコンピュータを使用しています。
Rameez Hussain、2012

1
「起動スクリプトをソースする」とはどういう意味ですか?
Rameez Hussain、2012

1
起動スクリプトを調達するということは、スクリプトを実行して、PATH変数に新しく設定されたパラメーターがシェルによって取得されるようにすることです。これは、を実行することで実行できます. .bashrc。つまり、putの.後にspace起動スクリプト名を続けます。
jaypal sing

システムの問題が何なのかわかりません。「hello」という名前の新しいシェルスクリプトを作成し、その中に「echo "hello"」だけを入れました。権限を変更して./helloを試しました。それは動作しません。それは言う
Rameez Hussain

起動スクリプトにどのような変更を加えましたか?
jaypal sing 2012

20

を使用して、実行可能であることを確認してくださいchmod +x。デフォルトでは、現在のディレクトリはPATH上にないので、それを次のように実行する./script.shか、修飾パスで参照する必要があります。または、本当に必要なだけのscript.sh場合は、PATHに追加する必要があります。(システムパスを変更するアクセス権がない可能性がありますが、ほぼ確実に現在の環境のPATHを変更できます。)これは、スクリプトが次のようなもので始まることも前提としています。#!/bin/sh

エイリアスを使用することもできます。これは、シェルスクリプトに実際には関連しておらず、シェルだけに関連しており、次のように簡単です。

alias script.sh='sh script.sh'

これにより、の代わりに単純にscript.sh(文字通り-これは他の*.shファイルでは機能しません)を使用できますsh script.sh


おい!お返事をありがとうございます。以前にエイリアスを使用してみました。しかし、何も起こりませんでした。「#!/ usr / local / bin / bash」行の直後に配置しました。何が悪いと思いますか?
Rameez Hussain、2012

1
エイリアスはスクリプト内で定義できません-現在の環境の一部として宣言する必要があります。したがってalias、シェルプロンプトでコマンドを実行するだけで、エイリアスを使用してコマンドを実行できます。
ジーゼマー

17

この例では、ファイルは呼び出されます myShell

最初に、このファイルを作成する必要があります。次のように入力するだけで開始できます。

sudo nano myShell

.sh拡張機能を配置しなかったことに注意してください。これは、ターミナルから実行するときは、次のように入力するだけなのでmyShell、コマンドを実行するためにです。

さて、nanoでは、最初の行はその#!/bin/bash前でなければならず、続行する前に新しい行を残すことができます。

デモのために、基本的なHello World!応答を追加します

そこで、次のように入力します。

echo Hello World!

その後、私の例は次のようになります。

#!/bin/bash
echo Hello World!

ファイルを保存して、次のコマンドを実行します。

sudo chmod +x myShell

ファイルを実行可能に/usr/bin/したので、次のコマンドを使用して移動できます。

sudo cp myShell /usr/bin/

マシンが適切に実行できることを確認するために、マシンを再起動する必要があります

使った sudo shutdown -r now

おめでとうございます!これでコマンドが完了しました!ターミナルでタイプすることができmyShell、それは言うべきですHello World!


1
あなた自身のファイルを入れるべきではありません/usr/bin-多くのシステム/usr/local/binはこの目的のために動かし/usr/bin、OSのために厳密に予約します。
Tripleee

sudo chmod独自のファイルを作成する必要はありません。
tripleee

マシンを再起動する必要はありません。最大で再度
調達

14

プログラムの実行可能ビットを有効にする必要があります。

chmod +x script.sh

その後、使用できます ./script.sh

.bashrc(ホームディレクトリにある)ファイルのPATHにフォルダーを追加できます。次の行をファイルの最後に追加します。

export PATH=$PATH:/your/folder/here

既に適切なアクセス許可を設定していることを忘れていました。コマンド「chmod 755 script.sh」を使用しました
Rameez Hussain、

6

sudo install(スクリプトの名前)/ usr / local / bin /と入力できます(このスクリプトを実行するために入力する内容)

例:sudo install quickcommit.sh /usr/local/bin/quickcommit パスワードを入力

.shなしで、任意のディレクトリで実行できるようになりました


3

追加 。(現在のディレクトリ)をPATH変数に追加します。
これを行うには、.profileファイルを編集します。
.profileファイルに次の行
PATH=$PATH:.

を追加し#!/bin/bashます。スクリプトの先頭にShebang()行を追加し、スクリプトを実行可能にします(を使用chmod +x <File Name>)。


0

これがあなたにアイデアと自動化を与える私のバックアップスクリプトです:

サーバー:Ubuntu 16.04 PHP:7.0 Apache2、Mysqlなど...

# Make Shell Backup Script - Bash Backup Script
    nano /home/user/bash/backupscript.sh
        #!/bin/bash
        # Backup All Start
        mkdir /home/user/backup/$(date +"%Y-%m-%d")
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_rest.zip /etc -x "*apache2*" -x "*php*" -x "*mysql*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_apache2.zip /etc/apache2
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_php.zip /etc/php
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_mysql.zip /etc/mysql
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_rest.zip /var/www -x "*html*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_html.zip /var/www/html
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/home_user.zip /home/user -x "*backup*"
        # Backup All End
        echo "Backup Completed Successfully!"
        echo "Location: /home/user/backup/$(date +"%Y-%m-%d")"

    chmod +x /home/user/bash/backupscript.sh
    sudo ln -s /home/user/bash/backupscript.sh /usr/bin/backupscript

/ home / userをユーザーディレクトリに変更し、次のように入力します。スクリプトを実行するには、ターミナルの任意の場所にbackupscript!(/ usr / binがパスにあると想定)


0

"#!/bin/sh"スクリプトの前に入力してください。次にscript.sh、例として保存します。それをコピーする $HOME/bin$HOME/usr/bin
、ディレクトリは異なるLinuxディストリビューションでは異なる場合がありますが、末尾 'bin' がホームディレクトリ cd $HOME/bin または $HOME/usr/bin
タイプにあり 、ターミナルでchmod 700 script.sh
入力するだけで実行できます run.sh。うまくいかない場合 chmod +x run.sh は、 chmod 700 run.sh


この回答の中で、非常に古い既存の回答からの情報を述べていない部分は混乱しています。
tripleee

0

ファイルを実行可能にする


たとえば、migrate_linux_amd64という実行可能ファイルがあり、このファイルを "migrate"のようなコマンドとして実行するとします。

  1. まず、ファイルの場所から実行可能ファイルをテストします。
[oracle@localhost]$ ./migrate.linux-amd64 
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
  1. ファイルに対する実行権限があることを確認します。
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    そうでない場合は実行します。chmod +x migrate.linux-amd64

  2. 次に、ファイルをにコピーします/usr/local/bin。このディレクトリはrootが所有しています。sudoを使用するか、rootに切り替えて、次の操作を実行してください

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. 次に、以下のようなシンボリックリンクを作成します。
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. 最後に/ usr / local / binをパスまたはユーザープロファイルに追加します
export PATH = $PATH:/usr/local/bin
  1. 次に、「移行」としてコマンドを実行します
[oracle@localhost]$ migrate
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.