shell 重定向 2>&1 2>/dev/null 理解笔记

// 函数  输入输出重定向    

1、函数     
  
function hello(){  
  echo '1111'  
} 

------- 

hello  

hello(){     // function 可以省略    
  echo '2222'  
}     

hello     

-------

hello(){
  return 11
}

hello
echo $? // 获取函数返回的值   

-------

function hello(){    
  echo $1    
  echo $2    
  echo $3     
  echo "第十个参数${10}"     
  echo "参数个数${#}"      
  echo "输出所有参数${*}"     
  echo "输出所有参数${@}"     
}     

hello 1 2 3 4 5    

-------  

2、输入输出重定向     

> 
>>
< 输入重定向
<< 

cat < ./1.txt // 把1.txt的内容截取出来     


标准输入文件(stdin) 0    
标准输出文件(stdout) 1     
标准错误文件(stderr) 2    


重定向解释:
2>&1    // 标准错误输出重定向到标准输出     
/dev/null // 空设备 相当于一个黑洞 吞噬一切信息       

// 标准输出  
echo 123 > ./1.txt 等同于 echo 123 1> ./1.txt  

// 标准错误输出 
echo 123 2> ./1.txt  把标准错误输出重定向到1.txt    
 
./2.sh    
hello   // hello 会报错 走标准错误输出   
date

./2.sh > 1.txt   // 会看到报错直接在终端上显示,未输出到1.txt,因为这里是标准输出,没有写标准错误输出重定向到1.txt   

./2.sh 1> 1.txt 2> ./1.txt 这样就把标准错误输出到了1.txt  
 但是有个问题,这个写法相当于,打开了两次1.txt, 标准输出被标准错误输出给覆盖了    
 
./2.sh 1> 1.txt 2>&1   // >& 相当于对后面1即标准输出的引用,然后这句话的意思是标准输出重定向到1.txt,标准错误输出也重定向到1.txt,因此 ./1.txt里会显示

./2.sh:行1: t: 未找到命令    
2019年 03月 30日 星期六 15:29:38 CST  

./2.sh 1> 1.txt 2>/dev/null  // 这里标准输出重定向到1.txt, 标准错误输出重定向到空设备,即不输出错误信息,这时./1.txt里会显示    
2019年 03月 30日 星期六 15:40:58 CST       
          

3、文件引用   

source ./xx.sh   或者 .  ./1.sh   

  

原文地址:https://www.cnblogs.com/leyi/p/10627590.html