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

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

2
Bash変数の初期化-必要に応じて、推奨、または定義してください。
メインコードの前、または実際の値を割り当てる前に関数内のローカル変数のいずれかで、スクリプト内のbash変数の値を初期化することのメリット/デメリットはありますか? 私はこのようなことをする必要がありますか? init() { name="" name=$1 } init "Mark" 変数がガベージ値で初期化されて(初期化されていない場合)、変数の値に悪影響を与えるリスクはありますか?
9 bash  variable 


5
ファイルをトランザクションでコピーする方法は?
ファイルをAからBにコピーしたいのですが、ファイルシステムが異なる場合があります。 追加の要件がいくつかあります。 コピーは全部かゼロかであり、クラッシュ時にファイルBの一部または破損は残されません。 既存のファイルBを上書きしないでください。 同じコマンドの同時実行と競合しないでください。成功するのは1つだけです。 私はこれが近づくと思います: cp A B.part && \ ln B B.part && \ rm B.part しかし3.は、B.partが存在する場合でも(-nフラグを使用しても)失敗しないcpに違反しています。その後、他のプロセスがcpに「勝ち取り」、リンクされたファイルが不完全な場合、1。が失敗する可能性があります。B.partも無関係のファイルである可能性がありますが、その場合は他の隠しファイル名を試さなくても失敗します。 私はbash noclobberが役立つと思いますが、これは完全に機能しますか?bashバージョンの要件なしで取得する方法はありますか? #!/usr/bin/env bash set -o noclobber cat A > B.part && \ ln B.part B && \ rm B.part フォローアップ、とにかくこれでいくつかのファイルシステムが失敗することを知っています(NFS)。そのようなファイルシステムを検出する方法はありますか? 他のいくつかの関連するがまったく同じではない質問: ファイルシステム全体のアトミック移動を概算していますか? 私のfsはmvアトミックですか? eMMCでファイルとディレクトリをtempfsからext4パーティションにアトミックに移動する方法はありますか https://rcrowley.org/2010/01/06/things-unix-can-do-atomically.html
9 linux  bash  cp 

4
ループと拡張のパフォーマンス
以下の比較に関する専門家の提案が必要です: ループを使用したコードセグメント: for file in `cat large_file_list` do gzip -d $file done 単純な拡張を使用したコードセグメント: gzip -d `cat large_file_list` どちらが速くなりますか?大きなデータセットを操作する必要があります。


6
stdinの最後の行をstdin全体に付加
次のスクリプトについて考えてみます。 tmpfile=$(mktemp) cat <<EOS > "$tmpfile" line 1 line 2 line 3 EOS cat <(tail -1 "$tmpfile") "$tmpfile" これは機能し、出力します: line 3 line 1 line 2 line 3 実際のファイルではなく、入力ソースが標準入力だったとしましょう。 cat <<EOS | # what goes here now? line 1 line 2 line 3 EOS コマンドを変更する方法: cat <(tail -1 "$tmpfile") "$tmpfile" それで、この異なるコンテキストで、同じ出力を生成しますか? …
9 bash 

1
ダッシュで始まるCLI引数とともに使用すると、ティルダ(〜)が展開しないのはなぜですか?
私はVNCサーバー(x0vncserver)を実行しようとして数時間を失い、クライアントは奇妙なメッセージで接続を拒否しました。 No password configured for VNC Auth サーバーもこのエラーを出力します SVncAuth: opening password file '~/.vnc/passwd' failed さて、チルダがシェルによってもx0vncserverによっても拡張されないことに気づくまで、私は多くの時間を無駄にしました。次に、これらのテストを実行しました $ echo --PasswordFile=~/.vnc/passwd --PasswordFile=~/.vnc/passwd だが $ echo PasswordFile=~/.vnc/passwd PasswordFile=/home/tichomir/.vnc/passwd 何故ですか?引数がダッシュで始まる場合、シェルがチルダの展開を拒否するのはなぜですか?チルドは引用されていない限り常に拡張すると思いましたが、明らかに別のルールが関係しているのでしょうか?
9 bash  shell  tilde 

