目录中 Linux 文件的自动/默认权限

目录中 Linux 文件的自动/默认权限

我已经看到过很多关于这个问题的答案,但是现在没有一个是有效的。

现在,我正在学习 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”的相同加载器检查以确定如何运行脚本)。

相关内容