【问题标题】:Execute bash and sh file on Mac without writing extension在 Mac 上执行 bash 和 sh 文件而不写扩展名
【发布时间】:2016-02-29 08:14:58
【问题描述】:

我有一个.sh 文件,我想在不编写扩展名的情况下从 shell 执行它。 我做了什么:

  • 我创建了一个目录并将其添加到 $PATH
  • 我给了 file.sh chmod 711
  • 并且该文件包含#!/bin/sh(我也尝试过 bash)。

但是,当我尝试在没有 sh 的情况下执行 myscript 时,我得到 command not found 如果我尝试使用myscript.sh,我会得到正确的结果。

我该怎么办?

我也读过:How to run a shell script on a Unix console or Mac terminal?executing shell script without calling sh implicitly 但没有解决方案

ls -l 的结果

ls -l /Users/Mitro/scripts
total 8
-rwx--x--x  1 Mitro  staff  22 Nov 26 10:25 myscript.sh

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/Mitro/scripts

【问题讨论】:

  • 您正在尝试的确切命令是什么?不清楚你的意思。
  • 我写了一个 sh 文件,只写了一个回显,我想通过输入 myscript 而不是 nmp.sh 来执行它
  • 权限应该是755,这样每个人都有读取和执行权限。在无法从磁盘读取文件的情况下授予某人执行权限并没有多大好处。

标签: linux macos bash shell unix


【解决方案1】:

两个问题...

首先,file 已经是/usr/bin 中的一个可执行程序,它告诉您文件的类型——即它是图像、歌曲还是数据库。快速示例:

file a.png
a.png: PNG image data, 1 x 1, 1-bit colormap, non-interlaced

所以,file 对于 shell 脚本来说是个坏名字 - 同样是 test

其次,如果您想在当前目录中执行脚本或程序,也称为点 (.),您需要在您的 PATH 中添加点,或者您需要明确告诉您的 shell您要运行的文件在当前目录中。更简单的选项是第二个,这意味着如果您的脚本名为 fred,您可以使用

./fred

告诉shell它在你的当前目录中。

如果您希望始终能够在当前目录中运行脚本,更长的选项是将点添加到您的 PATH 中。因此,您找到您的登录脚本(可能是 $HOME/.profile)并找到设置您的 PATH 的行并将当前目录添加到其中。

export PATH=$PATH:.

设置好之后,最好退出并重新登录以使其生效。

有些人不赞成在他们的 PATH 中添加点的想法——我不赞成。 YMMV。

【讨论】:

  • 名称文件只是一个例子,有歧义见谅
  • 好的,请点击您的问题下方的edit 并粘贴ls -l /full/path/to/your/script 的输出以及echo $PATH 的输出以及您尝试取消的exact 命令.
  • 好的。如果你想通过在终端中输入myscript 来运行脚本,你需要重命名脚本,像这样cd /Users/Mitro/scripts; mv myscript.sh myscript 然后,因为你已经改变了名字,你需要告诉你的shell使用重建它的命令列表hash -r然后你可以用myscript运行它。
  • 谢谢你,这项工作。我认为有必要进行扩展。但是我没有使用hash -r,这个命令到底应该做什么?
  • 它会查看您的PATH 中列出的所有目录,并在内存中列出您PATH 上的所有可执行程序。然后,当您键入任何命令时,它不必(在磁盘上)查看您的 PATH 中的所有目录,因为它已经“知道”所有程序在哪里。
【解决方案2】:

您可以添加别名。如果您有 /some/path/to/script.py,请执行以下操作:

alias my_script='/some/path/to/my_script.py'

现在当你输入my_script,你的脚本就会被执行。

【讨论】:

    【解决方案3】:

    对于 mac,配置文件是 ~/.bash_profile 而不是 ~/.profile,后者不起作用。

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 1970-01-01
      • 2017-08-30
      • 2017-09-22
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      相关资源
      最近更新 更多