如何从Cygwin的命令行更新Cygwin?


73

要搜索和下载Cygwin遗漏的软件包,我需要每次都运行setup.exe GUI,单击多次并进行其他无聊的事情。

有没有一种方法可以从Cygwin的命令行直接执行此操作?就像apt-get工具一样。

Answers:


40

在这里看看:

除了其他方面,它还提供以下选项列表setup.exe

Command Line Options:
 -A --disable-buggy-antivirus           Disable known or suspected buggy anti
                    virus software packages during execution.
 -C --categories                        Specify entire categories to install
 -D --download                          Download from internet
 -d --no-desktop                        Disable creation of desktop shortcut
 -h --help                              print help
 -K --pubkey                            Path to extra public key file (gpg format)
 -L --local-install                     Install from local directory
 -l --local-package-dir                 Local package directory
 -n --no-shortcuts                      Disable creation of desktop and start menu
                    shortcuts
 -N --no-startmenu                      Disable creation of start menu shortcut
 -O --only-site                         Ignore all sites except for -s
 -P --packages                          Specify packages to install
 -p --proxy                             HTTP/FTP proxy (host:port)
 -q --quiet-mode                        Unattended setup mode
 -r --no-replaceonreboot                Disable replacing in-use files on next
                    reboot.
 -R --root                              Root installation directory
 -S --sexpr-pubkey                      Extra public key in s-expr format
 -s --site                              Download site
 -U --keep-untrusted-keys               Use untrusted keys and retain all
 -u --untrusted-keys                    Use untrusted keys from last-extrakeys
 -X --no-verify                         Don't verify setup.ini signatures

所以setup.exe -P <package name>应该做好这项工作。这里没有cygwin,因此请对其进行测试以确保其正常运行。

要搜索软件包,请执行以下操作:

您可以使用cygcheck -p

  cygcheck -p REGEXP
  ...
  -p, --package-query  search for REGEXP in the entire cygwin.com package
                       repository (requires internet connectivity)

产生的输出类似(来自上述站点的示例):

$ cygcheck -p 'libexpat.*\.a'
Found 2 matches for 'libexpat.*\.a'.

expat-1.95.7-1            XML parser library written in C
expat-1.95.8-1            XML parser library written in C

9
注意:如果替换了更新cygwin1.dll,Cygwin程序将开始出现异常,并且Cygwin文档建议重新启动。因此,最好关闭所有Cygwin程序,然后setup.exe直接从中运行cmd(如果要自动化,请使用批处理文件,而不是Shell脚本)。
吉尔斯

谢谢!我需要的另一件事是搜索能力,因为我还不知道我要下载什么软件包。一旦找到完整的软件包列表,我grep至少可以做到...
Pavel Vlasov 2010年

有关示例,请参见编辑。
icyrock.com 2010年

22

这将对所有cygwin组件执行无人值守的升级

cd C:\cygwin
wget -N https://cygwin.com/setup-x86.exe
setup-x86.exe --no-desktop --no-shortcuts --no-startmenu --quiet-mode

升级完成后,您应该重新启动,以防止cygwin应用程序由于升级的cygwin1.dll而出现异常

--no-desktop禁用桌面快捷方式的创建

--no-shortcuts禁用桌面和开始菜单的创建

--no-startmenu禁用开始菜单快捷方式的创建

--quiet-mode无人值守安装模式


您介意扩展答案以解释每个命令的作用吗?
Raystafarian

9
我相信现在您可能需要setup-x86_64.exe或setup-x86.exe。
drescherjm 2014年

在cygwin 2.9上,我得到了zsh: command not found: setup.exe,但是安装exe在这里。
Timo

如果您正在使用,no-shortcuts为什么还需要no-desktopno-startmenu
Hashim

非常有用,我对此一无所知。您甚至可以指定要安装的软件包,这可以节省时间。参见此处的示例:gist.github.com/piotrpolak/c616455f1da8dfc2d4e101afbfdcdc8d
Sridhar Sarnobat '18

10

另一种解决方案是使用GitHub上可用的apt-cyg脚本


3
我认为,它不支持升级cygwin本身。
thoni56

@ThomasNilsson您为什么这么认为?
安德烈Chalella

1
由于您将使用cygwin1.dll从外壳运行它。当然,您可以使用其他外壳...
thoni56

