我想自动加在我的弓的pacman.conf的文件的存储源,但使用的echo
在我的shell脚本命令。 但是,它未能像这样: -
sudo echo "[archlinuxfr]" >> /etc/pacman.conf
sudo echo "Server = http://repo.archlinux.fr/\$arch" >> /etc/pacman.conf
sudo echo " " >> /etc/pacman.conf
-bash: /etc/pacman.conf: Permission denied
如果我更改通过做手工/etc/pacman.conf中使用vim,
sudo vim /etc/pacman.conf
并在quiting VIM有:wq
,一切工作正常,我的pacman.conf的已不被手动更新“权限被拒绝”的投诉。
为什么会这样? 而且我怎么sudo echo
工作? (顺便说一句,我尝试使用sudo cat
太多,但未能与拒绝权限以及)
问题是,重定向是由你原来的外壳处理,而不是由sudo
。 壳是不能够读出头脑,不知道该特定>>
意味着对sudo
,而不是它。
你需要:
- 引用重定向(所以它是在以传递
sudo)
- 并使用
sudo -s
(使sudo
使用外壳来处理引用重定向。)
作为@geekosaur解释,shell就重定向运行命令。 当你输入:
sudo foo >/some/file
您当前的shell进程,使自身的副本,首先尝试打开/some/file
写入,然后让该文件描述它的标准输出,然后才执行sudo
。
如果你被允许(sudoer CONFIGS经常使运行壳),你可以这样做:
sudo bash -c 'foo >/some/file'
但我发现,一般一个好的解决方案是使用| sudo tee
| sudo tee
代替>
和| sudo tee -a
| sudo tee -a
,而不是>>
。 这是特别有用,如果重定向是我所需要的唯一原因sudo
摆在首位; 毕竟,不必要正在运行的进程的根正是sudo
是为了避免。 运行echo
作为根仅仅是愚蠢的。
echo '[archlinuxfr]' | sudo tee -a /etc/pacman.conf >/dev/null
echo 'Server = http://repo.archlinux.fr/$arch' | sudo tee -a /etc/pacman.conf >/dev/null
echo ' ' | sudo tee -a /etc/pacman.conf >/dev/null
我加入> /dev/null
就完了,因为tee
将其输出到指定的文件和自己的标准同时输出,而且我不需要看到它我的终端上。 (该tee
就像在物理管道中的“T”型连接,这是它得名。命令行为)我切换到单引号( '
... '
),而不是双打( "
... "
),以便一切是文字,我并没有把一个反斜杠在前面$
在$arch
。
所以这需要写入使用文件作为根的护理sudo
。 现在对于在shell脚本的方式来输出包含换行符文本冗长的题外话。 :)
首先,你可以组所有的echo
的一起在一个子shell,所以你只需要做重定向一次:
(echo '[archlinuxfr]
echo 'Server = http://repo.archlinux.fr/$arch'
echo ' ') | sudo tee -a /etc/pacman.conf >/dev/null
或使用printf
替代echo
,这样你就可以直接嵌入到新行使用字符串\n
:
printf '[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n ' |
sudo tee -a /etc/pacman.conf >/dev/null
在bash
,你可以得到相同的结果echo -e
:
# BASH ONLY - NOT RECOMMENDED
echo -e '[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n ' |
sudo tee -a /etc/pacman.conf >/dev/null
但大多数炮弹将只输出-e
当你尝试,所以不推荐使用。
随着双方printf
和echo -e
,命令得到什么作为参数字符串包含AA反斜线后跟一个文字ñ无论你输入\n
,它的最高命令程序本身(代码里面printf
或echo
)翻译说成一个换行符。 在许多现代的炮弹,你必须使用ANSI的选项报价$'
...... '
,这将转化序列像\n
到文本换行命令程序曾经看到字符串,这意味着这样的字符串不与任何命令前工作:
echo $'[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n ' |
sudo tee -a /etc/pacman.conf >/dev/null
但是,虽然比更便携echo -e
,ANSI报价仍然是一个非POSIX扩展。
我的首选这样做的方法是使用此文档,避免了需要echo
或printf
全部:
sudo tee -a /etc/pacman.conf >/dev/null <<'EOF'
[archlinuxfr]
Server = http://repo.archlinux.fr/$arch
EOF
http://www.innovationsts.com/blog/?p=2758
由于指令不说清楚上面,我是使用来自博客文章的说明。 举例所以很容易地看到你需要做什么。
$ sudo的猫/root/example.txt | 的gzip> /root/example.gz
-bash:/root/example.gz:权限被拒绝
请注意,它在导致错误管道的第二个命令(gzip命令)。 这就是我们使用bash -c选项的技术的用武之地。
$ sudo的庆典-c“猫/root/example.txt | 的gzip> /root/example.gz”
$ sudo的LS /root/example.gz
/root/example.gz
我们可以看到形成ls命令的输出,该压缩文件创建成功。
第二种方法是类似之处在于我们传递命令字符串来砸第一,但我们正在通过sudo管道做。
$ sudo的RM /root/example.gz
$回声 “猫/root/example.txt |的gzip> /root/example.gz” | sudo的庆典
$ sudo的LS /root/example.gz
/root/example.gz
sudo bash -c 'echo "[archlinuxfr]" >> /etc/pacman.conf'
第1步创建在bash文件中的函数( write_pacman.sh
)
#!/bin/bash
function write_pacman {
tee -a /etc/pacman.conf > /dev/null << 'EOF'
[archlinuxfr]
Server = http://repo.archlinux.fr/\$arch
EOF
}
'EOF'
不会解释$arch
变量。
STE2源的bash文件
$ source write_pacman.sh
步骤3执行功能
$ write_pacman