タグ付けされた質問 「shell-script」

シェルスクリプト、シェルによって解釈される実行可能ファイル(bash、zshなど)に関する質問。


5
LinuxのdateコマンドでISO8601の日付を解析する方法
dateコマンドを使用して、dateコマンド自体が解釈できるファイルのタイムスタンプを生成しようとしています。ただし、dateコマンドは独自の出力を好まないようで、これを回避する方法はわかりません。適例: sh-4.2$ date Fri Jan 3 14:22:19 PST 2014 sh-4.2$ date +%Y%m%dT%H%M 20140103T1422 sh-4.2$ date -d "20140103T1422" Thu Jan 2 23:22:00 PST 2014 日付は、15時間のオフセットで文字列を解釈しているようです。これに関する既知の回避策はありますか? 編集:これは表示の問題ではありません: sh-4.2$ date +%s 1388791096 sh-4.2$ date +%Y%m%dT%H%M 20140103T1518 sh-4.2$ date -d 20140103T1518 +%s 1388737080 sh-4.2$ python Python 3.3.3 (default, Nov 26 2013, 13:33:18) [GCC 4.8.2] …


3
bashスクリプトエラーstty:標準入力:デバイスの不適切なioctl
パスワードが何度も必要なインストールとセットアップを自動化するために、bashスクリプトでヒアドキュメントを使用しています。パスワードを1回入力すると、スクリプトはそれをさまざまなコマンドに渡します。ほとんどの場合、ヒアドキュメントアプローチがこの罰金を処理します。ただし、ある場合にはこのエラーが発生します。 Enter VNC password: stty: standard input: Inappropriate ioctl for device Verify password: stty: standard input: Inappropriate ioctl for device このエラーメッセージはx11vnc -storepassword(ではなく)からのものであることに注意してくださいsudo。 私の問題は関連してx11vnc -storepasswdおり、ここに私のコードがあります: sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC password password y ENDDOC それは明らかに(エラーから)動作しません。sudo x11vnc -storepasswd ~/.vnc/passwdスクリプトに実装する方法の実用例に感謝します。 役立つ場合、プロンプトは次のようになります。 VNCパスワードの入力:パスワードの 確認: /home/user/.vnc/passwdにパスワードを書き込みますか?[y] / nn 使用expectする方が良い解決策でしょうか?もしそうなら、この場合どのように使用しますか?(これまで使用expectしたことはありませんが、この質問を投稿してから多くの例を見てきましたexpect。自分で作業することはできません。)

3
シェルスクリプトでstderrへのリダイレクトを使用する場合
grepのような行儀の良いユーティリティは、stdoutに「通常の」メッセージを、stderrにエラーメッセージを出力することを知っています。 $ grep '^foo' file1 file2 file1:foo grep: file2: No such file or directory シェルスクリプトを自分で書いているとき、stderrにどの出力とメッセージを表示するか、または気にする必要があるかどうかを判断するのが難しいことがよくあります。 私は良い習慣について知りたいです:いつメッセージをstderrにリダイレクトするのが適切であり、そうでないのか? 「依存します」は確かですが、これらの決定を下すのに役立つ洞察はありますか? この主観的な質問を形式に合うようにするために、「なぜ」に対処し、経験と可能であれば事実に裏打ちされた情報が得られる答えを奨励したいと思います。

4
ホイップテールまたはダイアログ
ユーザー入力を使用するスクリプトを作成するため、ホイップテールを使用することにしましたが、ポータブルでubuntu 10.x以上およびCentOs5.x以上で動作するものを少し混乱させます。 私は知ってreadいますが、ツールのようなダイアログが欲しいので、誰かが他の選択肢を知っているなら、私に知らせてください。

4
bashスクリプトを使用してコンソールの幅を取得する
スクリプトを使用して端末のサイズを取得しようとする問題が発生しています。通常tput cols、コンソール内でコマンドを使用しますが、スクリプトを厳密に使用してこの機能を実現できるようにしたいと考えています。 今のところ、実行中のコンソールを検出し、そのファイルパスを取得できます。ただし、この情報を使用してコンソールの幅を取得するのに苦労しています。私はコマンドを使用しようとしましたtputが、Linux /スクリプトにはかなり慣れていないので、どうすればよいかわかりません。 これを行う理由は、コンソールにその幅/列を頻繁に通知するcronエントリを設定できるようにすることです。 これはこれまでの私のコードです: tty.sh #!/bin/bash #Get PID of terminal #terminal.txt holds most recent PID of console in use value=$(</home/test/Documents/terminal.txt) #Get tty using the PID from terminal.txt TERMINAL="$(ps h -p $value -o tty)" echo $TERMINAL #Use tty to get full filepath for terminal in use TERMINALPATH=/dev/$TERMINAL echo $TERMINALPATH …

5
文字列の表示幅を取得します
シェルスクリプトから文字列の表示幅(少なくとも(現在のロケールの文字を正しい幅で表示する端末上で)表示幅)を取得するポータブルな方法に最も近いもの。 私は主に非制御文字の幅に興味がありますが、バックスペース、キャリッジリターン、水平タブのような制御文字を考慮したソリューションも歓迎します。 言い換えると、POSIX関数のシェル APIを探していwcswidth()ます。 そのコマンドは以下を返します: $ that-command 'unix' # 4 fullwidth characters 8 $ that-command 'Stéphane' # 9 characters, one of which zero-width 8 $ that-command 'もで 諤奯ゞ' # 5 double-width Japanese characters and a space 11 一つは使用することができますksh93のをprintf '%<n>Ls'考慮にパディングのための文字幅とる<n>列、またはcol(例えばして、コマンドをprintf '++%s\b\b--\n' <character> | col -b試してみて、それを導き出すために)、そこにテキスト:: CHARWIDTHだperl少なくともモジュールが、そこより直接的またはポータブルなアプローチです。 それは多かれ少なかれ、テキストを表示する前にその情報を知る必要がある画面の右側にテキストを表示することに関する他の質問のフォローアップです。

2
bashシェルのforループ内で文字列変数を連結する[終了]
閉じた。この質問には詳細または明確さが必要です。現在、回答を受け付けていません。 この質問を改善したいですか?詳細を追加し、この投稿を編集して問題を明確にします。 6年前に閉鎖されました。 #!/bin/bash names= find /home/devuser -name 'BI*' echo $names for name in {names[@]} do echo $name $var = $var$name done echo $var

3
シェルスクリプト-予期しないトークン「else」付近の構文エラー
次のシェルスクリプトで、エラーが発生する理由 syntax error near unexpected token `else' シェルスクリプト echo "please enter username" read user_name echo "please enter password" read -s pass echo ${ORACLE_SID} SID=${ORACLE_SID} if ["${ORACLE_SID}" != 'Test'] then sqlplus -s -l $USER_NAME/$PASS@$SID <<EOF copy from scott/tiger@orcl insert EMP using select * from EMP exit EOF else echo "Cannot copy" …

4
構文エラーでbashにスクリプトの実行を中止させる方法は?
安全のために、構文エラーが発生した場合、bashはスクリプトの実行を中止します。 驚いたことに、私はこれを達成できません。(set -e十分ではありません。)例: #!/bin/bash # Do exit on any error: set -e readonly a=(1 2) # A syntax error is here: if (( "${a[#]}" == 2 )); then echo ok else echo not ok fi echo status $? echo 'Bad: has not aborted execution on syntax error!' 結果(bash-3.2.39またはbash-3.2.51): $ ./sh-on-syntax-err …


2
コマンド用の `tee`
teeパイプされた標準入力を標準出力とファイルにリダイレクトできます。 echo Hello, World! | tee greeting.txt 上記のコマンドは、端末画面にグリーティングを表示し、greeting.txtファイルの内容に保存し、その名前でファイルがない場合はファイルを作成します。 上書きする代わりに既存のファイルに追加する-aためのスイッチもありteeます。 パイプ入力をファイルではなくコマンドと標準出力にリダイレクトする便利な方法はありますか? bukuインデックス番号で指定されたブックマークのURLをプライマリ選択にコピーするためのラッパースクリプトを作成しようとしています。 # bukuc: #!/bin/sh url=$(buku -f 1 -p $1 | cut -f 2) # NUMBER : URL echo $url # DISPLAY echo $url | xsel # PRIMARY SELECTION ここではecho 2回使用します。最初は端末に表示し、次にプライマリ選択(クリップボード)に保存します。 echo $url | teeC xsel次のコマンドに渡す前に出力を表示するための何かまたはショートカットを想像してください(コマンドを連鎖する)、次のように結果を変数に保存することなく、コマンド全体を1行に連鎖させることができます: buku -f 1 -p $1 …

2
シェルスクリプト内のプログラムにコマンドラインパラメーターを渡す
./script.sh arg1 [arg2 arg3 ...]コマンドライン引数はarg1、arg2、...によって得することができ$1、$2...しかし、引数の数がされないで固定します。 シェルスクリプトではarg2、プログラムから開始する引数を渡します。 #/bin/bash ... /path/to/a/program [I want to pass arg2 arg3 ... to the program] ... 1つ以上の引数がある可能性があるので、どうすればそれができますか?

3
Bashスクリプトのソース-終了の代わりにエラーで戻りますか?
私はターミナルでbashスクリプトを調達しているので、エラーで終了します set -o errexit ターミナルを閉じ、別のターミナルを開いて、いくつかの変数をリセットする必要があるため、非常に迷惑です。 これまでのところ、使用して command || return スクリプト内の行は、まさに私が望むことをしています set -o errexit すること...しかし、スクリプト全体に対してそれを実行したいのです。1行/コマンドだけではありません サイトを設定するためのコマンドがいっぱいのファイルがありますが、コマンドを実行したくない|| 帰る ファイル内のすべての行に対して 別の設定オプション、またはターミナルを終了する代わりに単に「戻る」何か他のものがありますか? - わかりやすくするために、スクリプトを強制終了し、ctrl + Cを押してターミナルで実行中のサービスを強制終了するのと同じ状態のままにします。command || returnそれをします。しかし|| return、ファイル内のすべての行に手を加えたくありません。だからset -o errexit、端末をシャットダウンさせないに似たものを探しています ---注: 2行のダムスクリプト(super.sh)の作成: create_path=~/Desktop/site_builder/create.sh source $create_path blah そして置くset -o errexitcreate.shの上部に、 期待どおりに動作します。ただし、ターミナルから呼び出すのではなく、別のbashスクリプトを呼び出すために、2行のファイルを作成する必要があるのは本当に愚かなことです。うーん 以下に例を示します。 super.shで #!/bin/bash create_path=~/Desktop/site_builder/create.sh source $create_path blah create.shで #!/bin/bash set -o errexit #line …

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