我已经看到过很多关于这个问题的答案,但是现在没有一个是有效的。
现在,我正在学习 bash 脚本,但是每当我编写 shell 脚本时,我都必须手动去将其权限更改为可执行,然后才能尝试。
我必须使用类似
chmod 755 <script.sh>
每次我创建一个新脚本时。
我已经尝试申请
chmod g+rwxs <directory>
在父目录中,但它不起作用。有什么解决办法吗?
我不希望解决方案是 umask,因为我只想要它用于这个目录,而不是用于整个创建新文件的过程。
答案1
首先,恕我直言,权限系统是为了保护你而存在的,最好学会喜欢它。但是,如果你真的想打败它,下面就是方法。打开某个终端并运行以下命令:
inotifywait -m "$HOME/bin" -e close_write -e moved_to --format '%w%f' | while read -r fname; do chmod +x "$fname"; done
或者,对于那些喜欢将命令分布在多行中的人来说:
inotifywait -m "$HOME/bin" -e close_write -e moved_to --format '%w%f' |
while read -r fname
do
chmod +x "$fname"
done
此命令将为在您的$HOME/bin
目录(或您选择的任何其他目录)中创建或移动到的每个文件添加执行权限。
如果您的系统尚未安装inotifywait
,您可能需要使用以下命令进行安装:
apt-get install inotify-tools
怎么运行的
inotifywait -m "$HOME/bin" -e close_write -e moved_to --format '%w%f'
此命令监视目录
$HOME/bin
。每当将文件移动到该目录(moved_to
)或在该目录中写入和关闭文件(close_write
)时,该命令都会将文件路径和名称写入 stdout。(这里的弱点是
inotifywait
不支持 NUL 分隔的输出。因此,如果您的文件名包含换行符,则该脚本将不起作用。)|
这导致管道启动后,它将的标准输出发送
inotifywait
到下一个命令的标准输入。while read -r fname; do
这将启动一个循环,从 stdin 读取行并将它们分配给变量
fname
。chmod +x "$fname"
这会将执行位添加到文件
$fname
。如果您希望系统上的其他用户能够运行命令,您可以将其更改为。或者,如果您确实想要,chmod a+x "$fname"
也可以将其更改为。chmod 755 "$fname"
done
这标志着循环的结束。
答案2
您可以使用以下方式执行脚本
bash <the script> <args> <to> <the> <script>
或者即使你已经在运行 bash 并且不介意残留变量:
. <the script> <args> <to> <the> <script>`
(因为bash
它本身并不关心执行标志,它只由查看“shebang”的相同加载器检查以确定如何运行脚本)。