タグ付けされた質問 「bash」

他のBourne / POSIXシェルとは対照的に、GNUのBourne Again SHellに固有の質問。Unixシェル全般に関する質問については、代わりに/ shellタグを使用してください。

5
必要なディレクトリでターミネータを実行してから、必要なコマンドを実行します
などの特定のディレクトリでターミネータを開き/home/downloads/、コマンドを実行したい。 私はこの「カスタムコマンド」で最初の部分を実行しました。cd /home/downloads; bash ターミネーターはこのディレクトリで起動しますが、2番目の部分を実行するにはどうすればよいですか? ターミネーターがダウンロードディレクトリで開始されたので、ls必要なrakeコマンド、たとえばcommandを実行するか、コマンドとしていくつかのエイリアスを使用します。これどうやってするの? ターミネーターでマウスの右ボタンを押し、[パラメーター]、[レイアウト]の順に選択して、[カスタムコマンド]セクションにテキストを追加します。 これらはすべて、ターミネータの起動後に自動的に実行される必要があります。

2
シェルで変数を間接的に展開する
bashシェルで変数を間接的に参照する必要があります。 基本的にmake書いてできることをしたいです$($(var))。 私は${$var}最も簡単な解決策であるものを使用しようとしましたbashが、このエラーが発生します: bash: ${$var}: bad substitution これを行う方法はありますか? 私は何をしようとしています(すべての引数反復処理することで$1、$2、$3反復変数を使用してプログラムに、...)を、私は間接せずにこれを行うことはできません。

5
現在のシェルインタープリター名を*確実に*かつ*簡単に*取得するにはどうすればよいですか?
(コマンドラインからではなく)スクリプトまたはソースファイル内から現在のシェルの名前を取得する簡単で信頼性の高い方法を探しています。私はちょうどそうすることを期待していました$(basename "$SHELL")が、ログインシェルがzshあり、some_script.shに次のコードがある場合 this_shell=$( basename "$SHELL" ) echo "The Shell is $this_shell" echo "The Shell is $0" そして私はそれを実行しbash some_script.sh、それはまだ示していますzsh代わりにbash使用インタプリタがあるにもかかわらず/bin/bash。シェルの設計者が現在のシェルではなくデフォルトのシェルを表示するように選択した理由はわかりませんが、それが私たちが行き詰まっているようです。 他にも少し似た質問がありますが(こことここ)、その答えは多くの点で不十分です。 多くの場合、ユーザーが現在使用している対話型シェルを把握しようとしていると想定しますが、それはおかしいです。シェルかを決定することができるようにどこでも実行することができ、私の必要性のコード-私はにコマンドを入力してるシェル知っている、それが使用されます。 彼らはしばしばいくつかの異なることを試みます-再びあなたがコマンドラインにいて、あなたがbashを使用していることを学ぶまでただいじくり回すことができるかのように-しかし、私はすべてのコンテキストで信頼できる単一のものが必要です。 彼らはしばしばのようなスクリプトから全く役に立たないものを与えecho $0ます。上記のスクリプトに示すように、これは失敗します。(はい、それはインタラクティブなシェルコマンドラインで機能しますが、なぜあなたが使用しているシェルを知らないのですか?) 彼らは時々(私の限られたテストでは)のような正しい情報を含むコマンドを提供しますがps -p $$、クロスプラットフォームでクロスシェル互換のsed / awkコマンドが不足しているため、パイプを介してシェル名のみを取得し、付随する他の情報を無視します乗る。 彼らは次のように、シェルのみのカップルで動作するものが含まれる$BASH_VERSIONと$ZSH_VERSION。私はそのような可能な限り多くのシェルとしてサポートしたいですfish、csh、tcsh。 私はどのように行う、確実かつ正確に検出任意の 現在のシェルを?私は、プラットフォーム間で、スクリプト内で、そして可能な限り多くのシェルで機能する何かを探しています1。 更新:私がこの質問を投稿したとき、私はこの情報を提供するためにシェルに組み込まれたいくつかの機能があると予想しましたが、そうではないようです。現在、シェルの外の何かに依存することは避けられないように思われるので、クロスプラットフォームソリューションを求めていることをより明確にする必要があります(上記の他の回答への私の反対には暗示されていますが、そうしないと簡単に見落とされる可能性があります)質問を注意深く読んではいけません)。 Update 2Stéphaneの回答がLinuxのみではないために、これがLinuxのみの質問の重複であるとまだだれもが信じている場合、私が求めているものと彼が提供したものとの違いは次のとおりです。(彼が書いたものは独創的であり、私はそれをノックしていませんが、それは私の問題を解決しないことに注意してください。) 私は何かを探していますシンプルかつ信頼性の高い、その (によって供給されることを任意のスクリプトや関数定義に追加することができ.zshrcたり.bash_profile、分岐または何でも)。 彼のスクリプトは、デフォルトのインタプリタによって常に解釈されて返されるため、インタプリタ名を呼び出し側のスクリプト/関数に渡す外部ユーティリティとして使用することはできません。これは私の目的に使用することを困難または不可能にします。可能であれば、それは非常に非常に困難であり、それを機能させるための解決策は答えに記載されていません。したがって、彼は私の質問に答えなかったため、それは重複ではありません。 あなたが何かを見たい場合になる仕事を、見とるGitHubの上ShellDetectiveを。これにより、SEに既に存在するものと、この質問が探しているものとの違いを簡単に確認できる場合があります(実際、この質問のニーズを満たすために作成されたもので、他では満たされていないものです)。 (PSあなたはにソース取得機能を想像し、このためのユースケースがあります信じることができない場合.zshrc、.bash_profileまたは.profile使用されているものを、サーバーに依存し、どのようなシェルそれが利用可能です。彼らはシェバング行を持っていないので、彼らが調達している。彼らは、どのシェルでも動作する場合に最も便利ですが、動作方法を知るために、どのシェルにいるかを知る必要がある場合もあります。) 1伝統的な意味でのシェルではない「シェル」には関心がありません。誰かが自分で書いたシェルについては気にしていません。私だけに関係してる本当のシェル実際に野生で発生し、そしてその誰か多分彼らはちょうど彼らが好きなシェルいくつかのサーバにログインをインストールすることはできませんれているときに使用する必要がある場合があります。
9 bash  shell  zsh 

