Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
Inside a groovy script (for a jenkins pipeline): How can I run a
bash
command instead of a
sh
command?
I have tried the following:
Call "
#!/bin/bash
" inside the
sh
call:
stage('Setting the variables values') {
steps {
sh '''
#!/bin/bash
echo "hello world"
Replace the sh
call with a bash
call:
stage('Setting the variables values') {
steps {
bash '''
#!/bin/bash
echo "hello world"
Additional Info:
My command is more complex than a echo hello world
.
–
–
–
–
The Groovy script you provided is formatting the first line as a blank line in the resultant script. The shebang, telling the script to run with /bin/bash instead of /bin/sh, needs to be on the first line of the file or it will be ignored.
So instead, you should format your Groovy like this:
stage('Setting the variables values') {
steps {
sh '''#!/bin/bash
echo "hello world"
And it will execute with /bin/bash.
–
–
–
–
–
For multi-line shell scripts or those run multiple times, I would create a new bash script file (starting from #!/bin/bash
), and simply run it with sh
from Jenkinsfile:
sh 'chmod +x ./script.sh'
sh './script.sh'
I'm sure that the above answers work perfectly. However, I had the difficulty of adding the double quotes as my bash lines where closer to 100. So, the following way helped me. (In a nutshell, no double quotes around each line of the shell)
Also, when I had "bash '''#!/bin/bash" within steps, I got the following error java.lang.NoSuchMethodError: No such DSL method '**bash**' found among steps
pipeline {
agent none
stages {
stage ('Hello') {
agent any
steps {
echo 'Hello, '
sh '''#!/bin/bash
echo "Hello from bash"
echo "Who I'm $SHELL"
The result of the above execution is
If you want to change your default shell to bash
for all projects on Jenkins, you can do so in the Jenkins config through the web portal:
Manage Jenkins > Configure System (Skip this clicking if you want by just going to https://{YOUR_JENKINS_URL}/configure
.)
Fill in the field marked 'Shell executable' with the value /bin/bash
and click 'Save'.
In my case, I had to execute a Shell script in bash via jenkinsfile
. Here's what worked for me :
sh 'core_devops/automation/scripts/ecs_initialize.sh'
And the first line in the script had
#!/bin/bash
The problem is indeed that the shebang is ignored if it doesn't start at the very beginning of the file.
As an alternative to mangling the formatting for Jenkinsfile
readers, I've taken to using this:
sh label: 'Run fancy bash script',
script: '''
#!/usr/bin/env bash
echo "Hello ${SHELL}!"
'''.stripIndent().stripLeading()
Note that stripIndent()
is not strictly necessary for it to work, but Jenkins logs are a lot nicer with it.
return "Hello /bin/sh"...
after some search I found "sh" was "dash" instead of bash on another terminal
Ubuntu22 :
jenkins@ubuntu22:~$ command -v sh
/usr/bin/sh
jenkins@ubuntu22:~$ ls -l /usr/bin/sh
lrwxrwxrwx 1 root root 4 Mar 23 2022 /usr/bin/sh -> dash
jenkins@ubuntu22:~$ command -v dash
/usr/bin/dash
on my old Red Hat 7.4 :
[jenkins@RH7.4 ~]$ command -v sh
/usr/bin/sh
[jenkins@RH7.4 ~]$ ls -l /usr/bin/sh
lrwxrwxrwx 1 root root 4 Sep 6 2018 /usr/bin/sh -> bash
[jenkins@RH7.4 ~]$ command -v bash
/usr/bin/bash
[jenkins@RH7.4 ~]$ ls -l /usr/bin/bash
-rwxr-xr-x 1 root root 960632 Aug 3 2017 /usr/bin/bash
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.