Advanced Bash Automation for Web Developers

بواسطة: egghead.io

Overview

Bash makes automation easy. Just a few lines of code can take care of repetitive tasks for you and your teammates.
In this course, we’ll dive deep into the automation potential of bash. You’ll learn to leverage common hooks that open up interesting automation possibilities, like git hooks, adding functions and aliases in your bash_profile, and running scheduled jobs in launchd.
For example, we’ll write a git hook that checks package.json for changes, and if there are changes, the hook runs npm install for you automatically.
Along the way, you’ll also learn:
more advanced bash commands like exec
syntax such as redirecting stdout and stderr to the same destination
timesaving tricks like brace expansions
Automation is all about saving you time — and at only 52 minutes, this course is well worth yours. Enjoy!

Syllabus

  • Course Overview: Advanced Bash Automation for Web Developers
  • Create Aliases in .bash_profile for Common Bash Commands
  • Add Executable Files to $PATH with Bash
  • Create and Copy Multiple Files with Brace Expansions in Bash
  • Rerun Bash Commands with History Expansions
  • Set Default Arguments with Bash Shell Parameter Expansions
  • Use Bash Keyboard Shortcuts
  • Read and Use JSON in Bash with jq
  • Use jq and grep to Find Unused Dependencies in a Project
  • Understand how to Redirect stdin, stdout, and stderr in Bash
  • Use exec to Redirect stdio in a git Hook Script
  • Use case for Complicated Conditional Statements in Bash
  • Create a Bash Script that Accepts Named Options with getopts
  • Create a Bash Script to Open a Pull Request on Github using getopts
  • Send and Receive Data from a Node.js Script in Bash using the Process Object
  • Transform Piped Data from Bash using a Node.js Transform Stream
  • Schedule Timed Jobs on macOS with `launchd`

Taught by

Cameron Nokes

Advanced Bash Automation for Web Developers
الذهاب الي الدورة

Advanced Bash Automation for Web Developers

بواسطة: egghead.io

  • egghead.io
  • مدفوعة
  • الإنجليزية
  • متاح شهادة
  • متاح في أي وقت
  • الجميع
  • N/A
