finished nushell post
This commit is contained in:
		
							parent
							
								
									48894db4a6
								
							
						
					
					
						commit
						9428a36240
					
				
					 1 changed files with 94 additions and 12 deletions
				
			
		| 
						 | 
					@ -1,7 +1,6 @@
 | 
				
			||||||
+++
 | 
					+++
 | 
				
			||||||
title = "Nushell first impressions"
 | 
					title = "Nushell first impressions"
 | 
				
			||||||
date = 2024-03-01T11:34:04-06:00
 | 
					date = 2024-03-01T11:34:04-06:00
 | 
				
			||||||
draft = true
 | 
					 | 
				
			||||||
+++
 | 
					+++
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Ive been trying out a bunch of new shell utilities lately,
 | 
					Ive been trying out a bunch of new shell utilities lately,
 | 
				
			||||||
| 
						 | 
					@ -59,7 +58,7 @@ Some examples of things that nushell enables with this structured data passing
 | 
				
			||||||
through pipelines includes:
 | 
					through pipelines includes:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{<highlight sh>}}
 | 
					{{<highlight sh>}}
 | 
				
			||||||
# show all files recurisively that were modified in the last week
 | 
					# show all files recursively that were modified in the last week
 | 
				
			||||||
ls **/* | where modified > (
 | 
					ls **/* | where modified > (
 | 
				
			||||||
    # create timestamp from relative human readable string.
 | 
					    # create timestamp from relative human readable string.
 | 
				
			||||||
    '1 week ago' | into datetime
 | 
					    '1 week ago' | into datetime
 | 
				
			||||||
| 
						 | 
					@ -147,7 +146,7 @@ they take.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{<highlight sh>}}
 | 
					{{<highlight sh>}}
 | 
				
			||||||
