Make a bash script detect the directory it's stored in, to access data there

By: ; Date: 2016-09-19 15:52

Tags: Shell Scripts » Linux Hints » Node.js Web Development » Node.JS

You may need to write a bash shell script that accesses data stored alongside the script, while your current working directory might be elsewhere. In my case the shell script needed to use Node.js scripts stored next to the shell scripts -- the shell script acting to simplify running the Node.js scripts. The "data" to be accessed in this case is the Node.js scripts, plus the support modules required to run them. You may have other data like a list of hostnames or who-knows-what.

The basic outline is

  • A directory storing one or more shell scripts
  • Data or other scripts in that directory
  • The need to perform work using those scripts but acting on other data elsewhere in the system

It comes down to a simple question - Can a Bash script tell which directory it is stored in? Or, how to get the path of the directory in which a Bash script is located FROM that Bash script?

The answer is easy - one must understand two of the normal commands installed on Unix-like systems: basename and dirname

The other thing to understand is that the $0 parameter contains the full pathname of the script being run.

$ sh opuc16/a.sh
opuc16/a.sh
$ sh ~/work/opuc16/a.sh
/Users/david/work/opuc16/a.sh
$ cat /Users/david/work/opuc16/a.sh
echo $0

Now, if we change the script a little bit:

$ cat /Users/david/work/opuc16/a.sh
echo script path = $0
echo basename = `basename $0`
echo dirname = `dirname $0`

Then run it again

$ sh ~/work/opuc16/a.sh
script path = /Users/david/work/opuc16/a.sh
basename = a.sh
dirname = /Users/david/work/opuc16

Now you can see a path forward, yes? The $0 variable has the full pathname, and it's easy to determine the directory the script is stored in.

Your shell script might start with this:

scriptdir=`dirname $0`

Then for anything the shell script wants to access in its home directory

node ${scriptdir}/script1
node ${scriptdir}/script2
node ${scriptdir}/script3

Likewise any data can be accessed the same way.

For a Node.js script, the search for modules begins in the directory containing the script being executed. Therefore the directory should contain a package.json file listing the dependencies, and you must run npm install in that directory to install those dependencies. With that small bit of setup, the script can be run from anywhere on the computer and the Node.js scripts will execute correctly.

« OpenMediaVault on Raspberry PI 3 - Plex Media Server Plugin Canon introduces a new mirrorless digital camera, Canon EOS M5, 24 MPixels of goodness »
2016 Election Acer C720 Ad block AkashaCMS Android Apple Apple Hardware History Apple iPhone Hardware April 1st Arduino ARM Compilation Asynchronous Programming Authoritarianism Automated Social Posting Bells Law Big Brother Blade Runner Blogger Blogging Books Botnet Botnets Cassette Tapes Cellphones Christopher Eccleston Chrome Chrome Apps Chromebook Chromebooks Chromebox ChromeOS CIA CitiCards Civil Liberties Clinton Cluster Computing Command Line Tools Computer Hardware Computer Repair Computers Cross Compilation Crouton Cyber Security Cybermen Daleks Darth Vader Data backup Data Storage Database Database Backup Databases David Tenant DDoS Botnet Detect Adblocker Digital Photography DIY DIY Repair Docker Doctor Who Doctor Who Paradox Drobo Drupal Drupal Themes DVD Election Hacks Emdebian Enterprise Node ESP8266 Ethical Curation Eurovision Event Driven Asynchronous Express Facebook Fake News File transfer without iTunes FireFly Fraud Freedom of Speech Gallifrey git Gitlab GMAIL Google Google Chrome Google Gnome Google+ Government Spying Great Britain Home Automation HTTPS I2C Protocol Image Conversion Image Processing ImageMagick InfluxDB Internet Internet Advertising Internet Law Internet of Things Internet Policy Internet Privacy iOS Devices iPad iPhone iPhone hacking Iron Man Iternet of Things iTunes Java JavaScript JavaScript Injection JDBC John Simms Joyent Lets Encrypt LibreOffice Linux Linux Hints Linux Single Board Computers Logging Mac OS Mac OS X Matt Lucas MEADS Anti-Missile Mercurial Michele Gomez Military Hardware Missy Mobile Applications MODBUS Mondas Monty Python MQTT Music Player Music Streaming MySQL NanoPi Nardole Net Neutrality Node Web Development Node.js Node.js Database Node.js Testing Node.JS Web Development Node.x North Korea Online advertising Online Fraud Open Media Vault Open Source Software OpenAPI OpenVPN Personal Flight Peter Capaldi Photography Plex Media Server Political Protest Power Control Privacy Production use Public Violence Raspberry Pi Raspberry Pi 3 Raspberry Pi Zero Recycling Republicans Retro-Technology Reviews Right to Repair River Song Rocket Ships RSS News Readers rsync Russia Russia Troll Factory Scheme Science Fiction Season 1 Season 10 Season 11 Security Security Cameras Server-side JavaScript Shell Scripts Silence Simsimi Skype Social Media Warfare Social Networks Software Development Space Flight Space Ship Reuse Space Ships SpaceX Spring SQLite3 SSD Drives SSD upgrade SSH SSH Key SSL Swagger Synchronizing Files Telescopes Terrorism The Cybermen The Daleks The Master Time-Series Database Torchwood Total Information Awareness Trump Trump Administration Ubuntu Virtual Private Networks VirtualBox VLC VOIP Web Applications Web Developer Resources Web Development Web Development Tools Weeping Angels WhatsApp Wordpress