1
Bashの自動補完はどのように機能しますか?
bashのオートコンプリートが標準のユーティリティで機能することを理解できます。しかし、Oracle SQLローダーなどのカスタムプログラムのオートコンプリートはどのように行われるのでしょうか。 次のコマンドでTabを押すcontrol=と、制御ファイル名に自動補完されます。 sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log 他のファイルではなく、その時点で制御ファイルに入力する必要があることをどのようにして知るのでしょうか。

3
タイムアウト関数の戻り値
スクリプトを5秒待つために、debianでタイムアウト機能を使用しています。うまく動作しますが、問題は戻り値が必要なことです。タイムアウトの場合は1、タイムアウトなしの場合は0のようにします。 私のコードを見てください: timeout 5 /some/local/script/connect_script -x 'status' > output.txt # here i need the return of timeout ご覧のとおり、connect_script -x 'status'はステータスを文字列として返し、画面に出力します(おそらくこれは表示されません)。この問題の背景は、サーバー(connect_script)がフリーズしている場合、スクリプトは何もしないことです。 。そのため、そのあたりのタイムアウトが必要です。そして、それがタイムアウトしたとき、サーバーを再起動したいと思います。私はそれを行うことができますが、タイムアウトかどうかを確認する方法はわかりません...

4
bashのみを使用して単一の文字列を文字配列に分割する
私はbashのみを使用して配列に分割'hello'したいのですがh e l l o、sedでそれを行うことができますsed 's/./& /g'が、区切り文字が何であるかわからない場合、または区切り文字が任意の場合に、文字列をBashの配列に分割する方法を知りたいです単一の文字。${i// /}区切り文字が不明なため、ある程度の創造性がなければ使用できないと思います。また、式が正規表現を受け入れるとは思いません。[[string =〜([az]。)。*]]でBASH_REMATCHを使用してみましたが、期待どおりに動作しません。ある種string.split()の動作を達成するためにbashのみを使用する適切な方法は何ですか?その理由は、すべてのbashでrevユーティリティーを記述しようとしているためです。 while read data; do word=($(echo $data|tr ' ' '_'|sed 's/./& /g')) new=() i=$((${#word[@]} - 1)) while [[ $i -ge 0 ]]; do new+=(${word[$i]}) (( i-- )) done echo ${new[@]}|tr -d ' '|tr '_' ' ' done しかし、私はtrとsedを使用しました。分割を適切に行う方法を知りたいので、すべてbashになるように修正します。楽しみのためだけに。
9 bash  string  split 

2
find -execのifコマンド
私は現在のディレクトリの下にあるすべてのディレクトリとファイルを一覧表示し、それらがファイルまたはディレクトリである場合は、次のコマンドで書き込もうとしました: find -exec echo `echo {} : ;if [ -f {} ]; then echo file; else echo directory;fi` \; 私はそれがばかげたコマンドであることを知っています、-type fまたはのような他のものを使用できます-type dが、そのコードの一部が期待どおりに機能しなかった理由を知りたいです。それらすべてにディレクトリを出力するだけです。たとえば、出力findは次のとおりです。 . ./dir ./dir/file 私のコードの出力は: . : directory ./dir : directory ./dir/file : directory そしての出力 echo `echo dir/file : ;if [ -f dir/file ]; then echo file; else echo …

1
ディレクトリ名のエコーなしで前のディレクトリに移動します
この回答によりcd -、Bashの以前のディレクトリに変更するための省略形が得られました。これには大きな問題があります。変更先のディレクトリが出力され、画面スペースが無駄になります。そのディレクトリは次の行のプロンプトで繰り返されるためです。 私cd $OLDPWDもできることはわかっていcd - >/dev/nullます。その回答でも言及されていますが、それははるかにタイピングです。 でbashmanページ、それは言います: ...または-が最初の引数で、ディレクトリの変更が成功した場合、新しい作業ディレクトリの絶対パス名が標準出力に書き込まれます。 -最初の議論にならないようにするにはどうすればよいですか?cdオプションの引数のいずれかを使用して?使用するすべてのマシンで関数/エイリアスを定義する必要なしに、エコーを抑制したり、タイピングを最小限にしたりする他の方法はありますか?

2
bash処理後にパラメータからオプションを削除する方法
bashスクリプトを使用caseしshiftて、位置パラメーターのリストをウォークスルーし、フラグとオプションを引数で解析し、それらを検出してそれらを削除し、構文解析後にそれらを削除して、裸の引数のみを残して、後で残りの残りで処理されるのを見た覚えがあります。脚本。 たとえば、のコマンドラインの解析では、cp -R file1 -t /mybackup file2 -f最初にパラメータを確認し、ユーザーがによってディレクトリに降り-R、ターゲットを指定して-t /mybackupコピーを強制し-f、それらをパラメータのリストから削除することを要求したことを認識します。file1 file2残りの引数として処理するプログラム。 しかし、私はいつでも目にしたスクリプトを覚えている/見つけることができないようです。それができるようになりたいのです。私はさまざまなサイトをグーグルで検索して、調べた関連ページのリストを追加しています。 このWebサイトの質問では、「順序に依存しないオプション」について具体的に質問しましたが、単一の回答とそれがダッピングされた質問の回答のどちらも、オプションが通常の引数と混合されている上記のようなケースを考慮していません。個人が順序に依存しないオプションについて具体的に言及する理由。 以降bashに建てられた-S」getopts最初の非オプションの引数で停止するようだ、解決策として十分であるとは思えません。これが、Wooledge BashFAQのページ(下記を参照)が引数を再配置する方法を説明する理由です。しかし、引数リストが非常に長い場合に備えて、複数の配列を作成しないようにしたいと思います。 以来shiftパラメータリストの真ん中オフ個々の引数をポップサポートしていない、私は私が求めています何を実装するための簡単な方法は何かわかりません。 まったく新しい配列を作成せずに、パラメーターリストの途中から引数を削除する解決策があるかどうか知りたいです。 私がすでに見たページ: http://mywiki.wooledge.org/ComplexOptionParsing#Rearranging_arguments http://mywiki.wooledge.org/BashFAQ/035 bashシェルスクリプトでgetoptsを使用して長いコマンドラインオプションと短いコマンドラインオプションを取得する http://wiki.bash-hackers.org/scripting/posparams http://wiki.bash-hackers.org/howto/getopts_tutorial $ @の引数のbash引数のケース bashスクリプトで順序に依存しないオプションを実装する標準的な方法は何ですか? シェルスクリプトでスイッチをどのように処理しますか?
9 bash  arguments 

1
「su -c」で起動したコマンドからプロセスIDを取得する
シェル内でJavaプログラムを実行し、プロセスIDをテキストファイルに書き込んでいます。だから私がこれをするとき: nohup java app.Main > /dev/null 2>&1 & echo $! > /var/run/app.pid できます。しかし、本当に別のユーザーとして実行したい su - appuser -c "nohup java app.Main > /dev/null 2>&1 &" echo $! > /var/run/app.pid これは機能しません。-cオプションで起動されたコマンドのプロセスIDを取得する方法はありますか?
9 bash  shell  su 

2
sudo bashを使用するときにエイリアスを保持する
私のアカウントには独自のエイリアスコマンドを備えたCentos 5.5サーバーがあります。sudo bashこれらのエイリアスを使用できる場合は、ルートのにエイリアスを追加する必要はありませんでした.bashrc。 Centos 6.5である別のサーバーがあります。しかし、を実行するとsudo bash、ログインしているユーザーのエイリアスは使用されません。私が使用するときに、ログインしているユーザーのエイリアスを含めるようにどこに設定するかを誰かが知っていますsudo bashか?
9 bash  sudo 

2
'EOF'を使用し、変数をリテラルと見なすbashスクリプトに変数を渡す[クローズ]
休業。この質問には詳細または明確さが必要です。現在、回答を受け付けていません。 この質問を改善してみませんか?詳細を追加し、この投稿を編集して問題を明確にしてください。 5年前休業。 このスクリプトでは、 "$ 1"が/ testファイルに保存されることになります。 #!/bin/bash cat > /test << 'EOF' $1 EOF 真実は..私は保つ必要があります 'EOF' 引数($ 1)にドル記号が含まれているため、「EOF」として。 $ 1ではなく、その引数を保存する必要があります

1
bash連想配列をテキストファイルにラウンドトリップする方法
異なるスクリプト実行間の連想配列を記憶したいと思います。これまでのところ、1つのキーと値のペアを含むテキストファイルを指定しています。 ( [james]=bond ) それを連想配列にロードして追加し、2番目のファイルにリダイレクトできるようにエコーするスクリプトです。 #!/bin/bash file=`cat $1` key=$2 value=$3 declare -A row="$file" row[$key]=$value echo "(" for server in "${!row[@]}" do echo "[$server]=${row[$server]}"; done echo ")" それから私はそれを次のように実行できます: ./arrays.sh file1 honey rider > file2 ; mv file2 file1 与える ( [james]=bond [honey]=rider ) しかし、それは非常に不格好です。これを行うためのよりクリーンな方法はありますか?
9 bash 

3
タイムスタンプ付きのコマンド履歴を継続的に端末に出力するにはどうすればよいですか?
シンプルなエイリアスを使用して、1つまたは複数のターミナルウィンドウでコマンドの「追跡」を有効にします。 alias trackmi='export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"' 次に、ワークスペースの別のターミナルにある.bash_historyファイルだけを使用しtail -fて、即座にフィードバックを得ます。無制限の履歴 を有効にし、.bashrcの履歴形式​​()を更新しました。もちろん、コマンドはタイムスタンプを表示します。しかし、履歴ファイル自体の形式は次のとおりです。export HISTTIMEFORMAT="[%F %T] "history #1401234303 alias #1401234486 cat ../.bashrc コマンドと同じように、Unix時間を変換してコマンド全体を1行に表示するにはどうすればよいですかhistory。 578 [2014-05-27 19:45:03] alias 579 [2014-05-27 19:48:06] cat ../.bashrc ...そしてそれに従ってください。または、historyコマンドの出力を端末に継続的に出力する方法を見つけますか?

2
実行可能ファイルが強制終了されたときにディレクトリを自動的に削除する方法
多くの場合、一時ファイルの書き込み/読み取りが必要な実行可能ファイルを実行します。通常、一時ディレクトリを作成し、そこで実行可能ファイルを実行し、スクリプトが完了したらディレクトリを削除します。 実行ファイルが殺されてもディレクトリを削除したいのですが。私はそれを包み込もうとしました: #!/bin/bash dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir /usr/local/bin/my_binary ときにmy_binaryスクリプトがそれを保持する最後のプロセスであるようダイは、最後のプロセスのカーネルでは、ディレクトリを削除しますinode。削除したディレクトリにファイルを作成できません。 #!/bin/bash dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir touch file.txt 出力 touch: file.txt: No such file or directory 私が思いつくことができる最高のものは、プロセスが死んだときに一時ディレクトリを削除し、最も一般的なシグナルをキャッチして、cronでクリーンアッププロセスを実行することです。 #!/bin/bash dir=$(mktemp -d /tmp/d.XXXXXX) && cd "$dir" || exit 99 trap 'rm -rf …
9 bash  files 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.