我如何运行一个shell脚本而不使用"或“;bash"命令吗?

我有一个shell脚本,我想在不使用“sh”或“bash”命令的情况下运行。例如:

而不是:sh script.sh

我想使用:script.sh

我该怎么做呢?

P.S. (i)我不太使用shell脚本,我试着阅读关于别名的内容,但我不知道如何使用它们。

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

621639 次浏览

只要确保它是可执行的,使用chmod +x。默认情况下,当前目录不在你的PATH上,所以你需要作为./script.sh执行它——或者以其他方式通过限定路径引用它。或者,如果你真的只需要script.sh,你需要将它添加到你的PATH中。(您可能没有权限修改系统路径,但几乎可以修改您自己当前环境的path。)这也假设你的脚本以#!/bin/sh开头。

你也可以使用别名,它与shell脚本无关,只是与shell相关,简单如下:

alias script.sh='sh script.sh'

这将允许您只使用script.sh(字面上-这将不适用于任何其他*.sh文件)而不是sh script.sh

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

chmod +x script.sh

然后你可以使用./script.sh

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

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

在文件顶部添加一个“shebang”:

#!/bin/bash

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

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

export PATH=$PATH:/appropriate/directory

(通常,你需要$HOME/bin来存储你自己的脚本)

这些是直接使用脚本名称的先决条件:

  1. 在最顶部添加shebang行(#!/bin/bash)。
  2. 使用chmod u+x scriptname使脚本可执行(其中scriptname是脚本的名称)。
  3. 将脚本放在/usr/local/bin文件夹下。
    • 注意:我建议将它放在/usr/local/bin下,因为很可能该路径已经添加到你的PATH变量中。
  4. 只使用脚本名称scriptname运行脚本。

如果你无法访问/usr/local/bin,那么执行以下操作:

  1. 在你的主目录中创建一个文件夹,并将其命名为bin

  2. 在你的主目录上执行ls -lA,以识别你的shell正在使用的启动脚本。它应该是.profile.bashrc

  3. 一旦你确定了启动脚本,添加以下一行:

    PATH="$PATH:$HOME/bin"
    
  4. 一旦添加,源启动脚本或注销并重新登录。

    对于source,将.后跟空格,然后是启动脚本名称,例如. .profile. .bashrc

  5. 仅使用脚本名称scriptname运行脚本。

< p > Add。(当前目录)到你的PATH变量 你可以通过编辑你的.profile文件来做到这一点 在.profile文件
中放入以下一行 PATH=$PATH:.

只要确保在脚本的开头添加Shebang (#!/bin/bash)行,并使脚本可执行(使用chmod +x <File Name>)

你可以输入sudo install(脚本的名称)/usr/local/bin/(你想输入什么来执行脚本)

< p >交货:sudo install quickcommit.sh /usr/local/bin/quickcommit Enter password

.输入密码

现在不需要.sh就可以在任何目录下运行

以下是我的备份脚本,将给你的想法和自动化:

服务器: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在您的路径中)

在本例中,文件名为myShell

首先,我们需要创建这个文件,我们可以输入以下内容:

sudo nano myShell
注意我们没有放入.sh扩展名? 这是因为当我们从终端运行它时,我们只需要键入myShell来运行我们的命令!< / p >

现在,在纳米的顶部行必须#!/bin/bash,然后你可以离开一个新的行继续。

为了演示,我将添加一个基本的Hello World!响应

所以,我输入以下内容:

echo Hello World!

之后,我的例子应该是这样的:

#!/bin/bash
echo Hello World!

现在保存文件,然后运行这个命令:

chmod +x myShell

现在我们已经使文件可执行,我们可以通过使用以下命令将其移动到/usr/bin/:

sudo cp myShell /usr/bin/

恭喜!我们的命令现在完成了!在终端中,我们可以输入myShell,它应该是Hello World!

在脚本前输入"#!/bin/sh"。 然后将其保存为script.sh。 将其复制到$HOME/bin$HOME/usr/bin
目录在不同的linux发行版上可能不同,但它们以'bin'结尾,并且位于主目录中 cd $HOME/bin$HOME/usr/bin
类型chmod 700 script.sh < br > 你可以通过在终端上输入run.sh来运行它。 如果它不工作,尝试chmod +x run.sh代替chmod 700 run.sh

只是:

/path/to/file/my_script.sh

使任何文件作为可执行文件


假设你有一个名为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
  1. 通过使用文件的属性使脚本文件成为可执行文件
  2. 在~/.bashrc中为可执行文件创建别名。alias <alias namme> = <full script file path>'
  3. 刷新用户会话以应用它。source ~/.bashrc

只是补充一下大家的建议。即使有了这些解决方案,如果用户希望以sudo的方式执行脚本,问题仍然会存在

< p >的例子: Chmod a+x /tmp/myscript.sh Sudo ln -s /tmp/myscript.sh /usr/local/bin/myscript

输入myscript可以工作,但输入sudo myscript将返回命令未找到。

作为sudo,你仍然必须键入sudo sh myscript或sudo bash myscript。

我想不出解决办法。