8.1.2PHP Version874msRequest Duration2MBMemory UsageGET ar/الدورات/{slug}Route
    • Booting (553ms)
    • Application (318ms)
    • 1 x Booting (63.27%)
      552.72ms
      1 x Application (36.42%)
      318.13ms
      14 templates were rendered
      • public.courses.show (resources/views/public/courses/show.blade.php)3bladefile
        Params
        0
        course
        1
        links
        2
        config
      • public.courses.partials.breadcrumbs (resources/views/public/courses/partials/breadcrumbs.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.courses.partials.heading (resources/views/public/courses/partials/heading.blade.php)7bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        classes
      • public.courses.partials.details (resources/views/public/courses/partials/details.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.courses.partials.breadcrumbs (resources/views/public/courses/partials/breadcrumbs.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.courses.partials.heading (resources/views/public/courses/partials/heading.blade.php)7bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        classes
      • public.layouts.main (resources/views/public/layouts/main.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.layouts.partials.meta (resources/views/public/layouts/partials/meta.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.layouts.partials.navbar (resources/views/public/layouts/partials/navbar.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.auth.profile.partials.links (resources/views/public/auth/profile/partials/links.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.auth.profile.partials.link (resources/views/public/auth/profile/partials/link.blade.php)8bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        route
        7
        title
      • public.auth.profile.partials.link (resources/views/public/auth/profile/partials/link.blade.php)8bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        route
        7
        title
      • public.auth.profile.partials.link (resources/views/public/auth/profile/partials/link.blade.php)8bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        route
        7
        title
      • public.layouts.partials.flash-session (resources/views/public/layouts/partials/flash-session.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      uri
      GET ar/الدورات/{slug}
      middleware
      web, localize:ar
      controller
      App\Http\Controllers\CourseController@show
      as
      ar.courses.show
      namespace
      prefix
      /ar
      where
      file
      app/Http/Controllers/CourseController.php:17-35
      6 statements were executed9.52ms
      • select * from `courses` where `slug_ar` = 'advanced-bash-automation-for-web-developers' limit 1
        8ms/app/Http/Controllers/CourseController.php:20corspedia
        Metadata
        Bindings
        • 0. advanced-bash-automation-for-web-developers
        Backtrace
        • 17. /app/Http/Controllers/CourseController.php:20
        • 18. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 19. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 20. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • update `courses` set `visitors` = `visitors` + 1, `courses`.`updated_at` = '2025-06-15 03:31:11' where `id` = 2117
        490μs/app/Http/Controllers/CourseController.php:21corspedia
        Metadata
        Bindings
        • 0. 2025-06-15 03:31:11
        • 1. 2117
        Backtrace
        • 17. /app/Http/Controllers/CourseController.php:21
        • 18. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 19. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 20. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select `id`, `name_en`, `name_ar`, `topic_id`, `slug_en`, `slug_ar` from `subjects` where `subjects`.`id` in (44)
        350μs/app/Http/Controllers/CourseController.php:23corspedia
        Metadata
        Backtrace
        • 20. /app/Http/Controllers/CourseController.php:23
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 22. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 23. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 24. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select `id`, `name_en`, `name_ar`, `slug_en`, `slug_ar` from `topics` where `topics`.`id` in (1)
        180μs/app/Http/Controllers/CourseController.php:23corspedia
        Metadata
        Backtrace
        • 25. /app/Http/Controllers/CourseController.php:23
        • 26. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 27. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 28. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 29. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select * from `providers` where `providers`.`id` in (29) and `providers`.`deleted_at` is null
        210μs/app/Http/Controllers/CourseController.php:23corspedia
        Metadata
        Backtrace
        • 20. /app/Http/Controllers/CourseController.php:23
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 22. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 23. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 24. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select * from `html_files` where `html_files`.`id` = 2108 limit 1
        290μs/app/Models/Course.php:84corspedia
        Metadata
        Bindings
        • 0. 2108
        Backtrace
        • 21. /app/Models/Course.php:84
        • 28. view::public.courses.show:29
        • 30. /vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:125
        • 31. /vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php:58
        • 32. /vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php:72
      App\Models\HtmlFile
      1
      App\Models\Provider
      1
      App\Models\Topic
      1
      App\Models\Subject
      1
      App\Models\Course
      1
        _token
        l44ayOynnGcrsyT5RzKHGqb03aejL2hWuwIlrXOb
        locale
        ar
        _previous
        array:1 [ "url" => "https://www.corspedia.com/ar/%D8%A7%D9%84%D8%AF%D9%88%D8%B1%D8%A7%D8%AA/advanc...
        _flash
        array:2 [ "old" => [] "new" => [] ]
        PHPDEBUGBAR_STACK_DATA
        []
        path_info
        /ar/%D8%A7%D9%84%D8%AF%D9%88%D8%B1%D8%A7%D8%AA/advanced-bash-automation-for-web-developers
        status_code
        200
        
        status_text
        OK
        format
        html
        content_type
        text/html; charset=UTF-8
        request_query
        []
        
        request_request
        []
        
        request_headers
        0 of 0
        array:24 [ "cf-ipcountry" => array:1 [ 0 => "US" ] "cf-connecting-ip" => array:1 [ 0 => "216.73.216.137" ] "cdn-loop" => array:1 [ 0 => "cloudflare; loops=1" ] "x-forwarded-proto" => array:1 [ 0 => "https" ] "x-forwarded-for" => array:1 [ 0 => "216.73.216.137" ] "sec-fetch-site" => array:1 [ 0 => "none" ] "accept" => array:1 [ 0 => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" ] "user-agent" => array:1 [ 0 => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" ] "upgrade-insecure-requests" => array:1 [ 0 => "1" ] "sec-ch-ua-platform" => array:1 [ 0 => ""Windows"" ] "sec-ch-ua-mobile" => array:1 [ 0 => "?0" ] "sec-ch-ua" => array:1 [ 0 => ""Chromium";v="130", "HeadlessChrome";v="130", "Not?A_Brand";v="99"" ] "cache-control" => array:1 [ 0 => "no-cache" ] "pragma" => array:1 [ 0 => "no-cache" ] "sec-fetch-dest" => array:1 [ 0 => "document" ] "cf-ray" => array:1 [ 0 => "94fefe341ffe1101-ORD" ] "accept-encoding" => array:1 [ 0 => "gzip, br" ] "priority" => array:1 [ 0 => "u=0, i" ] "sec-fetch-user" => array:1 [ 0 => "?1" ] "sec-fetch-mode" => array:1 [ 0 => "navigate" ] "cf-visitor" => array:1 [ 0 => "{"scheme":"https"}" ] "host" => array:1 [ 0 => "www.corspedia.com" ] "content-length" => array:1 [ 0 => "" ] "content-type" => array:1 [ 0 => "" ] ]
        request_server
        0 of 0
        array:50 [ "USER" => "www-data" "HOME" => "/var/www" "HTTP_CF_IPCOUNTRY" => "US" "HTTP_CF_CONNECTING_IP" => "216.73.216.137" "HTTP_CDN_LOOP" => "cloudflare; loops=1" "HTTP_X_FORWARDED_PROTO" => "https" "HTTP_X_FORWARDED_FOR" => "216.73.216.137" "HTTP_SEC_FETCH_SITE" => "none" "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" "HTTP_USER_AGENT" => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" "HTTP_UPGRADE_INSECURE_REQUESTS" => "1" "HTTP_SEC_CH_UA_PLATFORM" => ""Windows"" "HTTP_SEC_CH_UA_MOBILE" => "?0" "HTTP_SEC_CH_UA" => ""Chromium";v="130", "HeadlessChrome";v="130", "Not?A_Brand";v="99"" "HTTP_CACHE_CONTROL" => "no-cache" "HTTP_PRAGMA" => "no-cache" "HTTP_SEC_FETCH_DEST" => "document" "HTTP_CF_RAY" => "94fefe341ffe1101-ORD" "HTTP_ACCEPT_ENCODING" => "gzip, br" "HTTP_PRIORITY" => "u=0, i" "HTTP_SEC_FETCH_USER" => "?1" "HTTP_SEC_FETCH_MODE" => "navigate" "HTTP_CF_VISITOR" => "{"scheme":"https"}" "HTTP_HOST" => "www.corspedia.com" "REDIRECT_STATUS" => "200" "SERVER_NAME" => "corspedia.com" "SERVER_PORT" => "443" "SERVER_ADDR" => "141.95.147.152" "REMOTE_USER" => "" "REMOTE_PORT" => "38082" "REMOTE_ADDR" => "172.69.58.75" "SERVER_SOFTWARE" => "nginx/1.18.0" "GATEWAY_INTERFACE" => "CGI/1.1" "HTTPS" => "on" "REQUEST_SCHEME" => "https" "SERVER_PROTOCOL" => "HTTP/2.0" "DOCUMENT_ROOT" => "/var/www/corspedia/public" "DOCUMENT_URI" => "/index.php" "REQUEST_URI" => "/ar/%D8%A7%D9%84%D8%AF%D9%88%D8%B1%D8%A7%D8%AA/advanced-bash-automation-for-web-developers" "SCRIPT_NAME" => "/index.php" "CONTENT_LENGTH" => "" "CONTENT_TYPE" => "" "REQUEST_METHOD" => "GET" "QUERY_STRING" => "" "SCRIPT_FILENAME" => "/var/www/corspedia/public/index.php" "PATH_INFO" => "" "FCGI_ROLE" => "RESPONDER" "PHP_SELF" => "/index.php" "REQUEST_TIME_FLOAT" => 1749958270.3575 "REQUEST_TIME" => 1749958270 ]
        request_cookies
        []
        
        response_headers
        0 of 0
        array:5 [ "content-type" => array:1 [ 0 => "text/html; charset=UTF-8" ] "cache-control" => array:1 [ 0 => "no-cache, private" ] "date" => array:1 [ 0 => "Sun, 15 Jun 2025 03:31:11 GMT" ] "set-cookie" => array:2 [ 0 => "XSRF-TOKEN=eyJpdiI6Ii9NbEExcmNXRWY3ZHJ6RlI5cmFzeGc9PSIsInZhbHVlIjoiVmJBRU9LQXYwemFZNXROa2Jrd3NpSGVUTmVNNHhmblNrUlZxdGo1V1Z0MElsMkJPUVFoNUo3cHJveVJFYTdzdWVrdjcyMGNkQjE2RE1uOXlMcTJDRzhYOWdGSlFkenlSd3gxVDFEZzlnVkxid1BVcm41M0RHbnc2ZDM1MVY3S1EiLCJtYWMiOiI5YWI4ZDNmNzdkYjQxZjlmNjZhMDU2MDNmYWVkZDdmZGVmYmE5YjM1NTQwYzZjYmI5NGZkNDk2ZDZhZjE5NjkwIiwidGFnIjoiIn0%3D; expires=Sun, 15 Jun 2025 05:31:11 GMT; Max-Age=7200; path=/; samesite=laxXSRF-TOKEN=eyJpdiI6Ii9NbEExcmNXRWY3ZHJ6RlI5cmFzeGc9PSIsInZhbHVlIjoiVmJBRU9LQXYwemFZNXROa2Jrd3NpSGVUTmVNNHhmblNrUlZxdGo1V1Z0MElsMkJPUVFoNUo3cHJveVJFYTdzdWVrdjcyM" 1 => "laravel_session=eyJpdiI6ImdraHNyb3Jqc21kSTNjSGt6NjVYZ3c9PSIsInZhbHVlIjoiUkxCZG9QWkVIUGcvUWZiUDM2OHdaWlFuc0RQcENEL0dFdXdRanZLUkxxNmFLRVBpRkNyU3pGQ0FLREU0QVVRNXVtYWVKcWZaQ1A5S1Y0Vkl4N0RSM1YyUWkrYlVScS9uZjByUC9lNUx4UFdaUzBRQWdqb3AraDFJeU1UbWpPMzAiLCJtYWMiOiI1NDQ2Yzg3ZmQ0MzM0OGI0ODA4ODY0MWFhMGI4ODY3ZTdmMTI5NTBhZDI2Y2QyYTY1NTZlZDA2NDUzNmNmOTZkIiwidGFnIjoiIn0%3D; expires=Sun, 15 Jun 2025 05:31:11 GMT; Max-Age=7200; path=/; httponly; samesite=laxlaravel_session=eyJpdiI6ImdraHNyb3Jqc21kSTNjSGt6NjVYZ3c9PSIsInZhbHVlIjoiUkxCZG9QWkVIUGcvUWZiUDM2OHdaWlFuc0RQcENEL0dFdXdRanZLUkxxNmFLRVBpRkNyU3pGQ0FLREU0QVVRNXVt" ] "Set-Cookie" => array:2 [ 0 => "XSRF-TOKEN=eyJpdiI6Ii9NbEExcmNXRWY3ZHJ6RlI5cmFzeGc9PSIsInZhbHVlIjoiVmJBRU9LQXYwemFZNXROa2Jrd3NpSGVUTmVNNHhmblNrUlZxdGo1V1Z0MElsMkJPUVFoNUo3cHJveVJFYTdzdWVrdjcyMGNkQjE2RE1uOXlMcTJDRzhYOWdGSlFkenlSd3gxVDFEZzlnVkxid1BVcm41M0RHbnc2ZDM1MVY3S1EiLCJtYWMiOiI5YWI4ZDNmNzdkYjQxZjlmNjZhMDU2MDNmYWVkZDdmZGVmYmE5YjM1NTQwYzZjYmI5NGZkNDk2ZDZhZjE5NjkwIiwidGFnIjoiIn0%3D; expires=Sun, 15-Jun-2025 05:31:11 GMT; path=/XSRF-TOKEN=eyJpdiI6Ii9NbEExcmNXRWY3ZHJ6RlI5cmFzeGc9PSIsInZhbHVlIjoiVmJBRU9LQXYwemFZNXROa2Jrd3NpSGVUTmVNNHhmblNrUlZxdGo1V1Z0MElsMkJPUVFoNUo3cHJveVJFYTdzdWVrdjcyM" 1 => "laravel_session=eyJpdiI6ImdraHNyb3Jqc21kSTNjSGt6NjVYZ3c9PSIsInZhbHVlIjoiUkxCZG9QWkVIUGcvUWZiUDM2OHdaWlFuc0RQcENEL0dFdXdRanZLUkxxNmFLRVBpRkNyU3pGQ0FLREU0QVVRNXVtYWVKcWZaQ1A5S1Y0Vkl4N0RSM1YyUWkrYlVScS9uZjByUC9lNUx4UFdaUzBRQWdqb3AraDFJeU1UbWpPMzAiLCJtYWMiOiI1NDQ2Yzg3ZmQ0MzM0OGI0ODA4ODY0MWFhMGI4ODY3ZTdmMTI5NTBhZDI2Y2QyYTY1NTZlZDA2NDUzNmNmOTZkIiwidGFnIjoiIn0%3D; expires=Sun, 15-Jun-2025 05:31:11 GMT; path=/; httponlylaravel_session=eyJpdiI6ImdraHNyb3Jqc21kSTNjSGt6NjVYZ3c9PSIsInZhbHVlIjoiUkxCZG9QWkVIUGcvUWZiUDM2OHdaWlFuc0RQcENEL0dFdXdRanZLUkxxNmFLRVBpRkNyU3pGQ0FLREU0QVVRNXVt" ] ]
        session_attributes
        0 of 0
        array:5 [ "_token" => "l44ayOynnGcrsyT5RzKHGqb03aejL2hWuwIlrXOb" "locale" => "ar" "_previous" => array:1 [ "url" => "https://www.corspedia.com/ar/%D8%A7%D9%84%D8%AF%D9%88%D8%B1%D8%A7%D8%AA/advanced-bash-automation-for-web-developers" ] "_flash" => array:2 [ "old" => [] "new" => [] ] "PHPDEBUGBAR_STACK_DATA" => [] ]