“真正的”问题没有更新,而是“如何在不使用安装程序UI的情况下安装一个软件包”,这是真正的答案...确实,这比安装程序要好得多-p be cuz,它将告诉您什么确实,而不仅仅是盲目地建立自己的信念
THESorcerer

7

Cygwin的安装位置似乎有所变化和分裂。现在您需要

wget http://cygwin.com/setup-x86.exe

要么

wget http://cygwin.com/setup-x86_64.exe

我有一个带有内容的setup.bat bin\wget.exe --timestamping http://www.cygwin.com/setup-x86_64.exe && start setup-x86_64.exe,请确保我始终运行最新的安装程序,并且仅在实际存在新版本的情况下才下载安装程序(这是--timestamping所做的工作),然后bat文件将其启动
hanshenrik

4

所述安装程序允许它从命令行(升高壳,请):

setup-x86.exe --root c:\cygwin -q --upgrade-also

对于64位版本:

setup-x86_64.exe --root c:\cygwin -q --upgrade-also

细节:

  • 替换c:\cygwin为CygWin的根安装目录。
  • 建议关闭任何CygWin Shell或程序(即:net stop sshd如果已安装OpenSSH)。
  • 该参数-q不是必需的。

通过GUI(DOS外壳)或什至在远程控制台(SSH或telnet)上均可工作。尚未在PowerShell上进行测试(有人这样做了吗?)。

正确更新输出的示例

G:\Instalac\CygWin\v2.852>Starting cygwin install, version 2.852
User has backup/restore rights
Current Directory: g:\Instalac\CygWin\Packages
Could not open service McShield for query, start and stop. McAfee may not be installed, or we don't have access.
root: c:\cygwin system
Selected local directory: g:\Instalac\CygWin\Packages
net: Direct
Loaded cached mirror list
get_url_to_membuf http://cygwin.com/mirrors.lst
getUrlToStream http://cygwin.com/mirrors.lst
site: http://ftp.hawo.stw.uni-erlangen.de/cygwin/
get_url_to_membuf http://ftp.hawo.stw.uni-erlangen.de/cygwin/x86/setup.bz2
getUrlToStream http://ftp.hawo.stw.uni-erlangen.de/cygwin/x86/setup.bz2
get_url_to_membuf http://ftp.hawo.stw.uni-erlangen.de/cygwin/x86/setup.bz2.sig
getUrlToStream http://ftp.hawo.stw.uni-erlangen.de/cygwin/x86/setup.bz2.sig
Changing gid back to original
Visited: 122 nodes out of 4415 while creating dependency order.
Dependency order of packages: _autorebase base-cygwin cygwin _update-info-dir libgcc1 libiconv2 libintl8 alternatives libattr1 li
bgmp10 coreutils libstdc++6 terminfo libncursesw10 libreadline7 bash findutils sed base-files libuuid1 libblkid1 libsmartcols1 zl
ib0 util-linux bashdb zlib-devel binutils libbz2_1 bzip2 libffi6 libp11-kit0 libtasn1_6 p11-kit p11-kit-trust ca-certificates cry
pt libmpfr4 gawk editrights libpcre1 grep libsigsegv2 diffutils csih cygrunsrv popt libpopt0 cygutils cygwin-devel dash file liba
tomic1 libcloog-isl4 libgomp1 libisl10 libmpc3 libquadmath0 libssp0 w32api-headers w32api-runtime windows-default-manifest gcc-co
re libexpat1 liblzma5 libdb4.8 libgdbm4 libopenssl100 libsqlite3_0 libcharset1 libiconv libintl-devel libuuid-devel python gdb li
bargp getent groff gzip hostname info ipc-utils libncurses10 less libapr1 libiodbc2 libmysqlclient18 libcom_err2 libkrb5support0
libk5crypto3 libkrb5_3 libgssapi_krb5_2 libsasl2_3 libopenldap2_4_2 perl openssl libpq5 libaprutil1 libedit0 libproxy1 libneon27
libpipeline1 libserf1_0 login lynx make man-db mintty nano ncurses openssh procps psmisc rebase run screen subversion xz tar tzco
de vim-minimal which zsh
Changing gid to Administrators
Ending cygwin install

如果在更新期间出现以下问题

The following DLLs couldn't be rebased due to errors:
  /usr/bin/cygcrypt-0.dll

要么:

The following DLLs couldn't be rebased because they were in use:
  /usr/bin/cygcrypt-0.dll

