有没有办法像这样切换上下文?
在我的特定情况下,脚本是安装程序 postinstall 脚本,它仅需要对某些任务具有 sudo 权限,并且需要登录用户在脚本末尾执行 LaunchAgent。
如果此代理以 sudo 权限启动,则用户特定(放置在用户目录中)的日志和其他资源的路径会变得混乱。
我可以轻松地将 bash 脚本的标准输出和错误输出重定向到文件,同时使用简单的exec语句将输出丢弃到控制台:
exec &>>/var/log/backup.log
Run Code Online (Sandbox Code Playgroud)
但是我如何使用exec写入两个文件,附加到第一个并重写第二个?可能tee应该使用一些魔法。还应该找到一些使控制台静音的方法。
这样做的原因是我的备份脚本。我想将最新备份的事件附加到主日志中,并且只将这些事件写入当前备份日志(清除其以前的内容),每个备份会话都应该重写这些事件。
当我们对当前进程进行 fork 时,我们作为父进程的进程会生成具有相同特征但进程 ID 不同的子进程。所以在那之后,当我们在我们的子进程中执行 exec() 时,进程停止执行,并且我们在停止的子进程中执行的程序现在有了自己的进程。
这与我们运行应用程序时每个应用程序都有自己的进程和 PID 时不一样吗?
因为默认创建的文件具有 666 的权限并且umask(以权限位形式)从该权限中逐位减去,我们可以做一些事情来授予execute权限而不使用权限字符 (r,w,x) 吗?
我指的是使用按位掩码,例如
umask 002
Run Code Online (Sandbox Code Playgroud)
未设置权限字符,例如
umask u+x
umask u=rwx
Run Code Online (Sandbox Code Playgroud) 为什么这不可能,最好的方法是什么:
#!/bin/sh
desc=5; file=/etc/passwd
exec "$desc"<"$file" #the variable filedescriptor is the problem
Run Code Online (Sandbox Code Playgroud)
我宁愿不要eval。
我正在尝试运行一个简单的 C 程序。
#include <stdio.h>
#include <unistd.h>
extern char** environ;
int main(){
// execl("/bin/sh","sh","-c","/bin/ls -l",(char *) NULL);
char* argv[] = {"/bin/sh","sh","-c","/bin/ls", (char*) NULL};
execve(argv[0], argv, environ);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注释掉的 execl 运行良好。但是当我尝试对 execve 执行相同操作时,编译器会调用以下错误:
/bin/sh: 0: Can't open sh
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?
#!/bin/bash
echo 123456789 > out.txt
exec 3<> out.txt
read -n 4 <&3
echo -n 5 >&3
exec 3>&-
Run Code Online (Sandbox Code Playgroud)
面试笔试,被问到脚本末尾out.txt的内容。我确实运行了脚本后记,它给了我123456789. 但是我不知道脚本中发生了什么,尤其是带有 exec 语句的部分。我查找了联机帮助页和谷歌搜索结果,exec但找不到任何相关内容3<>。精通shell脚本的人可以解释这里发生了什么吗?
我想find对一些嵌套的 csv 文件的结果运行两个管道命令,但我很惨地失败了。
这是一个想法:
$ find ./tmp/*/ -name '*.csv' -exec tail -n +2 {} | wc -l \;
Run Code Online (Sandbox Code Playgroud)
为了不计算每个 CSV 文件的标题行。
该命令失败:
wc: ';': No such file or directory
find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)
for在这种情况下我真的需要做一个循环吗?
例如:
wc: ';': No such file or directory
find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)
但是这样我就失去了很好的输出,find其中确实包括计数中的文件名。
使用此解决方案时,我也丢失了文件名:find -exec 中的管道命令?
$ for f in ./tmp/*/*.csv; do tail -n +2 ${f} | wc -l; done
Run Code Online (Sandbox Code Playgroud)
一点精度;当我谈到打印的文件名时,这是因为我在单个文件上调用命令时习惯了以下结果:
$ tail -n +2 | …Run Code Online (Sandbox Code Playgroud) 在脚本中,我有一长串打印到标准输出的命令。我想隐藏所有输出。因此,我没有重定向每个命令,而是将
exec >/dev/null
Run Code Online (Sandbox Code Playgroud)
一开始。
我必须使用哪些选项来“暂时忽略”一般重定向并echo在实际打印到标准输出之间进行一次调用?