Home > Mobile >  Working bash command breaks when in function or alias
Working bash command breaks when in function or alias

Time:04-13

When I run this command interactively it outputs the expected log name (last modified, per Service name file).

# Gets last active service log in a /environmentsDir/serviceName/var/output/logs directory. You need to cd 1st.
ls -tl | head -n20 | grep $(basename $(pwd | egrep '/environmentsDir/env/[^\/] ' -o)) | head -n1 | awk '{print $(NF)}'

When I try to escape it for an alias expression or a function, can't get it right, always fails for different reasons.

What would be the right way of escaping it, in CLI, to get a function or alias working?

For instance if I'd like to tail that log file the function or alias should allow me to:

lastLog=escaped(ls -tl | head -n20 | grep $(basename $(pwd | egrep '/environmentsDir/env/[^\/] ' -o)) | head -n1 | awk '{print $(NF)}')

tail -f $(lastLog)

Edit:

Adding outputs of trying a function:

21:55:28-user@host:/environmentsDir/env/serviceName/var/output/logs$ ls -tl | head -n20 | grep $(basename $(pwd | egrep '/environmentsDir/env/[^\/] ' -o)) | head -n1 | awk '{print $(NF)}'
serviceName.2022-04-12-21
21:55:33-user@host:/environmentsDir/env/serviceName/var/output/logs$ lastLog() {
logbash: syntax error near unexpected token `('
21:55:42-user@host:/environmentsDir/env/serviceName/var/output/logs$ lastLog() { \
logbash: syntax error near unexpected token `('
21:55:46-user@host:/environmentsDir/env/serviceName/var/output/logs$ lastLog { \
> ls -tl | head -n20 | grep $(basename $(pwd | egrep '/environmentsDir/env/[^\/] ' -o)) | head -n1 | awk '{print $(NF)}'
head: invalid option -- 't'
Try 'head --help' for more information.
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
21:56:10-user@host:/environmentsDir/env/serviceName/var/output/logs$ lastLog() { ls -tl | head -n20 | grep $(basename $(pwd | egrep '/environmentsDir/env/[^\/] ' -o)) | head -n1 | awk '{print $(NF)}'; }
logbash: syntax error near unexpected token `('
21:56:41-user@host:/environmentsDir/env/serviceName/var/output/logs$ lastLog() { ls -tl | head -n20 | grep $(basename $(pwd | egrep '/environmentsDir/env/[^\/] ' -o)) | head -n1 | awk '{print $(NF)}'; }^C
21:56:56-user@host:/environmentsDir/env/serviceName/var/output/logs$ lastLog() {ls -tl | head -n20 | grep $(basename $(pwd | egrep '/environmentsDir/env/[^\/] ' -o)) | head -n1 | awk '{print $(NF)}' ; }
logbash: syntax error near unexpected token `('
21:57:14-user@host:/environmentsDir/env/serviceName/var/output/logs$ lastLog { ls -tl | head -n20 | grep $(basename $(pwd | egrep '/environmentsDir/env/[^\/] ' -o)) | head -n1 | awk '{print $(NF)}' ;  }
logbash: syntax error near unexpected token `}'

# This one doesn't blow up but still fails when executed:
21:57:35-user@host:/environmentsDir/env/serviceName/var/output/logs$ function lastLog { ls -tl | head -n20 | grep $(basename $(pwd | egrep '/environmentsDir/env/[^\/] ' -o)) | head -n1 | awk '{print $(NF)}' ;  }
21:57:47-user@host:/environmentsDir/env/serviceName/var/output/logs$ lastLog 
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

2nd Edit:

@john-kugelman 's answer was correct, and I had already tried it, unsuccessfully. The added problem was, as pointed out by @gordon-davisson 's comment below, I had added an alias with same name as function, which was gaining precedence and was also broken.

CodePudding user response:

The nice thing about functions is that they don't require any special escaping. Just put the command exactly as written inside a function and you're good to go:

lastLog() {
    ls -tl | head -n20 | grep $(basename $(pwd | egrep '/environmentsDir/env/[^\/] ' -o)) | head -n1 | awk '{print $(NF)}'
}

You can type a multi-line function definition at an interactive shell just like that. But if you want it as a one-liner, it would be this, with a semi-colon appended to the command before the closing curly brace:

lastLog() { ls -tl | head -n20 | grep $(basename $(pwd | egrep '/environmentsDir/env/[^\/] ' -o)) | head -n1 | awk '{print $(NF)}'; }

CodePudding user response:

Your function can be simplified, using the shell's parameter expansion:

lastLog() {
  local dirname=${PWD#/environmentDir/env/}     # remove the prefix
  dirname=${dirname%%/*}                        # remove the suffix

  ls -tl *"$dirname"* | head -n1
}
  • Related