要么:

ReBaseImage (/usr/bin/cygcrypt-0.dll) failed with last error = 6

...然后您必须在安装后重新设置基准:

1.-关闭所有CygWin Shell,程序和服务。
2.- c:\CygWin\bin\ash.exe以管理员身份打开(提升)。
3.-运行/bin/rebaseall


1
为我工作。谢谢。首先需要下载最新的setup-x86.exe或setup-x86_64.exe。并使用cmd以管理员
身份

2
如果您不是为所有用户安装,则几乎没有理由以管理员或--root身份运行安装程序(即cygwin root需要admin写入...)。setup-86[_x64].exe -B以当前用户身份运行。如果需要,您可以稍后将cygrunsrv提升为Windows服务。
Cowbert

1

不久前我就觉得需要这样做。我以前只是保持安装程序文件的下载状态,所以我可以运行它进行安装,但是由于Cygwin有时会被更新,因此安装程序文件会过时。我最终创建了一个Powershell脚本,该脚本会自动提升,下载安装程序并运行无人值守的升级。我将其放在桌面上,只需右键单击并“使用Powershell运行”,它将对我的所有Cygwin软件包进行就地升级。唯一需要用户交互的是UAC,并在最后提示“按任意键继续”。但是,它也可以从命令行运行,因为它只是一个脚本。

我已经在这里放置了一段时间的代码:http : //pastebin.com/wMRctAuL

我在下面复制了它。我也是在一些StackOverflow问答的帮助下编写的。:)要运行它,您要做的就是在计算机上启用本地Powershell脚本。这是一个完整的Windows本机解决方案。

# Get the ID and security principal of the current user account
$myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal=new-object System.Security.Principal.WindowsPrincipal($myWindowsID)

# Get the security principal for the Administrator role
$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator

# Check to see if we are currently running "as Administrator"
if ($myWindowsPrincipal.IsInRole($adminRole)) {
   # We are running "as Administrator" - so change the title and background color to indicate this
   $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)"
   $Host.UI.RawUI.BackgroundColor = "DarkBlue"
   clear-host
}
else {
   # We are not running "as Administrator" - so relaunch as administrator

   # Create a new process object that starts PowerShell
   $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell";

   # Specify the current script path and name as a parameter
   $newProcess.Arguments = $myInvocation.MyCommand.Definition;

   # Indicate that the process should be elevated
   $newProcess.Verb = "runas";

   # Start the new process
   [System.Diagnostics.Process]::Start($newProcess);

   # Exit from the current, unelevated, process
   exit
}

# Run your code that needs to be elevated here
(new-object System.Net.WebClient).DownloadFile('http://cygwin.com/setup-x86_64.exe','setup-x86_64.exe')

if (!$?) {
   Write-Host "Something wrong happened when downloading the Cygwin installer."
   Write-Host -NoNewLine "Press any key to continue..."
   $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
   exit
}

$p = Start-Process .\setup-x86_64.exe -ArgumentList "--upgrade-also --quiet-mode" -wait -NoNewWindow -PassThru

if ($p.ExitCode -ne 0) {
   Write-Host "Cygwin setup failed with an error!"
}

Remove-Item .\setup-x86_64.exe

Write-Host -NoNewLine "Press any key to continue..."
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

0

扩展@Johnny的答案https://superuser.com/a/624731/110335

我遇到的烦恼是偶尔会提示.ini文件来自Cygwin的setup.exe的较新版本。

我为自己编写了以下脚本以进行自我更新,然后非交互地更新所有需要的脚本。

cygwinSetup64.cmd

@echo on
cd /d e:\cygwin
move /y cygwinSetup-x86_64.exe   setup-x86_64.exe
wget --progress=dot -S -N  http://cygwin.com/setup-x86_64.exe
move /y  setup-x86_64.exe cygwinSetup-x86_64.exe 

cygwinSetup-x86_64.exe   --no-desktop --no-shortcuts --no-startmenu --quiet-mode


0

创建一个具有以下内容的批处理文件,例如“ cygwin-update.bat”,并将其放在您的路径中:

@echo off
"%~dp0\gnubin\wget.exe" --no-check-certificate https://www.cygwin.com/setup-x86_64.exe -O C:\cygwin64\setup-x86_64.exe
cd /d C:\cygwin64
setup-x86_64.exe -q -g
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.