如何使用单个命令(de)从命令行激活PPA?

Ubuntu提供了一个简单的GUI界面 ,允许您编辑,(取消)激活和删除PPA。

但是,浏览所有GUI对话框和菜单有时会很繁琐,特别是如果你的系统中添加了很多PPA。

这就是为什么我想知道是否有办法从命令行禁用(和启用)PPA。


注意 :我不是在谈论添加/删除PPA(这很容易做到: sudo add-apt-repository ppa / sudo add-apt-repository --remove ppa )。 我正在寻找的是暂时禁用PPA并随意重新启用它的方法 – 所有这些都来自CLI。


编辑:

Sushantp606和戴维森蔡的答案是一个很好的起点,让我改变了我的问题的范围。 知道可以使用sources.list文件管理存储库当然很好,但这对我来说仍然是一项非常繁琐的任务。 我很想知道是否有一种方法可以像软件属性窗口那样自动执行此操作。

理想情况下,我想找到一个命令,可以通过其PPA地址快速启用和禁用PPA,例如:

 ppa_activate ppa:synapse-core/ppa 

 ppa_deactivate ppa:synapse-core/ppa 

甚至更简单的脚本可以在激活或停用特定ppa之间切换。 将下面给出的代码保存在文件中,例如toggle_ppa.sh

 #!/bin/bash # # toggle_ppa.sh # # created by souravc (https://askubuntu.com/users/127327/) # modified by Glutanimate (https://askubuntu.com/users/81372/) # # originally released at https://askubuntu.com/q/383605/81372 # # DESCRIPTION: Detects if a PPA is active/inactive and deactivates/activates it # on user confirmation. # # USAGE: toggle_ppa.sh ppa:launchpaduser/ppaname ### VARIABLES SOURCEDIRECTORY=/etc/apt/sources.list.d PPA="$1" ### USAGE CHECKS ## Arguments if [ -z "$PPA" ] then echo "Error: Please provide a PPA name to toggle between activation/deactivation" echo "The PPA name should be formatted as it appears on launchpad, eg: "$0" ppa:webupd8team/y-ppa-manager" exit 1 fi ## Root privileges if [ "$(whoami)" != "root" ]; then echo "Error: This script needs root privileges. Restarting..." sudo "$0" "$1" exit fi ### MAIN SOURCELIST_NOPFX="${PPA#*:}" #remove 'ppa:' prefix SOURCELIST="${SOURCELIST_NOPFX////-}"-$(lsb_release -cs) #replace all slashes with dashes, include release SOURCEFILE="$SOURCEDIRECTORY"/"$SOURCELIST".list #compose sources list path if [ -e "$SOURCEFILE" ] then echo "Processing $SOURCEFILE..." SOURCE_COMMENTED=$(grep "^\#deb\ " "$SOURCEFILE") #check if sources line is commented if [ -z "$SOURCE_COMMENTED" ] then echo "$PPA is active. Going to deactivate. Proceed? [ y/n ]" read ANSWER if [ $ANSWER == "y" ] then sed -i "s/^deb\-src/\#deb\-src/" $SOURCEFILE sed -i "s/^deb\ http/\#deb\ http/" $SOURCEFILE echo "Updating package index files..." sudo apt-get update echo "Done." else echo "Aborted." exit 0 fi else echo "$PPA is inactive. Going to activate. Proceed? [ y/n ]" read ANSWER if [ $ANSWER == "y" ] then sed -i "s/^\#deb\-src/deb\-src/" $SOURCEFILE sed -i "s/^\#deb\ http/deb\ http/" $SOURCEFILE echo "Updating package index files..." sudo apt-get update echo "Done." else echo "Aborted." exit 0 fi fi else echo "Error: Source file at $SOURCEFILE for $PPA does not exist. Please check PPA name." exit 0 fi 

按照另一个答案中给出的步骤将文件保存在PATH中并使其可执行。

用法

 sudo toggle_ppa.sh  

 sudo toggle_ppa.sh ppa:webupd8team/java 

这个怎么运作

该代码的工作原理与我的其他答案相同 。 代码以非常交互的方式运行。 当有人以ppa name作为参数运行时,它将显示PPA的当前状态以及代码在成功执行时要执行的操作。 然后它会询问用户的许可。 仅当用户输入'y'确认代码时才会更改PPA的状态并激活/取消激活。 如果用户将'n''n' ,它将立即中止。

ppa info实际上保存在/etc/apt/sources.list中的单独文件中。 这是代码,它将执行所需的操作以取消激活或激活所需的repo。 将下面给出的代码保存在一个文件中,比如mod-ppa

 #!/bin/bash mydir=/etc/apt/sources.list.d function getlist(){ echo -e "\n\tchose one of the following lists" echo -e "\t================================" for itm in `seq 1 $1` do echo -e "\t`echo $2 | awk -vx=$itm '{print $x}' | awk -F/ '{print $NF}'`" done } if [ $# -lt 1 ] then echo "E: mod_ppa: missing operand" echo "Try 'mod_ppa --help' for more information." exit 0 elif [ $# -lt 2 ] then echo -e "E: syntax error,\nTry 'mod_ppa --help' for more information." exit 0 fi case "$1" in -d ) ppa=`ls $mydir/$2*.list` num=`echo $ppa | wc -w` if [ `echo $num` -gt 1 ] then getlist "$num" "$ppa" else if [ -e $mydir/$2*.list ] then sed -i "s/^deb\-src/\#deb\-src/" $ppa sed -i "s/^deb\ http/\#deb\ http/" $ppa else echo "E: ppa does not exist/check ppa name" fi fi ;; -a ) ppa=`ls $mydir/$2*.list` num=`echo $ppa | wc -w` if [ `echo $num` -gt 1 ] then getlist "$num" "$ppa" else if [ -e $mydir/$2*.list ] then sed -i "s/^\#deb\-src/deb\-src/" $ppa sed -i "s/^\#deb\ http/deb\ http/" $ppa else echo "E: ppa does not exist/check ppa name" fi fi ;; --help) echo "Usage: mod_ppa [OPTION] [PPA NAME'S INITIAL PART]" echo "Mandatory argument options." echo "-a Activate certain ppa" echo "-d Deactivate certain ppa" ;; * ) echo "mod_ppa: invalid option '$1'" echo "Try 'mod_ppa --help' for more information." ;; esac 

将脚本保存在/home//bin/ ,通常位于PATH中。 检查写入终端

 echo $PATH 

如果没有,请将/home//bin/添加到PATH,方法是.bash_profile下行添加到.bash_profile.bashrc

 export PATH=$PATH:$HOME/bin 

然后获取文件,写入终端

 source .bash_profile [or source .bashrc] 

mod_ppa执行权限,写入终端

 chmod +x mod_ppa 

用法

要取消激活ppa使用

 sudo mod_ppa -d  

例如,要停用ppa:webupd8team/java使用

 sudo mod_ppa -d webupd8team 

激活ppa使用

 sudo mod_ppa -a  

例如,激活ppa:synapse-core使用

 sudo mod_ppa -a synapse-core 

救命

 mod_ppa --help 

我假设您不会对停用/etc/apt/sources.list列出的基本和默认ppa感兴趣。 无论如何只有很少,如果你愿意,你可以手动停用它们。 Sushantp606的回答非常有帮助。

这个怎么运作

当使用软件中心(GUI)停用任何ppa repo时,它实际上将#放在/etc/apt/sources.list.d/相应ppa .list文件中的所有行的前面。 通常,大多数.list文件包含以deb httpdeb-src开头的两行,少数只有一行。 上面的脚本使用sed做同样的事情。 首先它检查ppa .list(由用户输入)是否存在。 然后在相应的前面放置或删除#

由于脚本应该处理操作系统的一些敏感部分,我试图在防御性地编写它。 保持检查传递给脚本的参数,并相应地设置一些错误消息。 还添加了一些小help 。 这些部分增加了代码的长度。

通过编辑

/etc/apt/sources.list

从命令行输入文件,我们可以添加,删除或暂时禁用软件存储库。只需通过终端注释掉不需要的存储库。

我不能发出命令,这只是一个想法。 让我知道你是否可以通过终端命令连接它像 –

在/etc/apt/sources.list中注释掉源存储库的命令是:

 sudo sed -i 's/^deb\-src/\#deb\-src/' /etc/apt/sources.list 

并取消评论使用

 sudo sed -i 's/^\#deb\-src/deb\-src/' /etc/apt/sources.list 

使用您要禁用/注释掉的存储库而不是s/^\#deb\-src/deb\-src/并在进行任何更改之前制作备份源列表文件,如下所示 –

 sudo cp -v /etc/apt/sources.list /etc/apt/sources.list.backup 

看看如何禁用特定的PPA? 。 虽然qeoh的第一个答案使用了GTK前端,但minimec的第二个答案建议在/etc/apt/sources.list评论ppa。 我不确定这是否是您正在寻找的,但这是一种可能的方法。