如何在不使用“ sh”或“ bash”命令的情况下运行shell脚本?


261

我有一个要运行的shell脚本,而无需使用“ sh”或“ bash”命令。例如:

代替: sh script.sh

我要使用: script.sh

我怎样才能做到这一点?

PS(i)我不太使用shell脚本,并且尝试阅读有关别名的信息,但是我不了解如何使用它们。

(ii)我还阅读了有关将脚本与PATH变量中的另一个文件链接的信息。我正在使用大学服务器,但没有在这些位置创建文件的权限。


1
答案表明如何使脚本可执行,但似乎并未涵盖如何使其可访问。为此,请创建一个自己的bin目录-- $HOME/bin如果您还没有一个bin目录,请将其添加到PATH(靠近前端)中。将您要直接执行的脚本(和任何其他程序)直接放在此处,而无需在此处指定路径名,也无需在此处指定实际程序所在的符号链接。
乔纳森·莱夫勒

1
按照以下答案进行操作后,要删除“ .sh”,您可以重命名该文件:mv example.sh example然后example应自行工作。
PJ Brunet

Answers:


434

在文件顶部添加“ shebang”:

#!/bin/bash

并使您的文件可执行(chmod +x script.sh)。

最后,修改路径以添加脚本所在的目录:

export PATH=$PATH:/appropriate/directory

(通常,您想$HOME/bin存储自己的脚本)


嘿,谢谢您的回复。我尝试过了。现在,无需“ sh”命令即可运行它。但是我仍然必须在命令前面加上我不想使用的“ ./”。:)
拉米兹·侯赛因

5
查看有关路径的注释。您需要将脚本放在必须附加到PATH的目录中。
fge 2012年

2
就我而言,它不起作用。但source script.sh效果很好,或者说效果不错 source <filename_without_any_extension_type>
MycrofD

4
source ./my-cool-script(或. ./my-cool-script)将使用脚本中定义的任何变量来污染当前的shell会话。除非您要通过设置环境变量,更改目录等来显式修改Shell会话,否则不应使用源。否则,可能会导致真正可怕的错误,因为一个脚本执行中的变量(如果通过采购完成)可能会影响另一个脚本执行。
Daniel Waltrip

3
如果您确定脚本文件夹位于PATH中,但如果没有,该文件夹仍然无法使用./,则可能是名称冲突。尝试重命名。
1998年

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文件夹的权限。我正在使用大学计算机。
拉米兹·侯赛因

1
您能告诉我“来源您的启动脚本”是什么意思吗?
拉米兹·侯赛因

1
为启动脚本提供源代码意味着执行该脚本,以便外壳程序将新设置为PATH变量的参数提取出来。这可以通过做来完成. .bashrc。也就是说,只需在.其后跟space启动脚本名称即可。
jaypal singh

我不知道系统有什么问题。我创建了一个名为“ hello”的新shell脚本,其中只有一个“ echo”“ hello””。我更改了权限并尝试了./hello。它不起作用。它说
Rameez Hussain

您对启动脚本进行了哪些更改?
jaypal singh

20

只需确保使用即可执行chmod +x。默认情况下,当前目录不在您的PATH上,因此您将需要以./script.sh- 身份执行它,或者通过限定路径引用它。另外,如果您确实需要just script.sh,则需要将其添加到PATH中。(您可能无权修改系统路径,但是几乎可以肯定的是,您可以修改自己当前环境的PATH。)这还假定您的脚本以开头#!/bin/sh

您还可以使用别名,该别名与shell脚本并不真正相关,而仅与shell有关,并且很简单:

alias script.sh='sh script.sh'

这样一来,您就可以仅使用script.sh(从字面意义上讲-这不适用于任何其他*.sh文件)sh script.sh


嘿! 感谢您的回复。我尝试过使用别名。但是什么也没发生。我将其立即放在“#!/ usr / local / bin / bash”行之后。您认为错在哪里?
拉米兹·侯赛因

1
不能在脚本中定义别名-必须将其声明为当前环境的一部分。因此,只需alias在shell提示符下运行命令,然后别名即可用于运行命令。
ziesemer

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 '18

不需要sudo chmod您自己的文件。
人间

无需重新启动计算机。您最多应该再次采购
Luca Di Liello,

14

您必须启用程序的可执行位。

chmod +x script.sh

那你可以用 ./script.sh

您可以将文件夹添加到文件的PATH中.bashrc(位于主目录中)。将此行添加到文件末尾:

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

我忘了提到我已经设置了正确的权限。我使用了命令“ chmod 755 script.sh”
Rameez Hussain 2012年

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


这些答案中没有重述非常老的现有答案中的信息的部分感到困惑。
三胞胎

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. 然后以“ migrate”身份运行命令
[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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.