1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-15 04:58:02 +00:00
Files
til/unix/diff-two-files-in-unified-format.md
2026-01-10 13:28:46 -06:00

79 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Diff Two Files In Unified Format
The `diff` command is a standalone utility that can be used to get the
difference between two files. It is similar to what you might expect when
running `git diff` which compares two different versions of the same file. The
`diff` command predates `git` and its unified format is what became the standard
that `git` uses for its own diff implementation.
Running `diff` with two files as is gives output like the following:
```bash
diff startup.sh startup2.sh
10,13c10,14
< declare -A SESSIONS=(
< ["TIL"]="$HOME/dev/jbranchaud/til:setup_til"
< ["PLP"]="$HOME/dev/jbranchaud/pool-league-pro:"
< ["client-app"]="$HOME/dev/client/client-app:"
---
> # Sessions will be created in the order listed here
> SESSIONS=(
> "TIL:$HOME/dev/jbranchaud/til:setup_til"
> "PLP:$HOME/dev/jbranchaud/pool-league-pro:"
> "client-app:$HOME/dev/client/client-app:"
73,74c74,75
< for session_name in TIL PLP client-app; do
< IFS=':' read -r directory setup_function <<<"${SESSIONS[$session_name]}"
---
> for session_config in "${SESSIONS[@]}"; do
> IFS=':' read -r session_name directory setup_function <<<"$session_config"
```
That's readable at a glance, but the unified format (with the `-u` flag) can
provide more context:
```bash
diff -u startup.sh startup2.sh
--- startup.sh 2026-01-10 12:46:52
+++ startup2.sh 2026-01-10 12:48:00
@@ -7,10 +7,11 @@
# Session configurations
# Format: "session_name:directory:setup_function"
-declare -A SESSIONS=(
- ["TIL"]="$HOME/dev/jbranchaud/til:setup_til"
- ["PLP"]="$HOME/dev/jbranchaud/pool-league-pro:"
- ["client-app"]="$HOME/dev/client/client-app:"
+# Sessions will be created in the order listed here
+SESSIONS=(
+ "TIL:$HOME/dev/jbranchaud/til:setup_til"
+ "PLP:$HOME/dev/jbranchaud/pool-league-pro:"
+ "client-app:$HOME/dev/client/client-app:"
)
# Setup function for TIL session
@@ -70,8 +71,8 @@
echo ""
# Create sessions in order
- for session_name in TIL PLP client-app; do
- IFS=':' read -r directory setup_function <<<"${SESSIONS[$session_name]}"
+ for session_config in "${SESSIONS[@]}"; do
+ IFS=':' read -r session_name directory setup_function <<<"$session_config"
create_session "$session_name" "$directory" "$setup_function"
done
```
Here we get additional context like surrounding lines and file name details.
While this is useful on its own, it also has the added benefit of making the
output compatible with other tools we may already be using. For instance, I'm
already using [delta](https://github.com/dandavison/delta) as my [git pager](https://github.com/jbranchaud/dotfiles/blob/main/gitconfig#L51) and [git differ](https://github.com/jbranchaud/dotfiles/blob/main/gitconfig#L139).
With the unified format, I can pipe the output directly to `delta` to get a
better view of the diff that is colorized and includes syntax highlighting.
```bash
diff -u startup.sh startup2.sh | delta
```