当您尝试在没有写入权限的情况下修改文件时,您会收到错误消息:
> touch /tmp/foo && sudo chown root /tmp/foo
> echo test > /tmp/foo
zsh: permission denied: /tmp/foo
Run Code Online (Sandbox Code Playgroud)
Sudoing 没有帮助,因为它以 root 身份运行命令,但 shell 处理重定向 stdout 并以您的方式打开文件:
> sudo echo test > /tmp/foo
zsh: permission denied: /tmp/foo
Run Code Online (Sandbox Code Playgroud)
除了以root身份打开shell并以这种方式操作文件之外,是否有一种简单的方法可以将stdout重定向到您无权写入的文件?
> sudo su
# echo test > /tmp/foo
Run Code Online (Sandbox Code Playgroud) 我知道您可以创建一个文件描述符并将输出重定向到它。例如
exec 3<> /tmp/foo # open fd 3.
echo a >&3 # write to it
exec 3>&- # close fd 3.
Run Code Online (Sandbox Code Playgroud)
但是你可以在没有文件描述符的情况下做同样的事情:
FILE=/tmp/foo
echo a > "$FILE"
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个很好的例子,说明何时必须使用额外的文件描述符。
好的。如果我想将程序的输出重定向到文件,我会做这样的事情
prog > file
Run Code Online (Sandbox Code Playgroud)
如果我想将 stdout 和 stderr 都重定向到该文件,那么我会这样做
prog > file 2>&1
Run Code Online (Sandbox Code Playgroud)
如果您希望输出转到文件,这一切都很好。但是,如果您希望输出转到文件但仍然转到 stdout/stderr 怎么办?因此,输出保存在文件中,但您仍然可以在程序运行时在控制台上看到它。有没有办法做到这一点?如果是这样,如何?
我运行以下命令:
tar cvf ~/data.tar /home/user/data/
Run Code Online (Sandbox Code Playgroud)
它在屏幕上显示了很多文件名,10 分钟后我看到:
tar:由于先前的错误而以失败状态退出
我在哪里可以看到 tar 的错误日志(是否在 下/var/log
)。我可以看到 tarred 版本和原始版本之间有 100 Mb 的差异。我想知道新创建的存档中丢失文件的名称。
du -sh data.tar /home/user/data
5.7G data.tar
5.8G /home/user/data
Run Code Online (Sandbox Code Playgroud)
使用 GNU tar 1.27.1
我想知道是否有人知道如何将 GCC 的编译警告放在文本文件中?
例如 :
我(心甘情愿地)写了一个未定义的函数foo()
。所以 gcc 告诉我:
warning: implicit declaration of function 'foo [Wimplicit-function-declaration]
Run Code Online (Sandbox Code Playgroud)
我怎样才能把这一行写在一个文本文件中?我在 gcc 的手册页中搜索一个选项:
https://linux.die.net/man/1/gcc
但没有找到任何相关信息。我尝试的命令echo
,并tee
要做到这一点,但这些命令只赶上编译行(如:... gcc -o test test.o main.o ...
)