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

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

2
読み取り-a配列-d '\ n' <foo、終了コード1
実行しようとすると read -a fooArr -d '\n' &lt; bar 終了コードは1です-私が望んでいることを達成したとしても; の各行をbar配列の要素に入れますfooArr(bash 4.2.37を使用)。 なぜこれが起こっているのか誰かが説明できますか 私はこれを解決する他の方法を見つけました、以下のようなので、それは私が求めているものではありません。 for ((i=1;; i++)); do read "fooArr$i" || break; done &lt; bar または mapfile -t fooArr &lt; bar
8 bash  newlines  read 

3
既存のプロンプトコマンドラインを数行に分割する
コマンドラインの\ enter最後に入力して、bashそのコマンドを別の行に続けることができることを理解しています。しかし、プロンプトコマンドライン(既に完全に入力されているもの)を2つに分割するにはどうすればよいでしょうか。 たとえばthen、残りを切り取ってもう一度入力しなくても、直前にこの行を分割するにはどうすればよいですか? $ if true; then ls; fi


5
bash getopts、短いオプションのみ、すべて値が必要、独自の検証
さまざまなオプションを受け入れるシェルスクリプトを構築しようとしgetoptsています。オプションと引数の変数の順序を処理できるため、良い解決策のようです(私はそう思います!)。 私は短いオプションのみを使用し、各短いオプションには対応する値が必要です。例:./command.sh -a arga -g argg -b argbほとんどの人がシェルコマンドでの作業に慣れているように、オプションを特定の順序で入力できないようにしたい。 もう1つのポイントは、オプションの引数値のチェックを自分自身で、理想的にはcaseステートメント内で行いたいということです。その理由は:)、私のcase声明での私のテストで一貫性のない結果が得られたためです(おそらく私の理解が不足しているためです)。 例えば: #!/bin/bash OPTIND=1 # Reset if getopts used previously if (($# == 0)); then echo "Usage" exit 2 fi while getopts ":h:u:p:d:" opt; do case "$opt" in h) MYSQL_HOST=$OPTARG ;; u) MYSQL_USER=$OPTARG ;; p) MYSQL_PASS=$OPTARG ;; d) BACKUP_DIR=$OPTARG ;; \?) echo …
8 bash  getopts 

2
Bashの正規表現の問題:[^ negate]が機能しないようです
ls /directory | grep '[^term]'Bashで実行すると、grepコマンドがどういうわけか無視されたかのように、通常のリストが表示されます。私はで同じことegrepを試しましたが、二重引用符と単一引用符でそれを使用しようとしましたが、より良い結果は得られませんでした。ls /directory | grep '^[term]期待どおり、termで始まるすべてのエントリを取得しようとすると、 私はこのコマンドをオンラインエディターで試してみました。正規表現をテストすると、正常に機能しました。しかし、バッシュではありません。したがって、シミュレーションでは機能しますが、実際には機能しません。 私はCrunchbang Linux 10で作業しています。このような基本的なレベルで実行できず、何時間もの時間を浪費することは本当にイライラするので、これが十分な情報であり、すべてのヒントを楽しみにしています。

