在Linux中创建可执行文件

43

我计划做的一件事就是编写(非常简单的)Perl脚本,并且希望能够在不从终端显式调用Perl的情况下运行它们。我知道,要做到这一点,我需要授予它们执行权限。使用chmod做到这一点很容易,但这似乎也是一个有点繁琐的额外步骤。我想要的是以下两种情况之一:

首先,有没有一种方法可以在保存文件时设置执行标志?目前我正在尝试使用gedit和geany,但如果其他同样(或更好)功能的编辑器具备此功能,我也可以考虑切换。

如果没法实现第一种情况,那么是否有一种方法可以声明在特定目录中创建的所有文件都应该具有执行权限呢?

我的umask设置为022,按照我的理解应该没问题,但是看起来这些文件被创建为文本文件(默认权限为666),而不是可执行文件(默认权限为777)。

也许我只是有点懒,但我认为必须有比每次创建新脚本都要进行chmod更方便的方法。


你必须打印每个文件的输出。你必须导入每个文件正确的库。这似乎是编程过程中的另一个步骤,而且绕过它是很危险的。 - Jacqlyn
5个回答

87

将文件设为可执行:

chmod +x file

查找perl的位置:

which perl

这应该会返回类似于以下内容:

/bin/perl sometimes /usr/local/bin

然后在您的脚本的第一行添加:

#!"path"/perl,其中"path"是上面的路径,例如:

#!/bin/perl

然后您就可以执行该文件了:

./file

可能会出现一些PATH的问题,因此您可能还需要更改它...


谢谢,但那不是我的问题。我已经养成了以 #!/usr/bin/perl 开始我的脚本的习惯。一旦我给它们可执行权限,我就可以正常运行脚本;我只是在寻找更简单的方法。 - user100246
13
我建议您改用 #!/usr/bin/env perlenv 命令会在 PATH 中查找给定的参数(在本例中是 "perl"),然后运行它。当您需要将脚本发送给其他人时,这很有用 - 例如,我使用 Mac,而 Perl 位于 /opt/local/bin 中。 - Samir Talwar

6
不需要入侵您的编辑器或更换编辑器。
相反,我们可以编写一个脚本来监视您的开发目录并在创建文件时更改文件权限。这就是我在附加的bash脚本中所做的。您可能需要阅读注释并根据需要编辑“config”部分,然后建议将其放在$HOME/bin/目录中,并将其执行添加到$HOME/.login或类似文件中。或者您可以直接从终端运行它。
此脚本需要inotifywait,Ubuntu上的inotify-tools包中提供。
sudo apt-get install inotify-tools

欢迎提出建议/修改/改进意见。
#!/usr/bin/env bash

# --- usage --- #
# Depends: 'inotifywait' available in inotify-tools on Ubuntu
# 
# Edit the 'config' section below to reflect your working directory, WORK_DIR,
# and your watched directories, WATCH_DIR. Each directory in WATCH_DIR will
# be logged by inotify and this script will 'chmod +x' any new files created
# therein. If SUBDIRS is 'TRUE' this script will watch WATCH_DIRS recursively.
# I recommend adding this script to your $HOME/.login or similar to have it
# run whenever you log into a shell, eg 'echo "watchdirs.sh &" >> ~/.login'.
# This script will only allow one instance of itself to run at a time.

# --- config --- #

WORK_DIR="$HOME/path/to/devel" # top working directory (for cleanliness?)
WATCH_DIRS=" \
    $WORK_DIR/dirA \
    $WORK_DIR/dirC \
    "                          # list of directories to watch
SUBDIRS="TRUE"                 # watch subdirectories too
NOTIFY_ARGS="-e create -q"     # watch for create events, non-verbose


# --- script starts here --- #
# probably don't need to edit beyond this point

# kill all previous instances of myself
SCRIPT="bash.*`basename $0`"
MATCHES=`ps ax | egrep $SCRIPT | grep -v grep | awk '{print $1}' | grep -v $$`
kill $MATCHES >& /dev/null

# set recursive notifications (for subdirectories)
if [ "$SUBDIRS" = "TRUE" ] ; then
    RECURSE="-r"
else
    RECURSE=""
fi

while true ; do
    # grab an event
    EVENT=`inotifywait $RECURSE $NOTIFY_ARGS $WATCH_DIRS`

    # parse the event into DIR, TAGS, FILE
    OLDIFS=$IFS ; IFS=" " ; set -- $EVENT
    E_DIR=$1
    E_TAGS=$2
    E_FILE=$3
    IFS=$OLDIFS

    # skip if it's not a file event or already executable (unlikely)
    if [ ! -f "$E_DIR$E_FILE" ] || [ -x "$E_DIR$E_FILE" ] ; then
        continue
    fi

    # set file executable
    chmod +x $E_DIR$E_FILE
done

在目录上设置umask会更简单吧? - Olivier Lalonde

4
您所描述的是处理此问题的正确方法。
您说您想要保持在GUI中。您通常可以通过文件属性菜单设置执行位。如果您有兴趣,您还可以学习如何为上下文菜单创建自定义操作来执行此操作。当然,这取决于您的桌面环境。
如果您使用更高级的编辑器,则可以编写脚本使其在保存文件时执行操作。例如(我只熟悉vim),您可以将以下内容添加到您的.vimrc中,以使任何以“#!/*/bin/*”开头的新文件可执行。
au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent !chmod +x <afile> | endif | endif

使用这个技巧时,我遇到了这里提到的问题:https://bbs.archlinux.org/viewtopic.php?id=126304因此,现在我正在使用稍微修改过的版本 autocmd BufWritePost * if getline(1) =~ "^#!/bin/" | silent execute "!chmod a+x <afile>" | endif - Gautam

2
这并不是什么大问题。您可以编写一个只包含单个命令的脚本来解决它:
chmod a+x *.pl

创建一个 Perl 文件后,运行脚本。或者可以使用以下命令打开文件:
touch filename.pl && chmod a+x filename.pl && vi filename.pl # choose your favorite editor

我更多地是在寻找一种将所有操作都放在GUI中完成的方法,但也许这是不可能的。这是出于安全方面的考虑吗? - user100246
是的,这是一个安全问题。如果shell默认将所有内容都设置为可执行文件,那将会是一个巨大的问题。 - JimB
你可以编写一个简单的程序来为你完成这个任务。但说实话,在UNIX环境下编程的人很少会尝试做这样的事情。 - BobbyShaftoe

0

我认为你遇到的问题是,尽管你可以在系统中设置自己的umask值,但这并不允许你明确控制gedit(或其他编辑器)对新文件设置的默认权限。

我相信这个细节是硬编码到gedit和大多数其他编辑器中的。你改变它的选项有两个:(a)修改gedit的模块或(b)找一个允许你设置新文件默认权限偏好的文本编辑器。(抱歉,我不知道有哪些。)

考虑到这一点,需要通过chmod来更改文件权限也不是那么糟糕,对吧?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接