3
サポートされていない「ショップ」オプションが.bashrcでエラーを発生させないようにするにはどうすればよいですか?
さまざまなバージョンのBashをさまざまなHPCノード、VM、または個人用ワークステーションで実行している可能性がある、比較的異種の環境で作業しています。私はログインスクリプトをGitリポジトリに配置しているので.bashrc、「もしこのホストなら...」タイプの面倒さをあまり使わずに、同じように全面的に使用したいと思います。 私のようなバッシュ≤拡大し4.1のデフォルトの動作cd $SOMEPATHにcd /the/actual/path押したときにTabキーを。バッシュ4.2以上では、あなたがする必要があるだろうshopt -s direxpandし、この動作を再度有効にし、それが利用可能になっていませんでした4.2.29まで。ただし、これはほんの一例です。別の、おそらく関連するshoptオプションcomplete_fullquote(それが何をするのか正確にはわかりませんが)もv4.2でデフォルトの動作を変更した可能性があります。 ただし、direxpand以前のバージョンのBashでは認識されないためshopt -s direxpand、自分のを使用しようとする.bashrcと、古いBashのノードにログインするたびにエラーメッセージがコンソールに出力されます。 -bash: shopt: direxpand: invalid shell option name 私は何をしたいのは、条件付きの周りをラップでshop -s direxpandバッシュの旧バージョン(擦れずに、堅牢な方法でバッシュ> 4.1にそのオプションを有効にするには、すなわち、ちょうどにエラー出力をリダイレクトしません/dev/null)。

3
アンパサンドを「可変化」する(プロセスのバックグラウンド)
アンパサンドを変数に入れ、それを使用してプロセスをバックグラウンドに送信する方法があるかどうかを知りたいです。 これは機能します: BCKGRND=yes if [ "$BCKGRND" = "yes" ]; then sleep 5 & else sleep 5 fi しかし、これら5つのラインを1つだけで達成するのはクールではないでしょうか。そのようです: BCKGRND='&' sleep 5 ${BCKGRND} しかし、それはうまくいきません。BCKGRNDが設定されていない場合は機能しますが、設定されている場合はリテラル「&」として解釈され、エラーになります。

3
TABで区切られた文字列をbashで印刷する方法は?
タブで区切られた2つの文字列を印刷しようとしています。私が試してみました: echo -e 'foo\tbar' printf '%s\t%s\n' foo bar それらの両方が印刷します: foo bar 2つの間の空白は実際には5つのスペースです(パテでマウスを使用して出力を選択する場合)。 コマンドを入力するときにCTRL + Vを使用してTabキーを押しても同じ結果が得られました。 タブをタブとして強制的に印刷する正しい方法は何ですか?出力を選択して、タブを使用して別の場所にコピーできますか? そして2番目の質問:bashがタブをスペースに展開するのはなぜですか? 更新:どうやら、これはパテの問題です:https : //superuser.com/questions/656838/how-to-make-putty-display-tabs-within-a-file-instead-of-changing-them-to -スペース

2
bash:echo:書き込みエラー:システムコールが中断されました
8桁のすべての数字(00000000から99999999)を含む並べ替えられたリストを生成したいと思います。シェルに次のように入力しました。 f() { while IFS="" read -r line; do for i in {0..9}; do echo "$line$i"; done; done } echo | f | f | f | f | f | f | f | f | tee result.txt | wc -l 応答は bash: echo: write error: Interrupted system call …
9 bash 

2
コマンドを動的に作成する
私はスクリプトで作業しており、tarコマンドを動的に作成する必要があります。 ここに私が何をしようとしているのかを説明する2つの例があります: #!/bin/bash TAR_ME="/tmp" EXCLUDE=("/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*") _tar="tar "`printf -- '--exclude="%s" ' "${EXCLUDE[@]}"`" -zcf tmp.tar.gz" echo COMMAND: "${_tar}" ${_tar} "$TAR_ME" echo -e "\n\nNEXT:\n\n" EXCLUDE=("--exclude=/tmp/hello\ hello" "--exclude=/tmp/systemd*" "--exclude=/tmp/Temp*") _tar="tar "`printf -- '%s ' "${EXCLUDE[@]}"`" -zcf test.tar.gz" echo COMMAND: "${_tar}" ${_tar} "$TAR_ME" _tarコマンドとして使用できるようにしたいのですが、クラシックパスで機能させることができましたが、フォルダ名のスペースを操作する必要があります。そして、毎回次のようなエラーが発生しました: COMMAND: tar --exclude="/tmp/hello hello" --exclude="/tmp/systemd*" --exclude="/tmp/Temp*" -zcf tmp.tar.gz …


6
要素の長さに従って配列をバッシュソートしますか?
文字列の配列がある場合、各要素の長さに従って配列をソートしたいと思います。 例えば... array=( "tiny string" "the longest string in the list" "middle string" "medium string" "also a medium string" "short string" ) ソートする必要があります... "the longest string in the list" "also a medium string" "medium string" "middle string" "short string" "tiny string" (おまけとして、リストが同じ長さの文字列をアルファベット順に並べ替えるといいでしょう。上記の例では、同じ長さでもmedium string前に並べ替えられmiddle stringていました。しかし、解決)。 配列がインプレースで並べ替えられている(「配列」が変更されている)場合、または新しい並べ替えられた配列が作成された場合は問題ありません。


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