def recently-modified [cutoff] {
 | 
					def recently-modified [cutoff] {
 | 
				
			||||||
# show all files recurisively that were modified after a specified cutoff
 | 
					# show all files recursively that were modified after a specified cutoff
 | 
				
			||||||
    # show all files recurisively that were modified after a specified cutoff
 | 
					    # show all files recurisively that were modified after a specified cutoff
 | 
				
			||||||
    ls **/* | where modified > (
 | 
					    ls **/* | where modified > (
 | 
				
			||||||
        # create timestamp from input
 | 
					        # create timestamp from input
 | 
				
			||||||
| 
						 | 
					@ -160,7 +159,7 @@ You can optionally give the arguments a type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{<highlight sh>}}
 | 
					{{<highlight sh>}}
 | 
				
			||||||
def recently-modified [cutoff: string] {
 | 
					def recently-modified [cutoff: string] {
 | 
				
			||||||
# show all files recurisively that were modified after a specified cutoff
 | 
					# show all files recursively that were modified after a specified cutoff
 | 
				
			||||||
    # show all files recurisively that were modified after a specified cutoff
 | 
					    # show all files recurisively that were modified after a specified cutoff
 | 
				
			||||||
    ls **/* | where modified > (
 | 
					    ls **/* | where modified > (
 | 
				
			||||||
        # create timestamp from input
 | 
					        # create timestamp from input
 | 
				
			||||||
| 
						 | 
					@ -174,7 +173,7 @@ with a type specification)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{<highlight sh>}}
 | 
					{{<highlight sh>}}
 | 
				
			||||||
def recently-modified [cutoff = '1 week ago'] {
 | 
					def recently-modified [cutoff = '1 week ago'] {
 | 
				
			||||||
    # show all files recurisively that were modified after a specified cutoff
 | 
					    # show all files recursively that were modified after a specified cutoff
 | 
				
			||||||
    ls **/* | where modified > (
 | 
					    ls **/* | where modified > (
 | 
				
			||||||
        # create timestamp from input
 | 
					        # create timestamp from input
 | 
				
			||||||
        $cutoff | into datetime
 | 
					        $cutoff | into datetime
 | 
				
			||||||
| 
						 | 
					@ -189,13 +188,13 @@ absence)
 | 
				
			||||||
{{<highlight sh>}}
 | 
					{{<highlight sh>}}
 | 
				
			||||||
def recently-modified [cutoff: string = '1 week ago' --older-than (-o)] {
 | 
					def recently-modified [cutoff: string = '1 week ago' --older-than (-o)] {
 | 
				
			||||||
    if $older_than {
 | 
					    if $older_than {
 | 
				
			||||||
        # show all files recurisively that were modified after a specified cutoff
 | 
					        # show all files recursively that were modified after a specified cutoff
 | 
				
			||||||
        ls **/* | where modified > (
 | 
					        ls **/* | where modified > (
 | 
				
			||||||
            # create timestamp from input
 | 
					            # create timestamp from input
 | 
				
			||||||
            $cutoff | into datetime
 | 
					            $cutoff | into datetime
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        # show all files recurisively that were modified before a specified cutoff
 | 
					        # show all files recursively that were modified before a specified cutoff
 | 
				
			||||||
        ls **/* | where modified < (
 | 
					        ls **/* | where modified < (
 | 
				
			||||||
            # create timestamp from input
 | 
					            # create timestamp from input
 | 
				
			||||||
            $cutoff | into datetime
 | 
					            $cutoff | into datetime
 | 
				
			||||||
| 
						 | 
					@ -209,7 +208,7 @@ arguments.
 | 
				
			||||||
{{<highlight sh>}}
 | 
					{{<highlight sh>}}
 | 
				
			||||||
def recently-modified [--cutoff = '1 week ago' ...paths] {
 | 
					def recently-modified [--cutoff = '1 week ago' ...paths] {
 | 
				
			||||||
    for $path in $paths {
 | 
					    for $path in $paths {
 | 
				
			||||||
        # show all files recurisively that were modified after a specified cutoff
 | 
					        # show all files recursively that were modified after a specified cutoff
 | 
				
			||||||
        ls $path | where modified > (
 | 
					        ls $path | where modified > (
 | 
				
			||||||
            # create timestamp from input
 | 
					            # create timestamp from input
 | 
				
			||||||
            $cutoff | into datetime
 | 
					            $cutoff | into datetime
 | 
				
			||||||
| 
						 | 
					@ -228,7 +227,7 @@ def recently-modified [
 | 
				
			||||||
    ...paths # paths to consider
 | 
					    ...paths # paths to consider
 | 
				
			||||||
] {
 | 
					] {
 | 
				
			||||||
    for $path in $paths {
 | 
					    for $path in $paths {
 | 
				
			||||||
        # show all files recurisively that were modified after a specified cutoff
 | 
					        # show all files recursively that were modified after a specified cutoff
 | 
				
			||||||
        ls $path | where modified > (
 | 
					        ls $path | where modified > (
 | 
				
			||||||
            # create timestamp from input
 | 
					            # create timestamp from input
 | 
				
			||||||
            $cutoff | into datetime
 | 
					            $cutoff | into datetime
 | 
				
			||||||
| 
						 | 
					@ -271,8 +270,56 @@ but easy in POSIX shells.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Error messages
 | 
					## Error messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Nushell brings with it great, self explanatory error messages.
 | 
					Nushell brings with it great error messages that explain where the error
 | 
				
			||||||
For example, if we do this:
 | 
					occurred. In bash, if we have a loop like:
 | 
				
			||||||
 | 
					{{<highlight sh "linenos=false">}}
 | 
				
			||||||
 | 
					$ for i in $(ls -l | tr -s " " | cut --fields=5 --delimiter=" "); do
 | 
				
			||||||
 | 
					echo "$i / 1000" | bc
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					{{</highlight>}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This gets the sizes of all the files in kib. But what if we typo something?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{<highlight sh "linenos=false">}}
 | 
				
			||||||
 | 
					$ for i in $(ls -l | tr -s " " | cut --fields=6 --delimiter=" "); do
 | 
				
			||||||
 | 
					echo "$i / 1000" | bc
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(standard_in) 1: syntax error
 | 
				
			||||||
 | 
					(standard_in) 1: syntax error
 | 
				
			||||||
 | 
					(standard_in) 1: syntax error
 | 
				
			||||||
 | 
					(standard_in) 1: syntax error
 | 
				
			||||||
 | 
					(standard_in) 1: syntax error
 | 
				
			||||||
 | 
					(standard_in) 1: syntax error
 | 
				
			||||||
 | 
					(standard_in) 1: syntax error
 | 
				
			||||||
 | 
					(standard_in) 1: syntax error
 | 
				
			||||||
 | 
					(standard_in) 1: syntax error
 | 
				
			||||||
 | 
					{{</highlight>}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This error tells you nothing about what went wrong, and your only option is to
 | 
				
			||||||
 | 
					start print debugging.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The equivalent in nushell would be:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{<highlight sh "linenos=false">}}
 | 
				
			||||||
 | 
					> ls | get size | each {|item| $item / 1000}
 | 
				
			||||||
 | 
					{{</highlight>}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If we typo the size column, we get a nice error telling us exactly what we got
 | 
				
			||||||
 | 
					wrong, and where in the pipeline the error and value originated. Much better.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{<highlight sh "linenos=false">}}
 | 
				
			||||||
 | 
					> ls | get szie | each {|item| $item / 1000}
 | 
				
			||||||
 | 
					Error: nu::shell::column_not_found
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  × Cannot find column
 | 
				
			||||||
 | 
					   ╭─[entry #1:1:1]
 | 
				
			||||||
 | 
					 1 │ ls | get szie | each {|item| $item / 1000}
 | 
				
			||||||
 | 
					   · ─┬       ──┬─
 | 
				
			||||||
 | 
					   ·  │         ╰── cannot find column 'szie'
 | 
				
			||||||
 | 
					   ·  ╰── value originates here
 | 
				
			||||||
 | 
					   ╰────
 | 
				
			||||||
 | 
					{{</highlight>}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Whats not there yet
 | 
					## Whats not there yet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -289,4 +336,39 @@ invoking them from within nu treats them as external commands,
 | 
				
			||||||
meaning they take in and pass out plain text,
 | 
					meaning they take in and pass out plain text,
 | 
				
			||||||
rather than the structured data that you would get with a proper custom command
 | 
					rather than the structured data that you would get with a proper custom command
 | 
				
			||||||
or nu builtin.
 | 
					or nu builtin.
 | 
				
			||||||
//explain the best workaround.
 | 
					The best workaround Ive found so far is instead of making scripts that you run
 | 
				
			||||||
 | 
					directly, you define a custom command in the script file, `use` that file, and
 | 
				
			||||||
 | 
					then run the custom command, like this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{<highlight sh>}}
 | 
				
			||||||
 | 
					# recently-modified.nu
 | 
				
			||||||
 | 
					# display recently modified files
 | 
				
			||||||
 | 
					def recently-modified [
 | 
				
			||||||
 | 
					    --cutoff = '1 week ago' # cutoff to be considered 'recently modified'
 | 
				
			||||||
 | 
					    ...paths # paths to consider
 | 
				
			||||||
 | 
					] {
 | 
				
			||||||
 | 
					    for $path in $paths {
 | 
				
			||||||
 | 
					        # show all files recursively that were modified after a specified cutoff
 | 
				
			||||||
 | 
					        ls $path | where modified > (
 | 
				
			||||||
 | 
					            # create timestamp from input
 | 
				
			||||||
 | 
					            $cutoff | into datetime
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					{{</highlight>}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{<highlight sh "linenos=false">}}
 | 
				
			||||||
 | 
					> use recently-modified.sh
 | 
				
			||||||
 | 
					> recently-modifiued --cutoff '2 weeks ago' ./
 | 
				
			||||||
 | 
					{{</highlight>}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Its certainly not the most ergonomic, but seems to be the best way at the moment
 | 
				
			||||||
 | 
					to make 'scripts' that are integrated with the rest of nushell.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## So, overall, is it worth it?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Nushell is certainly an interesting project, and I will almost certainly be
 | 
				
			||||||
 | 
					continuing to use it as my daily shell. It cant do everything, but dropping into
 | 
				
			||||||
 | 
					zsh for a task or two every once in a while isnt that big a deal for me, and
 | 
				
			||||||
 | 
					having access to such a powerful shell by default has made other tasks much
 | 
				
			||||||
 | 
					easier for me.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue