最新記事

execによるリダイレクトを停止する方法
shell-script
io-redirection
exec

execによるリダイレクトを停止する方法

スクリプトのいくつかの出力をファイルにリダイレクトしたいと思います。 REDIRECT_FILE="foo.txt" echo to console # starting redirect exec > $REDIRECT_FILE echo to file echo ... echo ... # stop redirect exec >&- echo end of script 「スクリプトの終わり」は標準出力に書き込む必要があります。ところで、「無効なファイル記述子」エラーメッセージが表示されました。 exec 1>&-動作しません。 リダイレクトを停止するための正しい用語は何ですか?

Admin

bash - ディスクに書き込むことなく複数のバックグラウンドコマンドの出力をキャプチャできますか?
bash
shell-script

bash - ディスクに書き込むことなく複数のバックグラウンドコマンドの出力をキャプチャできますか?

並列化する複数のパイプラインを含むスクリプトがあります。現在は次のとおりです。 result1=$(pipeline | number | one) result2=$(pipeline | number | two) result3=$(pipeline | number | three) printf 'Result 1: %s\n' "$result1" printf 'Result 2: %s\n' "$result2" printf 'Result 3: %s\n' "$result3" 私はこれをしたい: result1=$(pipeline | number | one) & result2=$(pipeline | number | two) & result3=$(pipeline | number | three) & printf 'Result 1: %s\n' "$result1" printf 'Result 2: %s\n' "$result2" printf 'Result 3: %s\n' "$result3" ただし、割り当てはサブシェルで行われるため、これは機能しません。 ディスクの出力ファイルをリダイレクトできます。 pipeline | number | one > result1 & pipeline | number | two > result2 & pipeline | number | three > result3 & wait printf 'Result 1: %s\n' "$(

Admin

Tar コマンドは、BASH スクリプトで実行した場合と手動で実行したときに若干異なる出力を提供します。
bash
shell-script
tar

Tar コマンドは、BASH スクリプトで実行した場合と手動で実行したときに若干異なる出力を提供します。

次のスクリプトを実行しようとしています。 #!/bin/sh pm2 stop process cd ~/userdata/ tar -czvf backup.tar.gz Config mv backup.* ~/backups/ pm2 start process スクリプトの実行時にbackup.tar.gz出力ファイルは空のディレクトリを除外しますが、コマンドラインからtarコマンドを手動で実行すると、そのディレクトリが含まれます。私はスクリプトが空であるかどうかに関係なく、すべてのファイルとサブディレクトリを含めたいと思います。 編集する: を使用すると、tar --version次の結果が表示されます。 script を使用して作成したアーカイブには空のtar (GNU tar) 1.34 Copyright (C) 2021 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by John Gilmore and Jay Fenlason. ディレクトリは存在せず、手動コマンドを使用して作成したアーカイブで実行すると、そのディレクトリが含まれます。tar -tvf

Admin

Bashスクリプトでgetoptsオプションを使用して即座に終了する方法
bash
shell-script
getopts

Bashスクリプトでgetoptsオプションを使用して即座に終了する方法

私は何を試しましたか? #!/bin/bash # set -e echo hello while getopts sr o; do case $o in s) echo "no" yell() { echo "$0: $*" >&2; } die() { yell "$*"; exit 111; } try() { "$@" || die "cannot $*"; } ;; r) echo "yes" yell() { echo "$0: $*" >&2; } die() { yell "$*"; exit 111; } try() { "$@" || die "cannot $*"; } ;; \?) exit 3;; #invalid option esac done echo after_case 私がやりたいこと:端末で次の2つのコマンドを実行します: bash /home/jian/Desktop/pgdev/test1.sh -s bash /home/jian/Desktop/pgdev/test1.sh -r No prints aftercase。 引用:Bashでgetoptを使用する方法 https://stackoverflow.com/questions/1378274/in-a-bash-script-how-can-i-exit-the-entire-script-if-a-certain-condition-occurrs

Admin

特殊文字までファイルを読み取り、その部分を別のファイルにコピーして、eofまで続けます。
linux
shell-script
split

特殊文字までファイルを読み取り、その部分を別のファイルにコピーして、eofまで続けます。

Linuxでファイルを読み取ろうとしているときに「&」文字が表示されたら、出力を別のファイルに書き込んでそのファイルを別のフォルダに送信し、次に「&」が表示されるまで元のファイルを読み続けます。 XMLファイルの入力 - & & 私のコードスニペット - while IFS= read -r line;do if [["$line" =="$delimeter"]];then echo "$line" | sed "s/delimeter.*//">> "$output_file" cp "$output_file" "$TARGET_FOLDER" break else echo "$line" >> "$output_file" fi done < "$input_file" ただし、コードは区切り文字の発生に応じて分割するのではなく、ファイル全体を出力として生成します。どこで間違っているかを指摘できますか? 期待される出力 - 最初 to (&まで)の部分は、TARGET_FOLDERにコピーされる出力ファイルに保存されます。次に、次の to セクションをコピーします。 ご協力ありがとうございます!

Admin

Bashは期待どおりに実行されず、COMPRPLYの最初の結果をキャプチャしてから、すべての結果をコマンドとして実行しますか?
bash
shell-script
shell

Bashは期待どおりに実行されず、COMPRPLYの最初の結果をキャプチャしてから、すべての結果をコマンドとして実行しますか?

これは少しトリッキーです。まず、ここで何をしたいのかを設定します。そうすれば、私が達成したいことについてのアイデアを得ることができます。 このファイルからホスト名とホスト名を取得するために、SSH構成ファイルセットを読み込んでいます。特定のホストに対してカスタムスクリプトを実行するためにこれを実行しており、これを達成するためにホスト対応のbashスクリプトを作成しようとしています。 設定をインポートし、awkを使用してホストとホスト名を解析し、辞書にリストし、その辞書のキーを使用して使い方を完了します。 #!/bin/bash NETWORKS_PATH=~/.ssh/Networks/ files=($(ls $NETWORKS_PATH)) declare -A a_dict _read_network () { file=$1 while read -r line; do host=$(awk $line '$1 == "Host" { print $2 }') done < $file for hostiter in ${host[@]}; do hostname=$(ssh -n -tt -G $hostiter | awk '$1 == "hostname" { print $2 }') a_dict[$hostiter]=$hostname done } _ff_completions() { local hosts for file in ${files[@]}; do _read_network "$NETWORKS_PATH$file" done for key in "${!a_dict[@]}"; do hosts+="$key " done COMPREPLY=$(compgen -W "$hosts" -- "${COMP_WORDS[1]}") } complete -F _ff_completions ff ホスト名とホストは正しくキャプチャされ、全体の一部として出力できますが、全体は最初の提案としてリストされている最初のサーバーを「注入」して中断されるようです。コマンドを実行しようとすると、すべての提案がコマンドに渡されます。私は少し混乱しています。私はこれに慣れておらず、ちょっとした練習が不足しています。

Admin

Linux Shellでファイル名の一部を変数として保存する
linux
shell-script

Linux Shellでファイル名の一部を変数として保存する

現在のファイル名:017251004_2301941_5193716.xml 必要な数:5193716 _.xml最後の数字の前後の数字を変数に保存する必要があります。誰かが同じ構文を提供できますか? 私はこれを試しましたが、num="${file:19:7}" 400万個のファイルがあり、ある程度動作していたため、一部のファイルをインポートした後にフルネームを取得できませんでした。 現在のコード: for file in "$origin"/*.xml do [ -f "$file" ] || continue # In case there are no files to copy name=${file%.*} # Strip extension name=${name##*/} # Strip leading path save="${name}_$dt.xml" # Backup filename with datetime suffix num="${file:19:7}" echo "Copying file from Server A to Server B" scp -C -- "$file" "$username@$ip:$destination" done

Admin

Bashからグローバルおよびローカルシェル変数(関数や環境変数ではない)のみを取得するきちんとした方法
bash
shell-script

Bashからグローバルおよびローカルシェル変数(関数や環境変数ではない)のみを取得するきちんとした方法

関数と環境変数をスキップしてBashからローカル変数とグローバル変数の値を取得するにはどうすればよいですか? declare -p私に全体の山を与えた。しかし、私がそれに頼ることができるかどうかはわかりませんdeclare -p。また、関数を含めることができるかどうかもhelp declare出力では不明です。declare -p実験によると、これは本当ではありません。 例: 一部の変数の出力は次のようになります。 declare -- VARNAME="Variable value" declare...そして、次のように代わりにオプションを提供する他のものもあります--: declare -ir UID="197609" 今私は知る出力にはこの形式を使用できます。単純に同様のループを使用して、出力を読み取り専用整数変数に制限declareできます。while while read -r decl opts keyval; do if [[ "$opts" == *ir* ]]; then # could obviously also be case/esac echo "$keyval" fi done < <(declare -p) ...したがって、興味のない変数の種類を消去します。 質問:しかし、できるくそー、そうですか?そうでない場合、簡潔特定の基準に基づいて変数をフィルタリングする方法はありますか? 注:私はBash> = 5.0に興味があります。現在、私のコンピュータでは5.2.15を使用しています。

Admin

コマンドツリーのようにディレクトリ内のすべてのファイルを繰り返し、すべてのファイル名を印刷する方法
bash
shell-script
directory
for

コマンドツリーのようにディレクトリ内のすべてのファイルを繰り返し、すべてのファイル名を印刷する方法

treeコマンドを模倣し、ディレクトリ内のすべてのファイルとサブディレクトリを繰り返し、すべてのファイル名をエコーするにはどうすればよいですか? 私はディレクトリ内のサブディレクトリがまだディレクトリと見なされていると思い、次のようにしました。 for FILE in *; do if [ -d $FILE ] then echo "$FILE is a directory"; else echo "$FILE is a file" fi done サブディレクトリ内で再帰とループを作成し、すべてのファイルを繰り返し、ファイル名+パスを印刷するにはどうすればよいですか? bash を使用するシェルスクリプトです。ありがとうございます!

Admin

ハードコーディングなしで特定の行に文字列を追加する方法
linux
shell-script
ubuntu
shell
command-line

ハードコーディングなしで特定の行に文字列を追加する方法

2つのファイルがあり、最初のファイルには出力があり、他のファイルにはテンプレートがあります。値をハードコードせずに出力のテンプレートにIDを追加したいと思います。 Output.txt, abc 8392382222 def 9283923829 ghi 2392832930 Template file, Pool : 1 Some text Some text Some text name: no: London UK name: no: London UK name: no: London UK Pool : 2 Some text Some text Some text name: no: London UK name: no: London UK name: no: London UK 以下のようにテンプレートに出力ラインを追加したいと思います。 Pool : 1 Some text Some text Some text name: abc no: 8392382222 London UK name: def no: 9283923829 London UK name: ghi no: 2392832930 London UK Pool : 2 Some text Some text Some text name: abc no: 8392382222 London UK name: def no: 9283923829 London UK name: ghi no: 2392832930 London UK

Admin

空の場合でも、コマンド出力から列を抽出します。
linux
bash
shell-script
awk
sed

空の場合でも、コマンド出力から列を抽出します。

コマンド出力から2番目の列を抽出しようとしています。 たとえば、 $ sudo /usr/sbin/pvs PV VG Fmt Attr PSize PFree /dev/sdc1 vgswap lvm2 a-- 16.00g 0 /dev/sdc2 rootvg lvm2 a-- 48.00g 2.70g /dev/sde lvm2 --- 32.00g 32.00g /dev/sdf lvm2 --- 32.00g 32.00g しかし、問題は、一部のディスクがVGに関連付けられていないため、出力の抽出中にVG名が空であることです。 $ sudo /usr/sbin/pvs | awk '{print $2}' VG vgswap rootvg lvm2 lvm2 このように抽出したいです(空の場合は空にしてください) vgswap rootvg

Admin