2
Linuxでファイル名の一部として日付スタンプを含むファイルを削除するためのよりクリーンな方法
30日以上経過したMySQLダンプファイルをパージするという新しい要件があります。ファイルは「all-mysql-YYYYMMDD-HHMM.dump」の命名規則を使用しています。ファイルはSANマウントファイルシステムに配置されるため、復元は問題になりませんが、残念ながらドライブスペースが制限され、すぐにいっぱいになるため、頻繁に人間の介入が必要になります。 ファイル名の例 all-mysql-20130324-2330.dump all-mysql-20130325-2330.dump all-mysql-20130326-2330.dump 私の最初の考えは、-mtime +30を指定したバッチスクリプト内で「find」を使用することでしたが、変更時間は保証されず、古いアーカイブの一部はパージ日を回避できます:) 次のBASHスクリプトを作成しましたが、この操作を実行するためのよりクリーンな方法があることを望んでいました。 #!/bin/bash STARTING_DIR=$(pwd) FILE_PREFIX=all-mysql- BACKUP_DIR=/opt/backup/mysql/dumps ARCHIVE_WINDOW_DAYS=30 cd $BACKUP_DIR # Create YYYYMMDD datestamp for Today - $ARCHIVE_WINDOW_DAYS ARCHIVE_WINDOW_IN_SECS=$(echo "$(date +%s) - (${ARCHIVE_WINDOW_DAYS} * 86400)" | bc) PURGE_BEFORE_DATE=$(date -d @${ARCHIVE_WINDOW_IN_SECS} +%Y%m%d) for backup_file in $FILE_PREFIX* do # Trim prefix, time portion of date stamp, and …
8 linux  bash  files 

4
スクリプト出力のリダイレクトとログ
次のスニペットを整理しようとしています。設計目標は、スクリプトからのすべての出力をログに記録することであり、ラッパーであってはなりません。線が少ないほど良いです。 (この段階では)ユーザー入力は気にしません。ターゲットスクリプトは非対話的に実行されます。 スニペットは ログにstdoutを出力し、常にコンソールにエコーする ログにstderrを出力し、デバッグが有効な場合はコンソールにエコー stderrメッセージには、タイムスタンプとその他の有用性をプレフィックスとして付ける必要があります 現時点では、Ubuntuのように最近のバージョンのbash(4.2以降?)でのみテストできますが、CentOS6では正しく動作しません。 DEBUG_LOG="${0##*/}.log" # copy stdout to log always and echo to console exec &gt; &gt;(tee -a ${DEBUG_LOG}) # copy stderr to log only, unless debugging is enabled [ $DEBUG_TEST = "true" ] \ &amp;&amp; exec 2&gt; &gt;(tee -a ${DEBUG_LOG} &gt;&amp;2) \ || exec 2&gt;&gt; …

