What is /Dev/Null in Linux?
What is /Dev/Null in Linux?
https://www.geeksforgeeks.org/what-is-dev-null-in-linux/
所有物理设备对应的文件,放在dev目录下。
What is /dev?
In the Linux file system, everything is a file or a directory. Even devices are accessed as files. Your hard drive partitions, Pendrive, speakers, for all of these, there exists a file from which these are accessed. Now to understand how devices are accessed as files, think of it in this way: what do we do with a file? We read data from it and write data to it. A device like a speaker can input data to produce sound, a hard disk can be used to read and write data, a printer takes the input to print files, etc. Files and devices are similar in this way
/dev is a directory that stores all the physical and virtual devices of a Linux system. Physical devices are easy to understand, they are tangible devices like pen-drive, speakers, printers, etc. A Linux system also has virtual devices which act as a device but represent no physical device.
黑洞设备, 所有写入此设备的内容,都将消失。
What is /dev/null?
It is a virtual device, which has a special property: Any data written to /dev/null vanishes or disappears. Because of this characteristic, it is also called bitbucket or blackhole. Let us see a demonstration.
Redirect output to /dev/null
![]()
In this demo, you can see that we added some data, but that data was not stored. This particular characteristic of /dev/null has some use cases. Let’s see them.
主要用于丢弃输出, 删除文件并不常用。
Usage of /dev/null
Since it discards anything written to it, you can move files to /dev/null to delete them. But, this is not a widely used use case. It is mainly used to discard standard output and standard error from an output.
标准输出和标准错误。
What are standard output and standard error?
The output of a Linux command contains two streams of data: standard output (stdout) and standard error (stderr0), while the standard output is the normal output if the command has no errors, the standard error is the error generated by the command. Output may contain both standard output and standard input. Example of stdout and stderr:
Let’s run the following shell script
# /bin/sh ls apt update![]()
The first command ran successfully, but the second one generated errors. Since stdout and stderr are two separate data streams, they can be handled separately.
丢弃标准输出
丢弃标准错误
丢弃两者
How to access stderr and stdout?
Stdout and stderr are streams of data, both of which are treated as a file in Linux. If you wish to perform any action on these, you use a file descriptor that uniquely identifies the file stream. The file descriptor for stdout is 1 and for stderr is 2.
To access them separately, let’s see the following command which is performed on the same script file which was used in the previous example.
./script.sh 1>stdout.txt![]()
In this, you can see that the output contains standard errors but the standard output was not displayed. This is because the stdout stream was sent to the stdout.txt file, and you can see that the stdout.txt file contains the standard output.
While writing a shell script, we may want to discard the standard error from the output. Whatever stream we may want to suppress from the output, that stream of data can be written into /dev/null. You could write that data into another file, just like the above example, but if you have no use for that data, why would you want to waste memory on it, it’s better to discard it completely. Let’s see the following example
./script.sh 2>/dev/null![]()
And just like that, we have removed the stderr from the output. If you wish to discard the complete output, you can use the following command
command >/dev/null 2>&1The &> command redirects the output of the file descriptor which is mentioned on the left (in the above command, the output of 2) to the stream of file descriptor mentioned on the right-hand side. So, the output of stderr (2) gets redirected to stdout(1), which in turn gets written in /dev/null and thus gets destroyed.
![]()
调试日志控制
https://www.cnblogs.com/wanng/p/shell-dev-null.html
在脚本中,为了方便调试,经常会加一些日志打印的逻辑,有时这种调试日志还比较多,脚本测试通过之后,这些调试日志可能就删除或者注释掉了
这里提供一个小技巧,既不用删除也不用注释掉日志,同时执行脚本的时候还不会输出这些调试日志
比如: 当前目录有一个日志文件
log.txt
,脚本的调试日志会以echo " this is debug log" >> log.txt
的形式写入这个文件中现在脚本功能测试通过了,调试日志不需要写入
log.txt
了可以这么做:原来的脚本原样不动,本地先删除
log.txt
,然后执行ln -s /dev/null ./log.txt
命令,该命令建立了一个log.txt
到/dev/nulll
的软连接,以后都有写入log.txt
的内容实际都会写入/dev/null
,而写入/dev/null
的所有内容都会被丢弃掉如果后面需要再次调试脚本,删除链接即可
判断命令是否存在
https://blog.csdn.net/inthat/article/details/124699933
#!/bin/bash # fast fail. set -eo pipefail SHELLCHECK_VERSION=0.7.1 INSTALL_DIR="${HOME}/bin/" mkdir -p "$INSTALL_DIR" || true function install_shellcheck { if ! command -v shellcheck &> /dev/null; then MACHINE=$(uname -m); TMPFILE=$(mktemp) rm "$TMPFILE" mkdir -p "$TMPFILE"/ curl -L -o "$TMPFILE"/out.xz "https://github.com/koalaman/shellcheck/releases/download/v${SHELLCHECK_VERSION}/shellcheck-v${SHELLCHECK_VERSION}.$(uname -s | tr '[:upper:]' '[:lower:]').${MACHINE}.tar.xz" tar -xf "$TMPFILE"/out.xz -C "$TMPFILE"/ cp "${TMPFILE}/shellcheck-v${SHELLCHECK_VERSION}/shellcheck" "${INSTALL_DIR}/shellcheck" rm -rf "$TMPFILE" chmod +x "${INSTALL_DIR}"/shellcheck fi } install_shellcheck
/dev/null不应该用于清空文件
https://askubuntu.com/questions/435866/why-is-moving-directories-to-dev-null-dangerous
$ echo "this is my file" > test $ cat test this is my file $ sudo mv test /dev/null $ cat /dev/null this is my file # Fix this! $ sudo rm /dev/null $ sudo mknod -m 0666 /dev/null c 1 3
How do I completely silence a cronjob to /dev/null/?
* * * * * root /usr/local/sbin/mycommand.sh > /dev/null 2>&1