Using AI to Explain Unfamiliar Command Lines from the Internet

Let's use ChatGPT to explain how complex command lines work.

Using AI to Explain Unfamiliar Command Lines from the Internet

We've all been there.

You are trying to do something that requires a command line for some utility that you barely use.  You head over to Google Dot Com and ask the magic search monkey to find you the answer:

git command to restore a single file from a specific commit

The above link takes us to this Stack Overflow question:

How can I reset or revert a file to a specific revision?
How can I revert a modified file to its previous revision at a specific commit hash (which I determined via git log and git diff)?

Here's an excerpt from the accepted answer:

Assuming the hash of the commit you want is c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

Blind Faith is Dangerous on the Internet

Now, you can get yourself into a lot of trouble by just blindly copying command lines from the internet.  

They often contain flags that may or may not apply to your unique situation, the command may not do quite what you expect, or it may just be flat wrong.  Before running any command from the internet, you should (at a minimum) know what each part of the command is doing.

In the past, this could be tedious as you might have to look up the meaning of several flags and optional parameters.  But with ChatGPT, you can short-circuit that approach with a simple prompt.

ChatGPT Prompt

Please annotate the following command line:

```
{command line goes here}
```

That's all it takes for ChatGPT (or your LLM of choice) to provide you with an explanation of the relevant parts of the command line.

Examples

Git Restore File From Previous Commit


Prompt

Please annotate the following command line:

git checkout c5f567 -- file1/to/restore file2/to/restore
Response

Certainly! The command you've provided is a git command that interacts with the version control system:

git checkout c5f567 -- file1/to/restore file2/to/restore

Here's a breakdown of each part of the command:

git: The command-line tool for using Git, the version control system.

checkout: A sub-command of git that is used to switch branches or restore working tree files.

c5f567: This is a commit hash (or a portion of it). In Git, every commit is identified by a unique SHA-1 hash. This particular hash represents the state of the repository at the point in history identified by this hash. The checkout command will use this hash to know which version of the files to restore.

--: The double dash -- is used to separate the commit hash from the file paths that follow it. This is a common pattern in command-line utilities to signify the end of command options and the beginning of a list of arguments or files.

file1/to/restore: This is the path to the first file that you want to restore from the specified commit. The path is relative to the root directory of the Git repository.

file2/to/restore: This is the path to the second file that you want to restore from the specified commit, also relative to the root of the Git repository.

What this command does is to check out the specific versions of file1/to/restore and file2/to/restore from the commit c5f567, without affecting other files in the working directory or switching branches. This is useful if you want to restore specific files from an earlier state without altering the state of your current branch or working on other files.

Keep in mind that this command will overwrite the files in your current working directory with the versions from the specified commit. If you have any uncommitted changes in those files, they will be lost unless you've stashed them or committed them to a different branch. Always make sure that you're okay with losing your current changes before running such a command.


Commentary

That last paragraph from ChatGPT is especially valuable.

Nothing in the original answer mentions the fact that this command will overwrite your existing files.  That may be obvious to an experienced Git user, but it would come as a surprise to a Mercurial/TortoiseHg user, as the equivalent TortoiseHg command automatically appends the source revision number to the restored file.

Here are a few other examples:

Advanced Directory Command

In my article yesterday, I included the following command to list all files in a folder that ended with .log in descending date modified order:

dir /P /O-D *.log


Prompt

Please annotate the following command line:

dir /P /O-D *.log
Response

The command you've provided is a dir command, which is used in the Windows Command Prompt to list the files and directories contained in a directory:

dir /P /O-D *.log

Let's break down each part of the command:

dir: This is the command used in the Command Prompt to display a list of files and directories within the current directory or a specified directory.

/P: This is a switch that tells the dir command to pause after each screenful of information. When the output of dir is too long to fit on one screen, the /P option allows you to view one 'page' of file listings at a time, waiting for you to press a key before it shows the next page.

/O: This is a switch that is used to sort the output according to some criteria. The -D immediately following it is a parameter for the /O switch.

-D: When used with the /O switch, this parameter specifies that the output should be sorted by date, with the newest files listed first. If you were to use /OD without the hyphen (as in /OD), it would sort the oldest files first.

*.log: This is the search pattern the dir command will use to filter which files to display. The * is a wildcard character that matches any string of characters, and .log specifies that the file name should end with the .log extension. So, *.log will match all files that have a .log extension.

In summary, the dir /P /O-D *.log command will list all .log files in the current directory in descending order by date (newest first), pausing after each screenful of data to allow you to read the output. This command is useful when you have a directory with many log files and you want to view them starting with the most recent ones.


Commentary

You get the idea.

Is this information easily available on the web?  Yes.

Would it take way longer to look up each piece of the command individually? Absolutely.

Using ChatGPT to explain complex command lines can save you considerable time while still ensuring that you understand what it is you are doing.

But that brings me to my final caveat, and it's a BIG ONE!

ChatGPT Reads Like a Mentor But Writes Like an Intern

This is something that will likely change sooner rather than later, but I would not currently trust AI to write a complicated command line for me.

It's way too likely to hallucinate non-existent flags, combine optional parameters from similarly named commands, etc.  As I wrote about recently, ChatGPT is better at reading code than writing it.  The same is true for complex command lines.

So, by all means, ask ChatGPT to explain how a command line works.  

But be very careful asking it to write a command line for you.

ChatGPT: Genius or Fraud?
There’s an ongoing debate over whether developers can trust the current crop of LLMs. The problem is people are asking the wrong question.

Acknowledgements
  • Portions of this article's body generated with the help of ChatGPT (obviously)

All original code samples by Mike Wolfe are licensed under CC BY 4.0