<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://www.explainxkcd.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Daethnir</id>
		<title>explain xkcd - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://www.explainxkcd.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Daethnir"/>
		<link rel="alternate" type="text/html" href="https://www.explainxkcd.com/wiki/index.php/Special:Contributions/Daethnir"/>
		<updated>2026-05-14T20:26:36Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://www.explainxkcd.com/wiki/index.php?title=1343:_Manuals&amp;diff=114926</id>
		<title>1343: Manuals</title>
		<link rel="alternate" type="text/html" href="https://www.explainxkcd.com/wiki/index.php?title=1343:_Manuals&amp;diff=114926"/>
				<updated>2016-03-15T06:22:21Z</updated>
		
		<summary type="html">&lt;p&gt;Daethnir: Notes that sudo can run as any user, not just root.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{comic&lt;br /&gt;
| number    = 1343&lt;br /&gt;
| date      = March 17, 2014&lt;br /&gt;
| title     = Manuals&lt;br /&gt;
| image     = manuals.png&lt;br /&gt;
| titletext = The most ridiculous offender of all is the sudoers man page, which for 15 years has started with a 'quick guide' to EBNF, a system for defining the grammar of a language. 'Don't despair', it says, 'the definitions below are annotated.'&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
The chart shows the quality of tools regarding their manual:&lt;br /&gt;
*If you don't even need a manual to use a certain tool, that tool tends to help solve problems effectively.&lt;br /&gt;
*If you do need a manual, the tool will probably solve the problems but you have to understand that manual before you can use this tool effectively.&lt;br /&gt;
*Much less helpful are the tools where you need a manual but it doesn't exist — these tools tend to create more problems than they solve.&lt;br /&gt;
*But the worst tools are where the manuals start with a description of the manual itself — which implies both that the tool is very complex and the manual is very hard to understand.&lt;br /&gt;
&lt;br /&gt;
The title text refers to ''sudoers'', a config file for the unix command ''{{w|sudo}}''. ''sudo'' allows users to run a program with elevated permissions, as referenced in [[149: Sandwich]]. Man pages are collections of manuals for different tools, commands, files, and functions on Unix-like systems which can be viewed with the tool ''man''. You can type &amp;lt;code&amp;gt;man man&amp;lt;/code&amp;gt; in a terminal to get the manpage for the manual program. See for instance also the comic [[912: Manual Override]]&lt;br /&gt;
&lt;br /&gt;
The sudoers file specifies which users have sudo access, and which commands they are allowed to run as other users (typically root). The syntax of the file is very complex, and the manpage uses the {{w|Extended Backus–Naur Form}} (or EBNF) to describe the syntax. The sudoers man page starts off with an explanation of EBNF's grammar, which they reference throughout the rest of the man page in describing the syntax of the sudoers file. The [http://linux.die.net/man/5/sudoers sudoers man page] is very long, clocking in at 1504 lines. In contrast, the [http://linux.die.net/man/1/man manpages man page] only has 566 lines. The number of lines may differ between some distributions and versions.&lt;br /&gt;
&lt;br /&gt;
The title text also notes that the manual's assurance, &amp;quot;don't despair&amp;quot; because &amp;quot;the definitions below are annotated&amp;quot;, fails to be reassuring, and instead merely emphasizes the length and complexity of the document to read.&lt;br /&gt;
&lt;br /&gt;
==Transcript==&lt;br /&gt;
:[A horizontal line has four points labeled on it, with the second point from the left marked with a dashed vertical line dividing the horizontal line into two parts.]&lt;br /&gt;
:[An arrow labeled &amp;quot;Solve problems&amp;quot; points left from the vertical line.]&lt;br /&gt;
:[An arrow labeled &amp;quot;Create problems&amp;quot; points right from the vertical line.]&lt;br /&gt;
:[The points are labeled, from left to right, &amp;quot;Tools that don't need a manual&amp;quot;, &amp;quot;Tools that need a manual&amp;quot;, &amp;quot;Tools that need a manual but don't have one&amp;quot;, and &amp;quot;Tools whose manual starts with 'how to read this manual'&amp;quot;.]&lt;br /&gt;
&lt;br /&gt;
{{comic discussion}}&lt;br /&gt;
[[Category:Charts]]&lt;/div&gt;</summary>
		<author><name>Daethnir</name></author>	</entry>

	<entry>
		<id>https://www.explainxkcd.com/wiki/index.php?title=838:_Incident&amp;diff=114925</id>
		<title>838: Incident</title>
		<link rel="alternate" type="text/html" href="https://www.explainxkcd.com/wiki/index.php?title=838:_Incident&amp;diff=114925"/>
				<updated>2016-03-15T06:20:25Z</updated>
		
		<summary type="html">&lt;p&gt;Daethnir: Updates to note sudo runs a shell, does not 'log in' as root.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{comic&lt;br /&gt;
| number    = 838&lt;br /&gt;
| date      = December 24, 2010&lt;br /&gt;
| title     = Incident&lt;br /&gt;
| image     = incident.png&lt;br /&gt;
| titletext = He sees you when you're sleeping, he knows when you're awake, he's copied on /var/spool/mail/root, so be good for goodness' sake.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
This comic was posted on {{w|Christmas Eve}}. While {{w|Christmas}} is principally a {{w|Christian}} holiday celebrating the birth of {{w|Jesus}} on December 25, there are many tradition around the holiday, among them {{w|Christmas Eve#Gift_giving|a tradition}} that on {{w|Christmas Eve}} {{w|Santa Claus}} will make his round delivering gifts to good children.&lt;br /&gt;
&lt;br /&gt;
[[Rob]] sits behind a Linux computer and tried to change his user account from his normal access to the access of a super user by using the command &amp;quot;{{w|sudo|sudo su}}&amp;quot;. Sudo is a famous phrase in xkcd lore, made famous by comic [[149: Sandwich]]. When Rob is unable to use &amp;quot;sudo su&amp;quot; (which attempts to run a new command shell as the root user) but his account is not authorized, the system says that the incident &amp;quot;will be reported&amp;quot; (usually to the system administrator, so he can see if someone is making repeated attempts at accessing administrator privileges).&lt;br /&gt;
&lt;br /&gt;
In the comic, however, sudo and the system report the incidents to {{w|Santa Claus}}, who, in Christmas lore, makes a list of who is naughty and who is nice. If you are nice then you get presents, while if you are naughty, you get a lump of coal. When sudo reports to Santa that Rob's account is not authorized, he puts Rob on the naughty list.&lt;br /&gt;
&lt;br /&gt;
In the title text, which is a parody of the famous Christmas song, &amp;quot;Santa Claus Is Coming To Town&amp;quot;, &amp;lt;code&amp;gt;/var/spool/mail/root&amp;lt;/code&amp;gt; is the root (superuser) mailbox on a Linux system, where the incident described in the comic would commonly be reported to.&lt;br /&gt;
&lt;br /&gt;
==Transcript==&lt;br /&gt;
:[Rob is sitting at a computer. The computer's prompt is shown.]&lt;br /&gt;
 robm@homebox~$ sudo su&lt;br /&gt;
 Password:&lt;br /&gt;
 robm is not in the sudoers file. This incident will be reported.&lt;br /&gt;
 robm@homebox~$ █&lt;br /&gt;
:[Megan approaches.]&lt;br /&gt;
:Rob: Hey — who does sudo report these &amp;quot;incidents&amp;quot; ''to''?&lt;br /&gt;
:Megan: You know, I've never checked.&lt;br /&gt;
:[Santa Claus is sitting at a desk supported by candy canes, with a red monitor. On the wall are two lists labeled 'naughty' and 'nice'. He is in the process of adding a line to the 'naughty' list.]&lt;br /&gt;
&lt;br /&gt;
{{comic discussion}}&lt;br /&gt;
[[Category:Comics featuring Rob]]&lt;br /&gt;
[[Category:Comics featuring Megan]]&lt;br /&gt;
[[Category:Comics with color]]&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:Christmas]]&lt;/div&gt;</summary>
		<author><name>Daethnir</name></author>	</entry>

	<entry>
		<id>https://www.explainxkcd.com/wiki/index.php?title=149:_Sandwich&amp;diff=114924</id>
		<title>149: Sandwich</title>
		<link rel="alternate" type="text/html" href="https://www.explainxkcd.com/wiki/index.php?title=149:_Sandwich&amp;diff=114924"/>
				<updated>2016-03-15T06:17:38Z</updated>
		
		<summary type="html">&lt;p&gt;Daethnir: Updates to note sudo runs as root, not some 'admin-like' account&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{comic&lt;br /&gt;
| number    = 149&lt;br /&gt;
| date      = August 28, 2006&lt;br /&gt;
| title     = Sandwich&lt;br /&gt;
| image     = sandwich.png&lt;br /&gt;
| titletext = Proper User Policy apparently means Simon Says.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
On a {{w|UNIX}} computer system, users can be assigned to all kinds of rights, for example rights to access to certain directories and files to execute certain commands. The ''{{w|sudo}}'' command lets certain (authorized) users override these policies by executing the command (everything after the word &amp;quot;sudo&amp;quot; on the command line) as the root user. Root (sometimes called the superuser) has complete system powers, exempt from all access controls. One very common activity for UNIX administrators is to install or configure software using the UNIX ''{{w|Make (software)|make}}'' command, e.g. &amp;lt;code&amp;gt;% '''make install'''&amp;lt;/code&amp;gt;.  Often this command requires administrative permissions in order to complete successfully, which in practice means the &amp;quot;&amp;lt;code&amp;gt;make ''this''&amp;lt;/code&amp;gt;&amp;quot; command will fail unless it is typed as &amp;quot;&amp;lt;code&amp;gt;sudo make ''this''&amp;lt;/code&amp;gt;&amp;quot; instead. Forgetting to start the command with &amp;quot;sudo&amp;quot; is a fairly common and frustrating mistake for people who administer UNIX systems or their personal {{w|Linux}} computer. They then need to repeat the command with &amp;quot;sudo&amp;quot;, whereupon the computer responds obediently and everything works smoothly.&lt;br /&gt;
&lt;br /&gt;
[[Cueball]] is demanding a sandwich from his Cueball-like friend. Not being properly asked, the friend denies the request. Cueball then (ab)uses the sudo command on the friend, who then has no choice but to go and make the sandwich and now does so without complaint, because Cueball has all the rights. For anyone versed in installing system software with the &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; command, this exchange is intensely reminiscent of the analogous onscreen experience.&lt;br /&gt;
&lt;br /&gt;
{{w|Simon Says}} is a children's game in which a leader gives various commands which must be followed if and only if ([[1033: Formal Logic|iff]]) the leader prefixes the command with &amp;quot;Simon says&amp;quot;. The title text compares the way the computer will run some commands if they are preceded with &amp;quot;sudo&amp;quot; to the way Simon Says players are supposed to follow orders if (and only if) they are preceded with &amp;quot;Simon says&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Alternatively, the title text might merely be referring to the similarity between Cueball ordering his friend around with &amp;quot;sudo&amp;quot; to the Simon Says game leader ordering other players around. Wikipedia suggests the &amp;quot;Simon&amp;quot; in the name of the game may be the powerful lord Simon de Montfort, or a corruption of Cicero, both of whom were influential politicians of their day.&lt;br /&gt;
&lt;br /&gt;
==Transcript==&lt;br /&gt;
:[Cueball is sitting on a couch, talking to a Cueball-like friend.]&lt;br /&gt;
:Cueball: Make me a sandwich.&lt;br /&gt;
:Friend: What? Make it yourself.&lt;br /&gt;
:Cueball: Sudo make me a sandwich.&lt;br /&gt;
:Friend: Okay.&lt;br /&gt;
&lt;br /&gt;
{{comic discussion}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Comics featuring Cueball]]&lt;br /&gt;
[[Category:Multiple Cueballs]]&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:Food]]&lt;/div&gt;</summary>
		<author><name>Daethnir</name></author>	</entry>

	<entry>
		<id>https://www.explainxkcd.com/wiki/index.php?title=1654:_Universal_Install_Script&amp;diff=114886</id>
		<title>1654: Universal Install Script</title>
		<link rel="alternate" type="text/html" href="https://www.explainxkcd.com/wiki/index.php?title=1654:_Universal_Install_Script&amp;diff=114886"/>
				<updated>2016-03-14T14:36:56Z</updated>
		
		<summary type="html">&lt;p&gt;Daethnir: Fleshes out issues w/ interactive requests from the package managers.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{comic&lt;br /&gt;
| number    = 1654&lt;br /&gt;
| date      = March 11, 2016&lt;br /&gt;
| title     = Universal Install Script&lt;br /&gt;
| image     = universal_install_script.png&lt;br /&gt;
| titletext = The failures usually don't hurt anything, and if it installs several versions, it increases the chance that one of them is right. (Note: The 'yes' command and '2&amp;gt;/dev/null' are recommended additions.)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Most users of computers today are used to simple, easy installation of programs. You just download a .exe or a .pkg, double click it, and do what it says. Sometimes you don't even have to install anything at all, and it runs without any installation.&lt;br /&gt;
&lt;br /&gt;
However, when things are more &amp;quot;homebrew&amp;quot;, for example downloading source code, things are more complicated.  Under {{w|Unix-like}} systems, which this universal install script is designed for, you may have to work with &amp;quot;build environments&amp;quot; and &amp;quot;makefiles&amp;quot;, and command line tools. To make this process simpler, there exist repositories of programs which host either packages of source code and the things needed to build it or the pre-built programs. When you download the package, it automatically does most of the work of building the code into something executable if necessary and then installing it. However, there are many such repositories, such as &amp;quot;pip&amp;quot; and &amp;quot;brew&amp;quot;, among others listed in the comic. If you only know the name of a program or package, you may not know in which repository(ies) it resides.&lt;br /&gt;
&lt;br /&gt;
The script provided in the comic attempts to fix this problem, by giving a &amp;quot;universal install script&amp;quot;, which contains a lot of common install commands used in various Unix-like systems. In between each of the install commands in the script is the &amp;amp; character, which in POSIX-compatible shells (including {{w|Bash (Unix shell)|Bash}}, a popular shell scripting language) means it should continue to run the next command without waiting for the first command to finish, also known as &amp;quot;running in the background&amp;quot;. This has the effect of running all the install commands simultaneously; all output and error text provided by the will be mixed together as they are all displaying on the screen around the same time.&lt;br /&gt;
&lt;br /&gt;
The script accepts the name of a program when you run it as an argument. This value is then referenced as &amp;quot;$1&amp;quot; (argument number 1). Everywhere the script says &amp;quot;$1&amp;quot;, it substitutes in the name of the package you gave it. The end result is the name being tried against a large number of software repositories and package managers, and hopefully, at least one of them will be appropriate and the program will be successfully installed. Near the end, it even tries changing the current working directory to that which is assumed to hold the package to be installed, and then runs several commands which build the program from source code.&lt;br /&gt;
&lt;br /&gt;
All in all, this script would probably work; it runs many standard popular repository programs and package managers, and runs the nearly-universal commands needed to build a program.  Most of the commands would simply give an error and exit, but hopefully the correct one will proceed with the install.&lt;br /&gt;
&lt;br /&gt;
One of the more subtle jokes in the comic is the inclusion of &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; in the same script. Good unix practice dictates never logging in as root; instead you stay logged in as your normal user, and run system admin accounts via &amp;lt;code&amp;gt;sudo program name&amp;lt;/code&amp;gt;. This prevents accidental errors and enables logging of all sensitive commands. A side effect of this, however, is that an administrator may forget to prefix her command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, and re-running it properly the second time. This is a common joke in the Linux community, an example of which can be found at [https://twitter.com/liamosaur/status/506975850596536320 viral tweet] which shows a humerous workaround for the issue.&lt;br /&gt;
&lt;br /&gt;
Since Randall's script does not use sudo for any but the &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; command, there are two possibilities: the script itself was run via the root user or via sudo (in which case the &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; is not needed, or the script was run as a normal user, in which case all of the commands will fail (due to lacking necessary permissions) with the possible exception of the &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; one.&lt;br /&gt;
&lt;br /&gt;
Sudo has also been used both by [[Randall]] in [[149: Sandwich]] and by Jason Fox to force Randall to let him appear on xkcd with [[824: Guest Week: Bill Amend (FoxTrot)]].&lt;br /&gt;
&lt;br /&gt;
The tool &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; downloads files from the network (e.g., the Internet). For example &amp;lt;code&amp;gt;curl http://xkcd.com/&amp;lt;/code&amp;gt; downloads and displays the xkcd HTML source. The pipe &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; in the script attaches the output of the command before the pipe to the input of the command after the pipe, thus running whatever commands exist in the web content. Although this &amp;quot;curl|sh&amp;quot; pattern is a common practice for conveniently installing software, it is considered extremely unwise; you are running untrusted code without validation, there may be a MITM who modifies the code you receive, or the remote system could have been hijacked and the code made malicious. Most local package managers (e.g. &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum&amp;lt;/code&amp;gt;) offer digitally-signed packages that thwart this problem. You can find many examples of software providers suggesting a &amp;lt;code&amp;gt;curl|sh&amp;lt;/code&amp;gt; solution at [https://curlpipesh.tumblr.com/ curlpipesh]&lt;br /&gt;
&lt;br /&gt;
There appears to be a bug with the &amp;amp; at the end of the &amp;quot;git clone&amp;quot; line; since a git repository typically contains program source code, not executables, it may have been intended to retrieve the source code with git and then compile and install the program in the next line. In this case, the single &amp;amp; should be replaced with &amp;amp;&amp;amp;, an operator that will run the second command only if the first one has completed successfully. This plays into a second bug on the &amp;quot;configure&amp;quot; line, where the placement of the &amp;amp; means that only the &amp;quot;make install&amp;quot; command will be run asynchronously after the &amp;quot;configure&amp;quot; and &amp;quot;make&amp;quot; steps have finished in sequence. To make success as likely as possible, the two lines should be like this:&lt;br /&gt;
&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;https://github.com/&amp;lt;/nowiki&amp;gt;&amp;quot;$1&amp;quot;/&amp;quot;$1&amp;quot; &amp;amp;&amp;amp; (cd &amp;quot;$1&amp;quot;; ./configure; make; make install) &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Since all commands are running in the background, any command that requires user input will stop and wait until brought to the foreground. A common request would be for a database password, or if it is allowed to restart services for the installation. This could lead to packages being only partly installed or configured. (See more about using &amp;quot;yes&amp;quot; below.)&lt;br /&gt;
&lt;br /&gt;
The title text mentions the possibility that the same program may be in multiple repositories, so in this case, the script will download and install several versions, or it may fail on a number of repositories, in which case usually nothing bad happens. Since all the commands come from different operating systems, versions, or distributions, it is not very likely that more than one will work (with the exception of pip/easy_install and the two forms of apt-get) or even exist on the same system. It mentions that adding a way of automatically saying &amp;quot;yes&amp;quot; to questions asked during the different repository-fetching programs' running, by making them read input from another program that writes a (nearly) endless stream of &amp;quot;y&amp;quot;s, could simplify things further. (This would not work for any curses-based menus, or to answer any more complicated questions.) Adding &amp;lt;code&amp;gt;2&amp;gt;/dev/null&amp;lt;/code&amp;gt; to a command redirects the second output stream (the &amp;quot;error stream&amp;quot;) to the null device driver, which discards all writes to it, meaning errors (the package not existing) will not be sent to the screen.&lt;br /&gt;
&lt;br /&gt;
==Transcript==&lt;br /&gt;
:[In the panel is a shell script which, unusual for xkcd, uses only lower case. At the top the title of the program is inlaid in the frame, which has been broken here.]&lt;br /&gt;
:&amp;lt;big&amp;gt;Install.sh&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#!/bin/bash&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:pip install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:easy_install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:brew install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:npm install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:yum install &amp;quot;$1&amp;quot; &amp;amp; dnf install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:docker run &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:pkg install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:apt-get install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:sudo apt-get install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:steamcmd +app_update &amp;quot;$1&amp;quot; validate &amp;amp;&lt;br /&gt;
:git clone &amp;lt;nowiki&amp;gt;https://github.com/&amp;lt;/nowiki&amp;gt;&amp;quot;$1&amp;quot;/&amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:cd &amp;quot;$1&amp;quot;;./configure;make;make install &amp;amp;&lt;br /&gt;
:curl &amp;quot;$1&amp;quot; | bash &amp;amp;&lt;br /&gt;
&lt;br /&gt;
==Trivia==&lt;br /&gt;
*pip and easy install are package managers for {{w|Python (programming language)|Python}}&lt;br /&gt;
*brew is the successor/replacement for {{w|MacPorts}} and a third-party package manager for OS X&lt;br /&gt;
*{{w|npm (software)|npm}} is the node package manager that maintains node.js packages&lt;br /&gt;
*{{w|Yellowdog Updater, Modified|yum}} is the package management tool for {{w|Red Hat Enterprise Linux}} and some derivatives&lt;br /&gt;
*{{w|DNF (software)|dnf}} is the package management tool for {{w|Fedora (operating system)|Fedora}} since version 22&lt;br /&gt;
*docker run is a {{w|Docker (software)|Docker}} command that runs a given container (similar to a virtual machine)&lt;br /&gt;
*pkg is the package management tool on {{w|Berkeley Software Distribution|BSD systems}}&lt;br /&gt;
*apt-get is the package management tool of {{w|Debian}} and derivatives (e.g. Ubuntu)&lt;br /&gt;
*steamcmd refers to {{w|Steam (software)|Steam}}, the computer game client&lt;br /&gt;
*git is the revision control software used for many projects and gained a lot of traction through the {{w|GitHub}} platform&lt;br /&gt;
*configure/make/make install refers to the standard way of compiling software from source (on Linux/Unix)&lt;br /&gt;
*curl is a tool for loading data via http:// (i.e. from a website), this data is then pushed to the shell interpreter (in order to install)&lt;br /&gt;
**Note: While this is a security nightmare, some projects (like Homebrew) still use it as the preferred or only method of installation.&lt;br /&gt;
&lt;br /&gt;
{{comic discussion}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Daethnir</name></author>	</entry>

	<entry>
		<id>https://www.explainxkcd.com/wiki/index.php?title=1654:_Universal_Install_Script&amp;diff=114885</id>
		<title>1654: Universal Install Script</title>
		<link rel="alternate" type="text/html" href="https://www.explainxkcd.com/wiki/index.php?title=1654:_Universal_Install_Script&amp;diff=114885"/>
				<updated>2016-03-14T14:29:56Z</updated>
		
		<summary type="html">&lt;p&gt;Daethnir: Removes redundant paragraph about &amp;amp; background usage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{comic&lt;br /&gt;
| number    = 1654&lt;br /&gt;
| date      = March 11, 2016&lt;br /&gt;
| title     = Universal Install Script&lt;br /&gt;
| image     = universal_install_script.png&lt;br /&gt;
| titletext = The failures usually don't hurt anything, and if it installs several versions, it increases the chance that one of them is right. (Note: The 'yes' command and '2&amp;gt;/dev/null' are recommended additions.)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Most users of computers today are used to simple, easy installation of programs. You just download a .exe or a .pkg, double click it, and do what it says. Sometimes you don't even have to install anything at all, and it runs without any installation.&lt;br /&gt;
&lt;br /&gt;
However, when things are more &amp;quot;homebrew&amp;quot;, for example downloading source code, things are more complicated.  Under {{w|Unix-like}} systems, which this universal install script is designed for, you may have to work with &amp;quot;build environments&amp;quot; and &amp;quot;makefiles&amp;quot;, and command line tools. To make this process simpler, there exist repositories of programs which host either packages of source code and the things needed to build it or the pre-built programs. When you download the package, it automatically does most of the work of building the code into something executable if necessary and then installing it. However, there are many such repositories, such as &amp;quot;pip&amp;quot; and &amp;quot;brew&amp;quot;, among others listed in the comic. If you only know the name of a program or package, you may not know in which repository(ies) it resides.&lt;br /&gt;
&lt;br /&gt;
The script provided in the comic attempts to fix this problem, by giving a &amp;quot;universal install script&amp;quot;, which contains a lot of common install commands used in various Unix-like systems. In between each of the install commands in the script is the &amp;amp; character, which in POSIX-compatible shells (including {{w|Bash (Unix shell)|Bash}}, a popular shell scripting language) means it should continue to run the next command without waiting for the first command to finish, also known as &amp;quot;running in the background&amp;quot;. This has the effect of running all the install commands simultaneously; all output and error text provided by the will be mixed together as they are all displaying on the screen around the same time.&lt;br /&gt;
&lt;br /&gt;
The script accepts the name of a program when you run it as an argument. This value is then referenced as &amp;quot;$1&amp;quot; (argument number 1). Everywhere the script says &amp;quot;$1&amp;quot;, it substitutes in the name of the package you gave it. The end result is the name being tried against a large number of software repositories and package managers, and hopefully, at least one of them will be appropriate and the program will be successfully installed. Near the end, it even tries changing the current working directory to that which is assumed to hold the package to be installed, and then runs several commands which build the program from source code.&lt;br /&gt;
&lt;br /&gt;
All in all, this script would probably work; it runs many standard popular repository programs and package managers, and runs the nearly-universal commands needed to build a program.  Most of the commands would simply give an error and exit, but hopefully the correct one will proceed with the install.&lt;br /&gt;
&lt;br /&gt;
One of the more subtle jokes in the comic is the inclusion of &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; in the same script. Good unix practice dictates never logging in as root; instead you stay logged in as your normal user, and run system admin accounts via &amp;lt;code&amp;gt;sudo program name&amp;lt;/code&amp;gt;. This prevents accidental errors and enables logging of all sensitive commands. A side effect of this, however, is that an administrator may forget to prefix her command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, and re-running it properly the second time. This is a common joke in the Linux community, an example of which can be found at [https://twitter.com/liamosaur/status/506975850596536320 viral tweet] which shows a humerous workaround for the issue.&lt;br /&gt;
&lt;br /&gt;
Since Randall's script does not use sudo for any but the &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; command, there are two possibilities: the script itself was run via the root user or via sudo (in which case the &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; is not needed, or the script was run as a normal user, in which case all of the commands will fail (due to lacking necessary permissions) with the possible exception of the &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; one.&lt;br /&gt;
&lt;br /&gt;
Sudo has also been used both by [[Randall]] in [[149: Sandwich]] and by Jason Fox to force Randall to let him appear on xkcd with [[824: Guest Week: Bill Amend (FoxTrot)]].&lt;br /&gt;
&lt;br /&gt;
The tool &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; downloads files from the network (e.g., the Internet). For example &amp;lt;code&amp;gt;curl http://xkcd.com/&amp;lt;/code&amp;gt; downloads and displays the xkcd HTML source. The pipe &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; in the script attaches the output of the command before the pipe to the input of the command after the pipe, thus running whatever commands exist in the web content. Although this &amp;quot;curl|sh&amp;quot; pattern is a common practice for conveniently installing software, it is considered extremely unwise; you are running untrusted code without validation, there may be a MITM who modifies the code you receive, or the remote system could have been hijacked and the code made malicious. Most local package managers (e.g. &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum&amp;lt;/code&amp;gt;) offer digitally-signed packages that thwart this problem. You can find many examples of software providers suggesting a &amp;lt;code&amp;gt;curl|sh&amp;lt;/code&amp;gt; solution at [https://curlpipesh.tumblr.com/ curlpipesh]&lt;br /&gt;
&lt;br /&gt;
There appears to be a bug with the &amp;amp; at the end of the &amp;quot;git clone&amp;quot; line; since a git repository typically contains program source code, not executables, it may have been intended to retrieve the source code with git and then compile and install the program in the next line. In this case, the single &amp;amp; should be replaced with &amp;amp;&amp;amp;, an operator that will run the second command only if the first one has completed successfully. This plays into a second bug on the &amp;quot;configure&amp;quot; line, where the placement of the &amp;amp; means that only the &amp;quot;make install&amp;quot; command will be run asynchronously after the &amp;quot;configure&amp;quot; and &amp;quot;make&amp;quot; steps have finished in sequence. To make success as likely as possible, the two lines should be like this:&lt;br /&gt;
&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;https://github.com/&amp;lt;/nowiki&amp;gt;&amp;quot;$1&amp;quot;/&amp;quot;$1&amp;quot; &amp;amp;&amp;amp; (cd &amp;quot;$1&amp;quot;; ./configure; make; make install) &amp;amp;&lt;br /&gt;
&lt;br /&gt;
The title text mentions the possibility that the same program may be in multiple repositories, so in this case, the script will download and install several versions, or it may fail on a number of repositories, in which case usually nothing bad happens. Since all the commands come from different operating systems, versions, or distributions, it is not very likely that more than one will work (with the exception of pip/easy_install and the two forms of apt-get) or even exist on the same system. It mentions that adding a way of automatically saying &amp;quot;yes&amp;quot; to questions asked during the different repository-fetching programs' running, by making them read input from another program that writes a (nearly) endless stream of &amp;quot;y&amp;quot;s, could simplify things further. &amp;lt;code&amp;gt;2&amp;gt;/dev/null&amp;lt;/code&amp;gt; redirects the second output stream (the &amp;quot;error stream&amp;quot;) to the null device driver, which discards all writes to it, meaning errors (the package not existing) will not be sent to the screen.&lt;br /&gt;
&lt;br /&gt;
==Transcript==&lt;br /&gt;
:[In the panel is a shell script which, unusual for xkcd, uses only lower case. At the top the title of the program is inlaid in the frame, which has been broken here.]&lt;br /&gt;
:&amp;lt;big&amp;gt;Install.sh&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#!/bin/bash&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:pip install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:easy_install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:brew install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:npm install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:yum install &amp;quot;$1&amp;quot; &amp;amp; dnf install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:docker run &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:pkg install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:apt-get install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:sudo apt-get install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:steamcmd +app_update &amp;quot;$1&amp;quot; validate &amp;amp;&lt;br /&gt;
:git clone &amp;lt;nowiki&amp;gt;https://github.com/&amp;lt;/nowiki&amp;gt;&amp;quot;$1&amp;quot;/&amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:cd &amp;quot;$1&amp;quot;;./configure;make;make install &amp;amp;&lt;br /&gt;
:curl &amp;quot;$1&amp;quot; | bash &amp;amp;&lt;br /&gt;
&lt;br /&gt;
==Trivia==&lt;br /&gt;
*pip and easy install are package managers for {{w|Python (programming language)|Python}}&lt;br /&gt;
*brew is the successor/replacement for {{w|MacPorts}} and a third-party package manager for OS X&lt;br /&gt;
*{{w|npm (software)|npm}} is the node package manager that maintains node.js packages&lt;br /&gt;
*{{w|Yellowdog Updater, Modified|yum}} is the package management tool for {{w|Red Hat Enterprise Linux}} and some derivatives&lt;br /&gt;
*{{w|DNF (software)|dnf}} is the package management tool for {{w|Fedora (operating system)|Fedora}} since version 22&lt;br /&gt;
*docker run is a {{w|Docker (software)|Docker}} command that runs a given container (similar to a virtual machine)&lt;br /&gt;
*pkg is the package management tool on {{w|Berkeley Software Distribution|BSD systems}}&lt;br /&gt;
*apt-get is the package management tool of {{w|Debian}} and derivatives (e.g. Ubuntu)&lt;br /&gt;
*steamcmd refers to {{w|Steam (software)|Steam}}, the computer game client&lt;br /&gt;
*git is the revision control software used for many projects and gained a lot of traction through the {{w|GitHub}} platform&lt;br /&gt;
*configure/make/make install refers to the standard way of compiling software from source (on Linux/Unix)&lt;br /&gt;
*curl is a tool for loading data via http:// (i.e. from a website), this data is then pushed to the shell interpreter (in order to install)&lt;br /&gt;
**Note: While this is a security nightmare, some projects (like Homebrew) still use it as the preferred or only method of installation.&lt;br /&gt;
&lt;br /&gt;
{{comic discussion}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Daethnir</name></author>	</entry>

	<entry>
		<id>https://www.explainxkcd.com/wiki/index.php?title=1654:_Universal_Install_Script&amp;diff=114884</id>
		<title>1654: Universal Install Script</title>
		<link rel="alternate" type="text/html" href="https://www.explainxkcd.com/wiki/index.php?title=1654:_Universal_Install_Script&amp;diff=114884"/>
				<updated>2016-03-14T14:26:17Z</updated>
		
		<summary type="html">&lt;p&gt;Daethnir: fixes /dev/null redirect interpretation.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{comic&lt;br /&gt;
| number    = 1654&lt;br /&gt;
| date      = March 11, 2016&lt;br /&gt;
| title     = Universal Install Script&lt;br /&gt;
| image     = universal_install_script.png&lt;br /&gt;
| titletext = The failures usually don't hurt anything, and if it installs several versions, it increases the chance that one of them is right. (Note: The 'yes' command and '2&amp;gt;/dev/null' are recommended additions.)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Most users of computers today are used to simple, easy installation of programs. You just download a .exe or a .pkg, double click it, and do what it says. Sometimes you don't even have to install anything at all, and it runs without any installation.&lt;br /&gt;
&lt;br /&gt;
However, when things are more &amp;quot;homebrew&amp;quot;, for example downloading source code, things are more complicated.  Under {{w|Unix-like}} systems, which this universal install script is designed for, you may have to work with &amp;quot;build environments&amp;quot; and &amp;quot;makefiles&amp;quot;, and command line tools. To make this process simpler, there exist repositories of programs which host either packages of source code and the things needed to build it or the pre-built programs. When you download the package, it automatically does most of the work of building the code into something executable if necessary and then installing it. However, there are many such repositories, such as &amp;quot;pip&amp;quot; and &amp;quot;brew&amp;quot;, among others listed in the comic. If you only know the name of a program or package, you may not know in which repository(ies) it resides.&lt;br /&gt;
&lt;br /&gt;
The script provided in the comic attempts to fix this problem, by giving a &amp;quot;universal install script&amp;quot;, which contains a lot of common install commands used in various Unix-like systems. In between each of the install commands in the script is the &amp;amp; character, which in POSIX-compatible shells (including {{w|Bash (Unix shell)|Bash}}, a popular shell scripting language) means it should continue to run the next command without waiting for the first command to finish, also known as &amp;quot;running in the background&amp;quot;.  This has the effect of running all the install commands simultaneously; all output and error text provided by the will be mixed together as they are all displaying on the screen around the same time.  More about the &amp;amp; below.&lt;br /&gt;
&lt;br /&gt;
The script accepts the name of a program when you run it as an argument. This value is then referenced as &amp;quot;$1&amp;quot; (argument number 1). Everywhere the script says &amp;quot;$1&amp;quot;, it substitutes in the name of the package you gave it. The end result is the name being tried against a large number of software repositories and package managers, and hopefully, at least one of them will be appropriate and the program will be successfully installed. Near the end, it even tries changing the current working directory to that which is assumed to hold the package to be installed, and then runs several commands which build the program from source code.&lt;br /&gt;
&lt;br /&gt;
All in all, this script would probably work; it runs many standard popular repository programs and package managers, and runs the nearly-universal commands needed to build a program.  Most of the commands would simply give an error and exit, but hopefully the correct one will proceed with the install.&lt;br /&gt;
&lt;br /&gt;
One of the more subtle jokes in the comic is the inclusion of &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; in the same script. Good unix practice dictates never logging in as root; instead you stay logged in as your normal user, and run system admin accounts via &amp;lt;code&amp;gt;sudo program name&amp;lt;/code&amp;gt;. This prevents accidental errors and enables logging of all sensitive commands. A side effect of this, however, is that an administrator may forget to prefix her command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, and re-running it properly the second time. This is a common joke in the Linux community, an example of which can be found at [https://twitter.com/liamosaur/status/506975850596536320 viral tweet] which shows a humerous workaround for the issue.&lt;br /&gt;
&lt;br /&gt;
Since Randall's script does not use sudo for any but the &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; command, there are two possibilities: the script itself was run via the root user or via sudo (in which case the &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; is not needed, or the script was run as a normal user, in which case all of the commands will fail (due to lacking necessary permissions) with the possible exception of the &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; one.&lt;br /&gt;
&lt;br /&gt;
Sudo has also been used both by [[Randall]] in [[149: Sandwich]] and by Jason Fox to force Randall to let him appear on xkcd with [[824: Guest Week: Bill Amend (FoxTrot)]].&lt;br /&gt;
&lt;br /&gt;
The tool &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; downloads files from the network (e.g., the Internet). For example &amp;lt;code&amp;gt;curl http://xkcd.com/&amp;lt;/code&amp;gt; downloads and displays the xkcd HTML source. The pipe &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; in the script attaches the output of the command before the pipe to the input of the command after the pipe, thus running whatever commands exist in the web content. Although this &amp;quot;curl|sh&amp;quot; pattern is a common practice for conveniently installing software, it is considered extremely unwise; you are running untrusted code without validation, there may be a MITM who modifies the code you receive, or the remote system could have been hijacked and the code made malicious. Most local package managers (e.g. &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum&amp;lt;/code&amp;gt;) offer digitally-signed packages that thwart this problem. You can find many examples of software providers suggesting a &amp;lt;code&amp;gt;curl|sh&amp;lt;/code&amp;gt; solution at [https://curlpipesh.tumblr.com/ curlpipesh]&lt;br /&gt;
&lt;br /&gt;
The use of &amp;amp; at the end of each line causes the shell interpreter to execute the commands in parallel (asynchronously) instead of sequentially. Even if single commands fail, the rest of them will be executed. Note this is even the case for the final commands which attempt to change to the installed package, probably the only reason why this may not work completely for packages that do need compiling after being downloaded. (However, just running this script again would probably do the trick.)&lt;br /&gt;
&lt;br /&gt;
There appears to be a bug with the &amp;amp; at the end of the &amp;quot;git clone&amp;quot; line; since a git repository typically contains program source code, not executables, it may have been intended to retrieve the source code with git and then compile and install the program in the next line. In this case, the single &amp;amp; should be replaced with &amp;amp;&amp;amp;, an operator that will run the second command only if the first one has completed successfully. This plays into a second bug on the &amp;quot;configure&amp;quot; line, where the placement of the &amp;amp; means that only the &amp;quot;make install&amp;quot; command will be run asynchronously after the &amp;quot;configure&amp;quot; and &amp;quot;make&amp;quot; steps have finished in sequence. To make success as likely as possible, the two lines should be like this:&lt;br /&gt;
&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;https://github.com/&amp;lt;/nowiki&amp;gt;&amp;quot;$1&amp;quot;/&amp;quot;$1&amp;quot; &amp;amp;&amp;amp; (cd &amp;quot;$1&amp;quot;; ./configure; make; make install) &amp;amp;&lt;br /&gt;
&lt;br /&gt;
The title text mentions the possibility that the same program may be in multiple repositories, so in this case, the script will download and install several versions, or it may fail on a number of repositories, in which case usually nothing bad happens. Since all the commands come from different operating systems, versions, or distributions, it is not very likely that more than one will work (with the exception of pip/easy_install and the two forms of apt-get) or even exist on the same system. It mentions that adding a way of automatically saying &amp;quot;yes&amp;quot; to questions asked during the different repository-fetching programs' running, by making them read input from another program that writes a (nearly) endless stream of &amp;quot;y&amp;quot;s, could simplify things further. &amp;lt;code&amp;gt;2&amp;gt;/dev/null&amp;lt;/code&amp;gt; redirects the second output stream (the &amp;quot;error stream&amp;quot;) to the null device driver, which discards all writes to it, meaning errors (the package not existing) will not be sent to the screen.&lt;br /&gt;
&lt;br /&gt;
==Transcript==&lt;br /&gt;
:[In the panel is a shell script which, unusual for xkcd, uses only lower case. At the top the title of the program is inlaid in the frame, which has been broken here.]&lt;br /&gt;
:&amp;lt;big&amp;gt;Install.sh&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#!/bin/bash&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:pip install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:easy_install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:brew install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:npm install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:yum install &amp;quot;$1&amp;quot; &amp;amp; dnf install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:docker run &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:pkg install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:apt-get install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:sudo apt-get install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:steamcmd +app_update &amp;quot;$1&amp;quot; validate &amp;amp;&lt;br /&gt;
:git clone &amp;lt;nowiki&amp;gt;https://github.com/&amp;lt;/nowiki&amp;gt;&amp;quot;$1&amp;quot;/&amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:cd &amp;quot;$1&amp;quot;;./configure;make;make install &amp;amp;&lt;br /&gt;
:curl &amp;quot;$1&amp;quot; | bash &amp;amp;&lt;br /&gt;
&lt;br /&gt;
==Trivia==&lt;br /&gt;
*pip and easy install are package managers for {{w|Python (programming language)|Python}}&lt;br /&gt;
*brew is the successor/replacement for {{w|MacPorts}} and a third-party package manager for OS X&lt;br /&gt;
*{{w|npm (software)|npm}} is the node package manager that maintains node.js packages&lt;br /&gt;
*{{w|Yellowdog Updater, Modified|yum}} is the package management tool for {{w|Red Hat Enterprise Linux}} and some derivatives&lt;br /&gt;
*{{w|DNF (software)|dnf}} is the package management tool for {{w|Fedora (operating system)|Fedora}} since version 22&lt;br /&gt;
*docker run is a {{w|Docker (software)|Docker}} command that runs a given container (similar to a virtual machine)&lt;br /&gt;
*pkg is the package management tool on {{w|Berkeley Software Distribution|BSD systems}}&lt;br /&gt;
*apt-get is the package management tool of {{w|Debian}} and derivatives (e.g. Ubuntu)&lt;br /&gt;
*steamcmd refers to {{w|Steam (software)|Steam}}, the computer game client&lt;br /&gt;
*git is the revision control software used for many projects and gained a lot of traction through the {{w|GitHub}} platform&lt;br /&gt;
*configure/make/make install refers to the standard way of compiling software from source (on Linux/Unix)&lt;br /&gt;
*curl is a tool for loading data via http:// (i.e. from a website), this data is then pushed to the shell interpreter (in order to install)&lt;br /&gt;
**Note: While this is a security nightmare, some projects (like Homebrew) still use it as the preferred or only method of installation.&lt;br /&gt;
&lt;br /&gt;
{{comic discussion}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Daethnir</name></author>	</entry>

	<entry>
		<id>https://www.explainxkcd.com/wiki/index.php?title=1654:_Universal_Install_Script&amp;diff=114883</id>
		<title>1654: Universal Install Script</title>
		<link rel="alternate" type="text/html" href="https://www.explainxkcd.com/wiki/index.php?title=1654:_Universal_Install_Script&amp;diff=114883"/>
				<updated>2016-03-14T14:24:15Z</updated>
		
		<summary type="html">&lt;p&gt;Daethnir: Fleshes out curl|sh usage and warnings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{comic&lt;br /&gt;
| number    = 1654&lt;br /&gt;
| date      = March 11, 2016&lt;br /&gt;
| title     = Universal Install Script&lt;br /&gt;
| image     = universal_install_script.png&lt;br /&gt;
| titletext = The failures usually don't hurt anything, and if it installs several versions, it increases the chance that one of them is right. (Note: The 'yes' command and '2&amp;gt;/dev/null' are recommended additions.)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Most users of computers today are used to simple, easy installation of programs. You just download a .exe or a .pkg, double click it, and do what it says. Sometimes you don't even have to install anything at all, and it runs without any installation.&lt;br /&gt;
&lt;br /&gt;
However, when things are more &amp;quot;homebrew&amp;quot;, for example downloading source code, things are more complicated.  Under {{w|Unix-like}} systems, which this universal install script is designed for, you may have to work with &amp;quot;build environments&amp;quot; and &amp;quot;makefiles&amp;quot;, and command line tools. To make this process simpler, there exist repositories of programs which host either packages of source code and the things needed to build it or the pre-built programs. When you download the package, it automatically does most of the work of building the code into something executable if necessary and then installing it. However, there are many such repositories, such as &amp;quot;pip&amp;quot; and &amp;quot;brew&amp;quot;, among others listed in the comic. If you only know the name of a program or package, you may not know in which repository(ies) it resides.&lt;br /&gt;
&lt;br /&gt;
The script provided in the comic attempts to fix this problem, by giving a &amp;quot;universal install script&amp;quot;, which contains a lot of common install commands used in various Unix-like systems. In between each of the install commands in the script is the &amp;amp; character, which in POSIX-compatible shells (including {{w|Bash (Unix shell)|Bash}}, a popular shell scripting language) means it should continue to run the next command without waiting for the first command to finish, also known as &amp;quot;running in the background&amp;quot;.  This has the effect of running all the install commands simultaneously; all output and error text provided by the will be mixed together as they are all displaying on the screen around the same time.  More about the &amp;amp; below.&lt;br /&gt;
&lt;br /&gt;
The script accepts the name of a program when you run it as an argument. This value is then referenced as &amp;quot;$1&amp;quot; (argument number 1). Everywhere the script says &amp;quot;$1&amp;quot;, it substitutes in the name of the package you gave it. The end result is the name being tried against a large number of software repositories and package managers, and hopefully, at least one of them will be appropriate and the program will be successfully installed. Near the end, it even tries changing the current working directory to that which is assumed to hold the package to be installed, and then runs several commands which build the program from source code.&lt;br /&gt;
&lt;br /&gt;
All in all, this script would probably work; it runs many standard popular repository programs and package managers, and runs the nearly-universal commands needed to build a program.  Most of the commands would simply give an error and exit, but hopefully the correct one will proceed with the install.&lt;br /&gt;
&lt;br /&gt;
One of the more subtle jokes in the comic is the inclusion of &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; in the same script. Good unix practice dictates never logging in as root; instead you stay logged in as your normal user, and run system admin accounts via &amp;lt;code&amp;gt;sudo program name&amp;lt;/code&amp;gt;. This prevents accidental errors and enables logging of all sensitive commands. A side effect of this, however, is that an administrator may forget to prefix her command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, and re-running it properly the second time. This is a common joke in the Linux community, an example of which can be found at [https://twitter.com/liamosaur/status/506975850596536320 viral tweet] which shows a humerous workaround for the issue.&lt;br /&gt;
&lt;br /&gt;
Since Randall's script does not use sudo for any but the &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; command, there are two possibilities: the script itself was run via the root user or via sudo (in which case the &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; is not needed, or the script was run as a normal user, in which case all of the commands will fail (due to lacking necessary permissions) with the possible exception of the &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; one.&lt;br /&gt;
&lt;br /&gt;
Sudo has also been used both by [[Randall]] in [[149: Sandwich]] and by Jason Fox to force Randall to let him appear on xkcd with [[824: Guest Week: Bill Amend (FoxTrot)]].&lt;br /&gt;
&lt;br /&gt;
The tool &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; downloads files from the network (e.g., the Internet). For example &amp;lt;code&amp;gt;curl http://xkcd.com/&amp;lt;/code&amp;gt; downloads and displays the xkcd HTML source. The pipe &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; in the script attaches the output of the command before the pipe to the input of the command after the pipe, thus running whatever commands exist in the web content. Although this &amp;quot;curl|sh&amp;quot; pattern is a common practice for conveniently installing software, it is considered extremely unwise; you are running untrusted code without validation, there may be a MITM who modifies the code you receive, or the remote system could have been hijacked and the code made malicious. Most local package managers (e.g. &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum&amp;lt;/code&amp;gt;) offer digitally-signed packages that thwart this problem. You can find many examples of software providers suggesting a &amp;lt;code&amp;gt;curl|sh&amp;lt;/code&amp;gt; solution at [https://curlpipesh.tumblr.com/ curlpipesh]&lt;br /&gt;
&lt;br /&gt;
The use of &amp;amp; at the end of each line causes the shell interpreter to execute the commands in parallel (asynchronously) instead of sequentially. Even if single commands fail, the rest of them will be executed. Note this is even the case for the final commands which attempt to change to the installed package, probably the only reason why this may not work completely for packages that do need compiling after being downloaded. (However, just running this script again would probably do the trick.)&lt;br /&gt;
&lt;br /&gt;
There appears to be a bug with the &amp;amp; at the end of the &amp;quot;git clone&amp;quot; line; since a git repository typically contains program source code, not executables, it may have been intended to retrieve the source code with git and then compile and install the program in the next line. In this case, the single &amp;amp; should be replaced with &amp;amp;&amp;amp;, an operator that will run the second command only if the first one has completed successfully. This plays into a second bug on the &amp;quot;configure&amp;quot; line, where the placement of the &amp;amp; means that only the &amp;quot;make install&amp;quot; command will be run asynchronously after the &amp;quot;configure&amp;quot; and &amp;quot;make&amp;quot; steps have finished in sequence. To make success as likely as possible, the two lines should be like this:&lt;br /&gt;
&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;https://github.com/&amp;lt;/nowiki&amp;gt;&amp;quot;$1&amp;quot;/&amp;quot;$1&amp;quot; &amp;amp;&amp;amp; (cd &amp;quot;$1&amp;quot;; ./configure; make; make install) &amp;amp;&lt;br /&gt;
&lt;br /&gt;
The title text mentions the possibility that the same program may be in multiple repositories, so in this case, the script will download and install several versions, or it may fail on a number of repositories, in which case usually nothing bad happens. Since all the commands come from different operating systems, versions, or distributions, it is not very likely that more than one will work (with the exception of pip/easy_install and the two forms of apt-get) or even exist on the same system. It mentions that adding a way of automatically saying &amp;quot;yes&amp;quot; to questions asked during the different repository-fetching programs' running, by making them read input from another program that writes a (nearly) endless stream of &amp;quot;y&amp;quot;s, could simplify things further. &amp;lt;code&amp;gt;2&amp;gt;/dev/null&amp;lt;/code&amp;gt; redirects the second output stream (the &amp;quot;error stream&amp;quot;) to the null device driver, which discards all writes to it, meaning errors (the package not existing) will be ignored.&lt;br /&gt;
&lt;br /&gt;
==Transcript==&lt;br /&gt;
:[In the panel is a shell script which, unusual for xkcd, uses only lower case. At the top the title of the program is inlaid in the frame, which has been broken here.]&lt;br /&gt;
:&amp;lt;big&amp;gt;Install.sh&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#!/bin/bash&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:pip install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:easy_install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:brew install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:npm install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:yum install &amp;quot;$1&amp;quot; &amp;amp; dnf install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:docker run &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:pkg install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:apt-get install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:sudo apt-get install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:steamcmd +app_update &amp;quot;$1&amp;quot; validate &amp;amp;&lt;br /&gt;
:git clone &amp;lt;nowiki&amp;gt;https://github.com/&amp;lt;/nowiki&amp;gt;&amp;quot;$1&amp;quot;/&amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:cd &amp;quot;$1&amp;quot;;./configure;make;make install &amp;amp;&lt;br /&gt;
:curl &amp;quot;$1&amp;quot; | bash &amp;amp;&lt;br /&gt;
&lt;br /&gt;
==Trivia==&lt;br /&gt;
*pip and easy install are package managers for {{w|Python (programming language)|Python}}&lt;br /&gt;
*brew is the successor/replacement for {{w|MacPorts}} and a third-party package manager for OS X&lt;br /&gt;
*{{w|npm (software)|npm}} is the node package manager that maintains node.js packages&lt;br /&gt;
*{{w|Yellowdog Updater, Modified|yum}} is the package management tool for {{w|Red Hat Enterprise Linux}} and some derivatives&lt;br /&gt;
*{{w|DNF (software)|dnf}} is the package management tool for {{w|Fedora (operating system)|Fedora}} since version 22&lt;br /&gt;
*docker run is a {{w|Docker (software)|Docker}} command that runs a given container (similar to a virtual machine)&lt;br /&gt;
*pkg is the package management tool on {{w|Berkeley Software Distribution|BSD systems}}&lt;br /&gt;
*apt-get is the package management tool of {{w|Debian}} and derivatives (e.g. Ubuntu)&lt;br /&gt;
*steamcmd refers to {{w|Steam (software)|Steam}}, the computer game client&lt;br /&gt;
*git is the revision control software used for many projects and gained a lot of traction through the {{w|GitHub}} platform&lt;br /&gt;
*configure/make/make install refers to the standard way of compiling software from source (on Linux/Unix)&lt;br /&gt;
*curl is a tool for loading data via http:// (i.e. from a website), this data is then pushed to the shell interpreter (in order to install)&lt;br /&gt;
**Note: While this is a security nightmare, some projects (like Homebrew) still use it as the preferred or only method of installation.&lt;br /&gt;
&lt;br /&gt;
{{comic discussion}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Daethnir</name></author>	</entry>

	<entry>
		<id>https://www.explainxkcd.com/wiki/index.php?title=1654:_Universal_Install_Script&amp;diff=114882</id>
		<title>1654: Universal Install Script</title>
		<link rel="alternate" type="text/html" href="https://www.explainxkcd.com/wiki/index.php?title=1654:_Universal_Install_Script&amp;diff=114882"/>
				<updated>2016-03-14T14:13:43Z</updated>
		
		<summary type="html">&lt;p&gt;Daethnir: Fixes inaccuracies about use of sudo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{comic&lt;br /&gt;
| number    = 1654&lt;br /&gt;
| date      = March 11, 2016&lt;br /&gt;
| title     = Universal Install Script&lt;br /&gt;
| image     = universal_install_script.png&lt;br /&gt;
| titletext = The failures usually don't hurt anything, and if it installs several versions, it increases the chance that one of them is right. (Note: The 'yes' command and '2&amp;gt;/dev/null' are recommended additions.)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Most users of computers today are used to simple, easy installation of programs. You just download a .exe or a .pkg, double click it, and do what it says. Sometimes you don't even have to install anything at all, and it runs without any installation.&lt;br /&gt;
&lt;br /&gt;
However, when things are more &amp;quot;homebrew&amp;quot;, for example downloading source code, things are more complicated.  Under {{w|Unix-like}} systems, which this universal install script is designed for, you may have to work with &amp;quot;build environments&amp;quot; and &amp;quot;makefiles&amp;quot;, and command line tools. To make this process simpler, there exist repositories of programs which host either packages of source code and the things needed to build it or the pre-built programs. When you download the package, it automatically does most of the work of building the code into something executable if necessary and then installing it. However, there are many such repositories, such as &amp;quot;pip&amp;quot; and &amp;quot;brew&amp;quot;, among others listed in the comic. If you only know the name of a program or package, you may not know in which repository(ies) it resides.&lt;br /&gt;
&lt;br /&gt;
The script provided in the comic attempts to fix this problem, by giving a &amp;quot;universal install script&amp;quot;, which contains a lot of common install commands used in various Unix-like systems. In between each of the install commands in the script is the &amp;amp; character, which in POSIX-compatible shells (including {{w|Bash (Unix shell)|Bash}}, a popular shell scripting language) means it should continue to run the next command without waiting for the first command to finish, also known as &amp;quot;running in the background&amp;quot;.  This has the effect of running all the install commands simultaneously; all output and error text provided by the will be mixed together as they are all displaying on the screen around the same time.  More about the &amp;amp; below.&lt;br /&gt;
&lt;br /&gt;
The script accepts the name of a program when you run it as an argument. This value is then referenced as &amp;quot;$1&amp;quot; (argument number 1). Everywhere the script says &amp;quot;$1&amp;quot;, it substitutes in the name of the package you gave it. The end result is the name being tried against a large number of software repositories and package managers, and hopefully, at least one of them will be appropriate and the program will be successfully installed. Near the end, it even tries changing the current working directory to that which is assumed to hold the package to be installed, and then runs several commands which build the program from source code.&lt;br /&gt;
&lt;br /&gt;
All in all, this script would probably work; it runs many standard popular repository programs and package managers, and runs the nearly-universal commands needed to build a program.  Most of the commands would simply give an error and exit, but hopefully the correct one will proceed with the install.&lt;br /&gt;
&lt;br /&gt;
One of the more subtle jokes in the comic is the inclusion of &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; in the same script. Good unix practice dictates never logging in as root; instead you stay logged in as your normal user, and run system admin accounts via &amp;lt;code&amp;gt;sudo program name&amp;lt;/code&amp;gt;. This prevents accidental errors and enables logging of all sensitive commands. A side effect of this, however, is that an administrator may forget to prefix her command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, and re-running it properly the second time. This is a common joke in the Linux community, an example of which can be found at [https://twitter.com/liamosaur/status/506975850596536320 viral tweet] which shows a humerous workaround for the issue.&lt;br /&gt;
&lt;br /&gt;
Since Randall's script does not use sudo for any but the &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; command, there are two possibilities: the script itself was run via the root user or via sudo (in which case the &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; is not needed, or the script was run as a normal user, in which case all of the commands will fail (due to lacking necessary permissions) with the possible exception of the &amp;lt;code&amp;gt;sudo apt-get&amp;lt;/code&amp;gt; one.&lt;br /&gt;
&lt;br /&gt;
Sudo has also been used both by [[Randall]] in [[149: Sandwich]] and by Jason Fox to force Randall to let him appear on xkcd with [[824: Guest Week: Bill Amend (FoxTrot)]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The tool &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; downloads files from the network (e.g., the Internet). Used like &amp;lt;code&amp;gt;curl http://xkcd.com/&amp;lt;/code&amp;gt; it downloads the xkcd main page and displays the HTML source code. The pipe &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; in the script attaches the output of the command before the pipe to the input of the command after the pipe. Both commands are executed concurrently. Bash is a popular shell for Unix-like operating systems. The line &amp;lt;code&amp;gt;curl &amp;quot;$1&amp;quot; | bash&amp;lt;/code&amp;gt; tries to download a file from the network and to execute the download directly. &amp;lt;!--- Although this is a common practice for conveniently installing software, it is considered extremely insecure and should never be done. [ed. note: there's no reason this cannot be secure, especially if HTTPS with validated certificates is used, from a trusted domain which utilizes DNSSEC] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The use of &amp;amp; at the end of each line causes the shell interpreter to execute the commands in parallel (asynchronously) instead of sequentially. Even if single commands fail, the rest of them will be executed. Note this is even the case for the final commands which attempt to change to the installed package, probably the only reason why this may not work completely for packages that do need compiling after being downloaded. (However, just running this script again would probably do the trick.)&lt;br /&gt;
&lt;br /&gt;
There appears to be a bug with the &amp;amp; at the end of the &amp;quot;git clone&amp;quot; line; since a git repository typically contains program source code, not executables, it may have been intended to retrieve the source code with git and then compile and install the program in the next line. In this case, the single &amp;amp; should be replaced with &amp;amp;&amp;amp;, an operator that will run the second command only if the first one has completed successfully. This plays into a second bug on the &amp;quot;configure&amp;quot; line, where the placement of the &amp;amp; means that only the &amp;quot;make install&amp;quot; command will be run asynchronously after the &amp;quot;configure&amp;quot; and &amp;quot;make&amp;quot; steps have finished in sequence. To make success as likely as possible, the two lines should be like this:&lt;br /&gt;
&lt;br /&gt;
 git clone &amp;lt;nowiki&amp;gt;https://github.com/&amp;lt;/nowiki&amp;gt;&amp;quot;$1&amp;quot;/&amp;quot;$1&amp;quot; &amp;amp;&amp;amp; (cd &amp;quot;$1&amp;quot;; ./configure; make; make install) &amp;amp;&lt;br /&gt;
&lt;br /&gt;
The title text mentions the possibility that the same program may be in multiple repositories, so in this case, the script will download and install several versions, or it may fail on a number of repositories, in which case usually nothing bad happens. Since all the commands come from different operating systems, versions, or distributions, it is not very likely that more than one will work (with the exception of pip/easy_install and the two forms of apt-get) or even exist on the same system. It mentions that adding a way of automatically saying &amp;quot;yes&amp;quot; to questions asked during the different repository-fetching programs' running, by making them read input from another program that writes a (nearly) endless stream of &amp;quot;y&amp;quot;s, could simplify things further. &amp;lt;code&amp;gt;2&amp;gt;/dev/null&amp;lt;/code&amp;gt; redirects the second output stream (the &amp;quot;error stream&amp;quot;) to the null device driver, which discards all writes to it, meaning errors (the package not existing) will be ignored.&lt;br /&gt;
&lt;br /&gt;
==Transcript==&lt;br /&gt;
:[In the panel is a shell script which, unusual for xkcd, uses only lower case. At the top the title of the program is inlaid in the frame, which has been broken here.]&lt;br /&gt;
:&amp;lt;big&amp;gt;Install.sh&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#!/bin/bash&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:pip install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:easy_install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:brew install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:npm install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:yum install &amp;quot;$1&amp;quot; &amp;amp; dnf install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:docker run &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:pkg install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:apt-get install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:sudo apt-get install &amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:steamcmd +app_update &amp;quot;$1&amp;quot; validate &amp;amp;&lt;br /&gt;
:git clone &amp;lt;nowiki&amp;gt;https://github.com/&amp;lt;/nowiki&amp;gt;&amp;quot;$1&amp;quot;/&amp;quot;$1&amp;quot; &amp;amp;&lt;br /&gt;
:cd &amp;quot;$1&amp;quot;;./configure;make;make install &amp;amp;&lt;br /&gt;
:curl &amp;quot;$1&amp;quot; | bash &amp;amp;&lt;br /&gt;
&lt;br /&gt;
==Trivia==&lt;br /&gt;
*pip and easy install are package managers for {{w|Python (programming language)|Python}}&lt;br /&gt;
*brew is the successor/replacement for {{w|MacPorts}} and a third-party package manager for OS X&lt;br /&gt;
*{{w|npm (software)|npm}} is the node package manager that maintains node.js packages&lt;br /&gt;
*{{w|Yellowdog Updater, Modified|yum}} is the package management tool for {{w|Red Hat Enterprise Linux}} and some derivatives&lt;br /&gt;
*{{w|DNF (software)|dnf}} is the package management tool for {{w|Fedora (operating system)|Fedora}} since version 22&lt;br /&gt;
*docker run is a {{w|Docker (software)|Docker}} command that runs a given container (similar to a virtual machine)&lt;br /&gt;
*pkg is the package management tool on {{w|Berkeley Software Distribution|BSD systems}}&lt;br /&gt;
*apt-get is the package management tool of {{w|Debian}} and derivatives (e.g. Ubuntu)&lt;br /&gt;
*steamcmd refers to {{w|Steam (software)|Steam}}, the computer game client&lt;br /&gt;
*git is the revision control software used for many projects and gained a lot of traction through the {{w|GitHub}} platform&lt;br /&gt;
*configure/make/make install refers to the standard way of compiling software from source (on Linux/Unix)&lt;br /&gt;
*curl is a tool for loading data via http:// (i.e. from a website), this data is then pushed to the shell interpreter (in order to install)&lt;br /&gt;
**Note: While this is a security nightmare, some projects (like Homebrew) still use it as the preferred or only method of installation.&lt;br /&gt;
&lt;br /&gt;
{{comic discussion}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Daethnir</name></author>	</entry>

	</feed>