CINXE.COM
Shell - run shell commands transparently within perl - metacpan.org
<!DOCTYPE html> <html lang="en-US"> <head> <title>Shell - run shell commands transparently within perl - metacpan.org</title> <link rel="preload" as="fetch" href="/account/login_status" crossorigin="anonymous" /> <link href="/assets/style-XFEQ536G.css" rel="stylesheet" type="text/css"> <script src="/assets/main-WXBSEDQJ.js" type="module"></script> <link rel="alternate" type="application/rss+xml" title="Recent CPAN Uploads of Shell - MetaCPAN" href="/dist/Shell/releases.rss" /> <link rel="canonical" href="https://metacpan.org/pod/Shell" /> <meta name="description" content="run shell commands transparently within perl" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5"> <link rel="shortcut icon" href="/static/icons/favicon.ico"> <link rel="apple-touch-icon" sizes="152x152" href="/static/icons/apple-touch-icon.png"> <link rel="search" href="/static/opensearch.xml" type="application/opensearchdescription+xml" title="MetaCPAN"> <script async src="https://perl-ads.perlhacks.com/perl-ads.js"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=G-E82Q2V8LVD"></script> <meta property="og:site_name" content="MetaCPAN" /> <meta name="twitter:site" content="@metacpan" /> <meta property="og:type" content="article" /> <meta name="twitter:card" content="summary" /> <meta property="og:url" content="https://metacpan.org/pod/Shell" /> <meta property="og:title" content="Shell" /> <meta property="og:description" content="run shell commands transparently within perl" /> <meta property="og:image" content="https://metacpan.org/static/images/dots.png" /> </head> <body> <nav class="navbar navbar-default" role="navigation"> <div class="header-logo-large hidden-xs"> <a href="/" tabindex="0"> <svg class="logo" aria-label="MetaCPAN"> <use class="logo" href="/static/images/metacpan-logo.svg#logo" /> </svg> </a> </div> <div class="header-logo-icon visible-xs"> <a href="/"> <svg class="logo" aria-label="MetaCPAN"> <use class="logo" href="/static/images/metacpan-logo.svg#dots" /> </svg> </a> </div> <ul class="nav navbar-nav menu-items hidden-xs hidden-sm"> <li><a href="/about">About</a></li> <li><a href="/about/sponsors">Sponsor</a></li> <li><a href="https://grep.metacpan.org/">grep::cpan</a></li> <li><a href="/recent">Recent</a></li> <li><a href="/about/faq">FAQ</a></li> <li><a href="/tools">Tools</a></li> <li><a href="https://fastapi.metacpan.org/">API</a></li> </ul> <ul class="nav navbar-nav navbar-right"> <button type="button" class="searchbar-btn visible-xs visible-sm"> <i class="fa fa-search button-fa-icon"></i> </button> <form action="/search" class="searchbar-form visible-md visible-lg search-form form-horizontal"> <input type="hidden" name="size" id="metacpan_search-size" value="20"> <div class="form-group"> <div class="search-group"> <i class="fa fa-search"></i> <input type="text" name="q" placeholder="Search the CPAN" size="41" autocorrect="off" autocapitalize="off" spellcheck="false" id="metacpan_search-input" class="form-control" value=""> </div> </div> </form> <li class="icon-slidepanel visible-xs visible-sm"> <button data-toggle="slidepanel" data-target=".slidepanel"> <span class="button-fa-icon"> <i class="fa fa-bars slidepanel-open"></i> <i class="fa fa-times slidepanel-close"></i> </span> </button> </li> <li class="dropdown login-dropdown show-logged-in"> <button type="button" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-user button-fa-icon logged-in-icon" aria-hidden="true"></i> <i class="fas fa-chevron-down"></i> </button> <ul class="dropdown-menu"> <li><a href="/account/identities">Identities</a></li> <li><a href="/account/profile">Profile</a></li> <li><a href="/account/favorite/list">Favorites</a></li> <li> <a href="#" type="button" class="logout-button"> Logout </a> </li> </ul> </li> <li class="dropdown login-dropdown show-logged-out"> <button type="button" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-user button-fa-icon avatar-placeholder" aria-hidden="true"></i> <i class="fas fa-chevron-down"></i> </button> <ul class="dropdown-menu"> <li> <a href="/login/github"> <i class="fab fa-github fa-fw"></i> GitHub </a> </li> <li> <a href="/login/twitter"> <i class="fab fa-twitter fa-fw"></i> Twitter </a> </li> <li> <a href="/login/google"> <i class="fab fa-google fa-fw"></i> Google </a> </li> </ul> </li> <li class="dropdown login-dropdown hide-logged-in hide-logged-out"> <button> <i class="fa fa-user button-fa-icon" aria-hidden="true"></i> </button> </li> </ul> </nav> <div class="page-content "> <div id="perl-ad-target" class="top-notify-banner perl-ad-target"> </div> <nav class="sidebar"> <div class="slidepanel"> <ul class="nav-list "> <li class="nav-header no-margin-top"> <div class="ttip" data-toggle="tooltip" data-placement="bottom" title="The date that this version of Shell was released."> <span class="relatize">03 Jan 2016 20:58:44 UTC</span> </div> </li> <li> Distribution: <a href="/dist/Shell">Shell</a> </li> <li> Module version: 0.73 </li> <li> <a data-keyboard-shortcut="g s" href="/dist/Shell/source/Shell.pm">Source</a> (<a href="/dist/Shell/source/Shell.pm?raw=1">raw</a>) </li> <li> <a data-keyboard-shortcut="g b" href="/dist/Shell/source">Browse</a> (<a href="/dist/Shell/source?raw=1">raw</a>) </li> <li> <a data-keyboard-shortcut="g c" href="/dist/Shell/changes">Changes</a> </li> <li> <a class="nopopup" href="/dist/Shell/contribute">How to Contribute</a> </li> <li> <a rel="noopener nofollow" data-keyboard-shortcut="g r" href="https://github.com/aferreira/cpan-Shell">Repository</a> </li> <li> <a rel="noopener nofollow" data-keyboard-shortcut="g i" href="https://rt.cpan.org/Public/Dist/Display.html?Name=Shell">Issues</a> (1) </li> <li> <a rel="noopener nofollow" href="http://matrix.cpantesters.org/?dist=Shell+0.73" title="Matrix">Testers</a> <span title="(pass / fail / na)">(<a rel="noopener nofollow" href="https://www.cpantesters.org/distro/S/Shell.html?oncpan=1&distmat=1&version=0.73&grade=2" style="color: #090">1632</a> / <a rel="noopener nofollow" href="https://www.cpantesters.org/distro/S/Shell.html?oncpan=1&distmat=1&version=0.73&grade=3" style="color: #900">0</a> / <a rel="noopener nofollow" href="https://www.cpantesters.org/distro/S/Shell.html?oncpan=1&distmat=1&version=0.73&grade=4">0</a>)</span> </li> <li> <a rel="noopener nofollow" href="http://cpants.cpanauthors.org/release/FERREIRA/Shell-0.73">Kwalitee</a> </li> <li> <div class="ttip" data-toggle="tooltip" data-placement="bottom" title="The # people with an indexing permission on Shell who have released something to CPAN in the last 2 years (i.e. the # people likely able to release critical fixes in a timely manner)"> Bus factor: 0 </div> </li> <li> <a rel="noopener nofollow" href="http://cpancover.com/latest/Shell-0.73/index.html">82.88% Coverage </a> </li> <li> License: perl_5 </li> <li class="nav-header">Activity</li> <li> <div class="activity-graph"> <img src="/dist/Shell/activity.svg?res=month" /> <div class="comment">24 month</div> </div> </li> <li class="nav-header">Tools</li> <li> <a itemprop="downloadUrl" href="https://cpan.metacpan.org/authors/id/F/FE/FERREIRA/Shell-0.73.tar.gz"> Download (<span itemprop="fileSize">6.04KB</span>)</a> </li> <li> <a href="https://explorer.metacpan.org/?url=%2Fmodule%2FFERREIRA%2FShell-0.73%2FShell.pm"> MetaCPAN Explorer </a> </li> <li> <a href="/dist/Shell/permissions"> Permissions </a> </li> <li> <a href="/dist/Shell/releases.rss"> Subscribe to distribution </a> </li> <li> <button class="btn btn-link" data-toggle="modal" data-target="#metacpan_install-instructions-dialog"> Install Instructions </button> </li> <li> <form action="/search"> <input type="hidden" name="q" value="dist:Shell"> <input type="search" name="q" placeholder="Search distribution" class="form-control tool-bar-form"> <input type="submit" style="display: none"> </form> </li> <li> <form action="https://grep.metacpan.org/search"> <input type="hidden" name="qd" value="Shell"> <input type="hidden" name="source" value="metacpan"> <input type="search" name="q" placeholder="grep distribution" class="form-control tool-bar-form"> <input type="submit" style="display: none"> </form> </li> <li class="version-jump"> <select class="select-navigator form-control tool-bar-form"> <option disabled selected>Jump to version</option> <option disabled value="/release/FERREIRA/Shell-0.73/view/Shell.pm" >0.73 (FERREIRA on 2016-01-03)</option> <option value="/release/FERREIRA/Shell-0.72_01/view/Shell.pm" >0.72_01 DEV (FERREIRA on 2009-09-30)</option> <option value="/release/FERREIRA/Shell-0.72/view/Shell.pm" >0.72 (FERREIRA on 2007-02-02)</option> <option value="/release/FERREIRA/Shell-0.71/view/Shell.pm" >0.71 (FERREIRA on 2006-07-07)</option> <option value="/release/FERREIRA/Shell-0.7/view/Shell.pm" >0.7 (FERREIRA on 2006-07-07)</option> <option value="/release/FERREIRA/Shell-0.6/view/Shell.pm" >0.6 (FERREIRA on 2006-07-07)</option> </select> </li> <li class="version-diff"> <select class="select-navigator form-control tool-bar-form"> <option disabled selected>Diff with version</option> <option disabled value="/release/FERREIRA/Shell-0.73/diff/FERREIRA/Shell-0.73/Shell.pm" >0.73 (FERREIRA on 2016-01-03)</option> <option value="/release/FERREIRA/Shell-0.73/diff/FERREIRA/Shell-0.72_01/Shell.pm" >0.72_01 DEV (FERREIRA on 2009-09-30)</option> <option value="/release/FERREIRA/Shell-0.73/diff/FERREIRA/Shell-0.72/Shell.pm" >0.72 (FERREIRA on 2007-02-02)</option> <option value="/release/FERREIRA/Shell-0.73/diff/FERREIRA/Shell-0.71/Shell.pm" >0.71 (FERREIRA on 2006-07-07)</option> <option value="/release/FERREIRA/Shell-0.73/diff/FERREIRA/Shell-0.7/Shell.pm" >0.7 (FERREIRA on 2006-07-07)</option> <option value="/release/FERREIRA/Shell-0.73/diff/FERREIRA/Shell-0.6/Shell.pm" >0.6 (FERREIRA on 2006-07-07)</option> </select> </li> <li> <ul class="dependencies"> <li class="nav-header">Dependencies</li> <li><a href="/pod/Test::More" title="Test::More" class="ellipsis">Test::More</a></li> <li><i class="ttip" title="dynamic_config enabled">and possibly others</i></li> <li> <hr> </li> <li> <a href="/module/Shell/requires">Reverse dependencies</a> </li> <li> <a href="http://deps.cpantesters.org/?module=Shell">CPAN Testers List</a> </li> <li> <a href="https://cpandeps.grinnz.com/?dist=Shell">Dependency graph</a> </li> </ul> </li> <li class="nav-header">Permalinks</li> <li> <a href="/release/FERREIRA/Shell-0.73/view/Shell.pm">This version</a> </li> <li> <a href="/pod/Shell">Latest version</a> </li> <li> <div class="plussers"> <div class="nav-header">++ed by:</div> <div> <a class="display-all" href="/author/MARIOROY"><img src="https://www.gravatar.com/avatar/112c64e088284a78b9afbcb83c125613?d=identicon&s=20" title="MARIOROY" alt="MARIOROY"></a> <a class="display-all" href="/author/ADAMJS"><img src="https://www.gravatar.com/avatar/62c7b6e864d6509cff5839543c676614?d=identicon&s=20" title="ADAMJS" alt="ADAMJS"></a> </div> <!-- Display counts of plussers--> <div> <a href="/dist/Shell/plussers">2 PAUSE users</a> </div> <div> 3 non-PAUSE users </div> </div> </li> <li> </li> </ul> </div> </nav> <div class="content-navigation"> <div class="breadcrumbs"> <span> <a data-keyboard-shortcut="g a" rel="author" href="/author/FERREIRA" class="author-name">Adriano Ferreira</a> </span> <span> / </span> <div class="release dist-release status-latest maturity-released"> <span class="dropdown"><b class="caret"></b></span> <select class="select-navigator "> <option selected value="/release/FERREIRA/Shell-0.73/view/Shell.pm" >0.73 (FERREIRA on 2016-01-03)</option> <option value="/release/FERREIRA/Shell-0.72_01/view/Shell.pm" >0.72_01 DEV (FERREIRA on 2009-09-30)</option> <option value="/release/FERREIRA/Shell-0.72/view/Shell.pm" >0.72 (FERREIRA on 2007-02-02)</option> <option value="/release/FERREIRA/Shell-0.71/view/Shell.pm" >0.71 (FERREIRA on 2006-07-07)</option> <option value="/release/FERREIRA/Shell-0.7/view/Shell.pm" >0.7 (FERREIRA on 2006-07-07)</option> <option value="/release/FERREIRA/Shell-0.6/view/Shell.pm" >0.6 (FERREIRA on 2006-07-07)</option> </select> <a data-keyboard-shortcut="g d" class="release-name" href="/dist/Shell">Shell-0.73</a> </div> <span class="river-gauge-gauge"> <svg width="24px" height="15px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g> <title> River stage one • 3 direct dependents • 4 total dependents </title> <rect x="0" y="0" width="4" height="15" fill="#7ea3f2" /> <rect x="5" y="0" width="4" height="15" fill="#e4e2e2" /> <rect x="10" y="0" width="4" height="15" fill="#e4e2e2" /> <rect x="15" y="0" width="4" height="15" fill="#e4e2e2" /> <rect x="20" y="0" width="4" height="15" fill="#e4e2e2" /> </g> </svg> </span> <div id="Shell-fav" class="show-logged-in"> <form action="/account/favorite/add" style="display: inline" method="POST"> <input type="hidden" name="remove" value="0"> <input type="hidden" name="release" value="Shell-0.73"> <input type="hidden" name="author" value="FERREIRA"> <input type="hidden" name="distribution" value="Shell"> <button type="submit" class="favorite highlight"><span>5</span> ++</button> </form> </div> <div class="show-logged-out"> <button class="fav-not-logged-in favorite highlight"><span>5</span> ++</button> </div> / <span>Shell</span> </div> </div> <main class="content"> <nav class="toc"> <div class="toc-header"><strong>Contents</strong></div> <ul> <li><a href="#NAME">NAME</a></li> <li><a href="#SYNOPSIS">SYNOPSIS</a></li> <li><a href="#DESCRIPTION">DESCRIPTION</a> <ul> <li><a href="#Caveats">Caveats</a></li> <li><a href="#Escaping-Magic-Characters">Escaping Magic Characters</a></li> <li><a href="#Configuration">Configuration</a></li> </ul> </li> <li><a href="#BUGS">BUGS</a></li> <li><a href="#AUTHOR">AUTHOR</a></li> </ul></nav> <div class="pod anchors"> <h1 id="NAME">NAME</h1> <p>Shell - run shell commands transparently within perl</p> <h1 id="SYNOPSIS">SYNOPSIS</h1> <pre><code>use Shell qw(cat ps cp); $passwd = cat('</etc/passwd'); @pslines = ps('-ww'), cp("/etc/passwd", "/tmp/passwd"); # object oriented my $sh = Shell->new; print $sh->ls('-l');</code></pre> <h1 id="DESCRIPTION">DESCRIPTION</h1> <h2 id="Caveats">Caveats</h2> <p>This package is included as a show case, illustrating a few Perl features. It shouldn't be used for production programs. Although it does provide a simple interface for obtaining the standard output of arbitrary commands, there may be better ways of achieving what you need.</p> <p>Running shell commands while obtaining standard output can be done with the <code>qx/STRING/</code> operator, or by calling <code>open</code> with a filename expression that ends with <code>|</code>, giving you the option to process one line at a time. If you don't need to process standard output at all, you might use <code>system</code> (in preference of doing a print with the collected standard output).</p> <p>Since Shell.pm and all of the aforementioned techniques use your system's shell to call some local command, none of them is portable across different systems. Note, however, that there are several built in functions and library packages providing portable implementations of functions operating on files, such as: <code>glob</code>, <code>link</code> and <code>unlink</code>, <code>mkdir</code> and <code>rmdir</code>, <code>rename</code>, <code>File::Compare</code>, <code>File::Copy</code>, <code>File::Find</code> etc.</p> <p>Using Shell.pm while importing <code>foo</code> creates a subroutine <code>foo</code> in the namespace of the importing package. Calling <code>foo</code> with arguments <code>arg1</code>, <code>arg2</code>,... results in a shell command <code>foo arg1 arg2...</code>, where the function name and the arguments are joined with a blank. (See the subsection on Escaping magic characters.) Since the result is essentially a command line to be passed to the shell, your notion of arguments to the Perl function is not necessarily identical to what the shell treats as a command line token, to be passed as an individual argument to the program. Furthermore, note that this implies that <code>foo</code> is callable by file name only, which frequently depends on the setting of the program's environment.</p> <p>Creating a Shell object gives you the opportunity to call any command in the usual OO notation without requiring you to announce it in the <code>use Shell</code> statement. Don't assume any additional semantics being associated with a Shell object: in no way is it similar to a shell process with its environment or current working directory or any other setting.</p> <h2 id="Escaping-Magic-Characters"><a id="Escaping"></a>Escaping Magic Characters</h2> <p>It is, in general, impossible to take care of quoting the shell's magic characters. For some obscure reason, however, Shell.pm quotes apostrophes (<code>'</code>) and backslashes (<code>\</code>) on UNIX, and spaces and quotes (<code>"</code>) on Windows.</p> <h2 id="Configuration">Configuration</h2> <p>If you set $Shell::capture_stderr to 1, the module will attempt to capture the standard error output of the process as well. This is done by adding <code>2>&1</code> to the command line, so don't try this on a system not supporting this redirection.</p> <p>Setting $Shell::capture_stderr to -1 will send standard error to the bit bucket (i.e., the equivalent of adding <code>2>/dev/null</code> to the command line). The same caveat regarding redirection applies.</p> <p>If you set $Shell::raw to true no quoting whatsoever is done.</p> <h1 id="BUGS">BUGS</h1> <p>Quoting should be off by default.</p> <p>It isn't possible to call shell built in commands, but it can be done by using a workaround, e.g. shell( '-c', 'set' ).</p> <p>Capturing standard error does not work on some systems (e.g. VMS).</p> <h1 id="AUTHOR">AUTHOR</h1> <pre><code>Date: Thu, 22 Sep 94 16:18:16 -0700 Message-Id: <9409222318.AA17072@scalpel.netlabs.com> To: perl5-porters@isu.edu From: Larry Wall <lwall@scalpel.netlabs.com> Subject: a new module I just wrote</code></pre> <p>Here's one that'll whack your mind a little out.</p> <pre><code>#!/usr/bin/perl use Shell; $foo = echo("howdy", "<funny>", "world"); print $foo; $passwd = cat("</etc/passwd"); print $passwd; sub ps; print ps -ww; cp("/etc/passwd", "/etc/passwd.orig");</code></pre> <p>That's maybe too gonzo. It actually exports an AUTOLOAD to the current package (and uncovered a bug in Beta 3, by the way). Maybe the usual usage should be</p> <pre><code>use Shell qw(echo cat ps cp);</code></pre> <p>Larry Wall</p> <p>Changes by Jenda@Krynicky.cz and Dave Cottle <d.cottle@csc.canterbury.ac.nz>.</p> <p>Changes for OO syntax and bug fixes by Casey West <casey@geeknest.com>.</p> <p><code>$Shell::raw</code> and pod rewrite by Wolfgang Laun.</p> <p>Rewritten to use closures rather than <code>eval "string"</code> by Adriano Ferreira.</p></div> <div id="metacpan_install-instructions-dialog" class="modal fade"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title">Module Install Instructions</h4> </div> <div class="modal-body"> <p>To install Shell, copy and paste the appropriate command in to your terminal.</p> <p><a href="/dist/App-cpanminus/view/bin/cpanm">cpanm</a></p> <pre><code>cpanm Shell</code></pre> <p><a href="/pod/CPAN">CPAN shell</a></p> <pre><code>perl -MCPAN -e shell install Shell</code></pre> <p>For more information on module installation, please visit <a href="https://www.cpan.org/modules/INSTALL.html">the detailed CPAN module installation guide</a>.</p> </div> <div class="modal-footer"> <a href="#" data-dismiss="modal" class="btn">Close</a> </div> </div> </div> </div> </main> <div class="content-pagination"> </div> </div> <footer class="footer"> <div class="footer-container"> <div class="footer-social"> <div class="footer-link footer-logo"> <a href="/"> <img src="/static/images/metacpan-logo.svg" alt="MetaCPAN" /> </a> </div> <a class="footer-social-link" href="https://github.com/metacpan"> <i class="fab fa-github-square"></i> </a> <a class="footer-social-link" href="https://fosstodon.org/@metacpan"> <i class="fab fa-mastodon"></i> </a> </div> <div class="footer-links"> <div class="footer-link"> <a href="/about">About</a> </div> <div class="footer-link"> <a href="/about/sponsors">Sponsor</a> </div> <div class="footer-link"> <a href="https://grep.metacpan.org">grep::cpan</a> </div> <div class="footer-link"> <a href="/recent">Recent</a> </div> <div class="footer-link"> <a href="/about/faq">FAQ</a> </div> <div class="footer-link"> <a href="/tools">Tools</a> </div> <div class="footer-link"> <a href="https://fastapi.metacpan.org/">API</a> </div> <div class="footer-link"> <a href="https://www.perl.org/">Perl.org</a> </div> </div> <div class="footer-sponsors"> <a class="footer-sponsor-link" target="_blank" href="https://www.bytemark.co.uk/" rel="noopener"> <img class="footer-sponsor-bytemark" src="/static/images/sponsors/bytemark_logo.svg" alt="Bytemark logo"> </a> <a class="footer-sponsor-link" target="_blank" href="https://www.liquidweb.com/" rel="noopener"> <img class="footer-sponsor-liquidweb" src="/static/images/sponsors/liquidweb_logo.png" alt="liquidweb logo"> </a> <a class="footer-sponsor-link" target="_blank" href="https://deriv.com/careers/" rel="noopener"> <img class="footer-sponsor-deriv" src="/static/images/sponsors/deriv.svg" alt="Deriv logo"> </a> <a class="footer-sponsor-link" target="_blank" href="https://geocode.xyz" rel="noopener"> <img class="footer-sponsor-geocode" src="/static/images/sponsors/geocodelogo.svg" alt="Geocode logo"> </a> <a class="footer-sponsor-link" target="_blank" href="https://www.fastly.com/" rel="noopener"> <img class="footer-sponsor-fastly" src="/static/images/sponsors/fastly_logo.svg" alt="Fastly logo"> </a> <a class="footer-sponsor-link" target="_blank" href="https://opencagedata.com" rel="noopener"> <img class="footer-sponsor-opencage" src="/static/images/sponsors/open-cage.svg" alt="OpenCage logo"> </a> <!-- Added 2024-07-22 --> <a class="footer-sponsor-link" target="_blank" href="https://www.elastic.co/" rel="noopener"> <img class="footer-sponsor-elastic" src="/static/images/sponsors/elastic.svg" alt="Elastic logo"> </a> <!-- Added 2024-07-22 --> <a class="footer-sponsor-link" target="_blank" href="https://route4me.com/" rel="noopener"> <img class="footer-sponsor-route4me" src="/static/images/sponsors/route4me.png" alt="Route4Me logo"> </a> </div> </div> </footer> <div class="modal fade" tabindex="-1" role="dialog" id="metacpan_keyboard-shortcuts"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">×</button> <h4 class="modal-title">Keyboard Shortcuts</h4> </div> <div class="modal-body row"> <div class="col-md-6"> <table class="table keyboard-shortcuts"> <thead> <tr> <th></th> <th>Global</th> </tr> </thead> <tbody> <tr> <td class="keys"> <kbd>s</kbd> </td> <td>Focus search bar</td> </tr> <tr> <td class="keys"> <kbd>?</kbd> </td> <td>Bring up this help dialog</td> </tr> </tbody> </table> <table class="table keyboard-shortcuts"> <thead> <tr> <th></th> <th>GitHub</th> </tr> </thead> <tbody> <tr> <td class="keys"> <kbd>g</kbd> <kbd>p</kbd> </td> <td>Go to pull requests</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>i</kbd> </td> <td>go to github issues (only if github is preferred repository)</td> </tr> </tbody> </table> </div> <div class="col-md-6"> <table class="table keyboard-shortcuts"> <thead> <tr> <th></th> <th>POD</th> </tr> </thead> <tbody> <tr> <td class="keys"> <kbd>g</kbd> <kbd>a</kbd> </td> <td>Go to author</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>c</kbd> </td> <td>Go to changes</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>i</kbd> </td> <td>Go to issues</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>d</kbd> </td> <td>Go to dist</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>r</kbd> </td> <td>Go to repository/SCM</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>s</kbd> </td> <td>Go to source</td> </tr> <tr> <td class="keys"> <kbd>g</kbd> <kbd>b</kbd> </td> <td>Go to file browse</td> </tr> </tbody> </table> </div> <div class="col-md-12"> <table class="table keyboard-shortcuts"> <thead> <tr> <th></th> <th>Search terms</th> </tr> </thead> <tbody> <tr> <td><em>module:</em> (e.g. <a href="/search?q=module%3APlugin">module:Plugin</a>)</td> </tr> <tr> <td><em>distribution:</em> (e.g. <a href="/search?q=distribution%3ADancer+auth">distribution:Dancer auth</a>)</td> </tr> <tr> <td><em>author:</em> (e.g. <a href="/search?q=author%3ASONGMU+Redis">author:SONGMU Redis</a>)</td> </tr> <tr> <td><em>version:</em> (e.g. <a href="/search?q=version%3A1.00">version:1.00</a>)</td> </tr> </tbody> </table> </div> </div> <div class="modal-footer"></div> </div> </div> </div> </body> </html>