2
[[$ variable]]と[[-n $ variable]]の違いは何ですか?
bashでは[[ $variable ]]、[[ -n $variable ]]完全に同等ですか?以下の出力から判断するとそうなのかと思われますが、シェルスクリプトでは両方の使用方法が見られます。 $ z="abra" $ [[ $z ]] $ echo $? 0 $ [[ -n $z ]] $ echo $? 0 $ z="" $ [[ $z ]] $ echo $? 1 $ [[ -n $z ]] $ echo $? 1 $ unset z $ [[ $z …
8 bash  shell  test 

1
ログインしたユーザーに基づいて画面のハードステータス色を変更するにはどうすればよいですか?
しばらく.screenrcファイルを編集/作成していませんが、これは私が現在使用しているものです: # Turn off the screen startup message startup_message off # Define format of bottom navigation/status/date/etc. line hardstatus alwayslastline "%{yk}[ %H ] %-Lw%50&gt;%{gk}(%{-}%n-%t%{gk})%{-}%+Lw%&lt; %=%{yk}[ %c %d.%m.%Y ]" # Increase scrollback buffer to 30000 lines defscrollback 30000 正直に言って、hardstatus行のすべてが何を表しているのか覚えていませんが、ログインしているユーザーに基づいてホスト名の色を変更する方法を知りたいのですが、これは可能ですか?現在、どのユーザーでもログインしていると、ホスト名は黄色になります。でもルートなら赤にしたいです。これは私の.bashrcファイルで変更できるものですか?これを.bashrcに入れて、新しい画面ウィンドウ名を、接続しているサーバーのホスト名に変更します。 # Set screen window title case "$TERM" in screen) PROMPT_COMMAND='echo -ne "\033k$HOSTNAME\033\\"' ;; …

2
DVDからタイトルを読みますか?
私は各DVDイメージに半一意の大文字の名前があることに気付きました。Linuxでこの名前を非rootユーザーとして単に読み取るための標準化された方法はありますか?私はカーネル3.7を実行しているUbuntu 12.04派生物を使用しています。次のように、ドライブに現在あるディスクの名前を取得するだけです。 DVD_NAME="$( ./read-dvd-name.sh )"
8 bash  dvd 

1
環境変数とシェル変数の違い
環境変数は子プロセスで継承されると言われていますが、シェル変数は継承されていません。ただし、次のテストでは、シェル変数が環境変数と同じように子プロセスで表示されることを示しています。違いはなんですか? &gt; bash --version GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu) Copyright (C) 2007 Free Software Foundation, Inc. &gt; export TEST="ENV_TEST" #env var &gt; sh -c "echo \$TEST" ENV_TEST &gt; TEST="SHELL_TEST" #shell var &gt; sh -c "echo \$TEST" #shell var is seen in child process SHELL_TEST

2
cp -fはcp -iエイリアスを上書きできません
/home/user/.bashrcファイルには、間違いを防ぐためのエイリアスがあります。 alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' 私が何をしているのか本当にわかっている場合は、またはを使用して上書きrmおよびmvエイリアスを作成できますが、本当にファイルを上書きするかどうかは尋ねられません。rm -fmv -f 問題は、それがcpコマンドに対して機能しないcp -fことです。それでも、を使用すると質問が表示されます。 これは正常ですか?cp -iデフォルトでエイリアスを設定し、cp -fコマンドも使用できるようにするにはどうすればよいですか? 私はDebian Wheezy 64ビットを使用しています。
8 bash  alias 

2
これが「読み取り中」でターミナルで機能するのにシェルスクリプトでは機能しないのはなぜですか?
ルートウィンドウのタイトルを設定して適用される情報テキストをWMバーに入力しているときに、この興味深い問題に遭遇しました。 xsetroot -name "clever words" この目的のために、運命を印刷することはターミナルでうまく機能します: fortune -s | while read -r; do xsetroot -name "$REPLY"; done しかし、シェルスクリプトから実行すると、同じことが失敗します。 #!/bin/sh cat /tmp/afile | while read; do echo "$REPLY"; done 生成: $ sh afilereader afilereader:2:read:arg count もちろん、これは私たちの運命の結果を変数に割り当て、次にその変数でxsetrootを使用することによって修正されます。しかし、これがスクリプトで機能しない理由を理解したいと思います。 パイプラインのいずれかの側の各コマンドはそれ自体のサブシェル内で実行されることを理解していますが、ローカライズされた変数がwhile読み取りループにどのように影響するかを確認できません。または、ループの反復間でも​​変数がスコープ外ですか? 何が欠けていますか? 更新:使用したshIはダッシュにリンクされていますが、これはPOSIX準拠にされる過程にあります。より由緒あるものを使用してbashこれを解決しました。

2
awkでシェル変数を使用する
これが私のスクリプトです(指定されたパターンを含むファイルを見つけるため): find . -type f \ -exec awk -v vawk="$1" '/'"$vawk"'/ {c++} c&gt;0 { print ARGV[1]; exit 0 } END { if (! c) {exit 1}}' \{\} \; 引数付きのスクリプトを使用したい§: MyScript.sh pattern 私の問題は、$1変数をに入れることができないことawkです。 スクリプトをデバッグしようとすると bash -x MyScript.sh pattern これが出力です: + find . -type f -exec awk -v vawk=pattern '// {c++} c&gt;0 …
8 bash  awk  variable 

4
異なるホストにSSH接続するためのBashオートコンプリート機能
私はいつもいつも利用しているサーバーの大きなリストを持っsshています。使用してどのような方法があるbashか、zsh私はホスト名とbashの自動補完のリストを保つことができるように、ファイルを通過し、私がホスト名の最初の数文字を入力するたびにこれらの文字で始まるボックスの示唆を与えます。
8 bash  ssh  zsh  autocomplete 

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