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

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

3
`while`ループの最適化
ボタンを押すとRaspberry Piを再起動するミニスクリプトを作成しました。スクリプトは、wiringPi(gpioコマンド)を使用してピン0(Raspberry Piの標準の番号付け順序ではピン17)を入力に設定し、値が1になるまで(つまり、ボタンが押されるか押し下げられるまで)読み取ります。 これが私のスクリプトです: gpio mode 0 in while (true) do if [ `gpio read 0` -eq 1 ] then echo password | sudo -S reboot break fi done & スクリプトはすべて正常に機能します。 ただし、Piに慣れていない方のために、非常に限られたハードウェアリソース(512 MBのメモリを含む)が付属しているため、私が使用しているようなループで簡単に消費できます。 ここで達成しようとしているのは、bashが値がから0に変わったときに1、無条件ループのように専用にする必要なしに、それを見つける別の方法を見つけることです。これは可能ですか?あなたのアイデアを共有してください。

1
シェルスクリプトへの入力に端末のオートコンプリートパス機能を使用する
次のようなスクリプトを作成したいと思います。(1)ユーザーがタブを使用してオートコンプリートを実行できるようにするパスを取得し、(2)ユーザーからファイル名を取得し、(3)そのパスに拡張子が付いたファイルを作成します。 txt。 私の質問は次のとおりです。「自動補完」パスである入力を要求するようにbashに指示するにはどうすればよいですか? 注:パスにはほとんどの場合スペースが含まれます。

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

2
指定されたタイムスタンプよりも新しいすべてのファイルをリストし、それらを並べ替えます
タイムスタンプよりも新しいすべてのファイル(日付順)を20130207003851ディレクトリ/ tmpのみの形式で一覧表示したい。サブディレクトリは省略できます。 SUSE Linux Enterprise Server 11。 出力フォーマットは S0002948.LOG Feb 7 03:28 S0002935.LOG Feb 7 05:58 S0002952.LOG Feb 7 09:58 S0002940.LOG Feb 7 11:58 find / tmp -newermt "7 feb 2013" -lsは、必要なファイルをリストしますが、 タイムスタンプを20130207003851の形式で使用する方法 出力を並べ替えるにはどうすればよいですか? ファイル名と日付のみを表示するにはどうすればよいですか。最初にファイル名、次に日付? PSタッチを使用して検索用の参照ファイルを作成したくない pss find -newermt "20130207003851" -ls find: I cannot figure out how to interpret `20130207003851' …

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これを解決しました。

3
setxkbmapを切り替えるスクリプト
:私は間をトグルすることをbashスクリプトを希望 setxkbmap seしてsetxkbmap us。 次に、CtrlEscキーボード>カスタムショートカットを介してそのスクリプトをマッピングするつもりです。 ポイントは、でキーボードのレイアウトを切り替えたいということですCtrlEscape。どうすれば実装できますか?

1
Bashスクリプトが入力を読み取らない
コマンドをバックグラウンドで実行することを想定したスクリプトがあります。問題は、スクリプトが読み取りコマンドに遭遇したときに、一時停止して入力を受け付けないことです。ここにあります: printf "Where is yo music?: " read musicPath cd $musicPath ls | while read currentSong;do seconds=`mdls "$currentSong"|sed -n '20p'|awk '{print $3}'|cut -d. -f1` hours=$((seconds / 3600)) seconds=$((seconds % 3600)) minutes=$((seconds / 60)) seconds=$((seconds % 60)) echo "Song: $currentSong" echo "Length: $hours:$minutes:$seconds" afplay "$currentSong"& printf "yes (y), no (n), or …

1
シェルスクリプトがbashまたはshのどちらで記述されているかを確認する方法
スクリプトが記述されているかどうかを確認するにはどうすればbashよいshですか? Linuxではbashスクリプトに次の行があるため、スクリプトの最初の行はここでは役に立ちません。 #!bin/sh 実際には、Bourne Shellではなく、/bin/shbash(おそらくこれらのディストリビューション/bin/shへのリンク/bin/bash)である多くのディストリビューションがあります。したがって、FreeBSDなどでbashで記述されたスクリプトを実行しようとすると、結果は定義されません。これ/bin/shは、FreeBSDではBourne Shellであり、bashではないためです。 スクリプトがbashかshかを識別する簡単な方法はありますか? 構文に特徴的な点はありますか?

2
shがbashまたはdashへのシンボリックリンクである場合、bashはそれ自体をPOSIX準拠に制限するため、shと100%互換でなければなりませんか?
bashとshの違いから: 質問への同意:/bin/shbashへのリンクとして持っている場合、bashは、/bin/shとして呼び出されたときと同じように呼び出された場合と同じように動作しません/bin/bash。として呼び出されるとsh、ほとんどの場合POSIX準拠と限定された拡張セットに制限されます。 Linuxでshへのシバンがあるシェルスクリプトに出くわしたときはいつでも#!/bin/sh、そのディストリビューション上であってもbin/sh、ダッシュやbashなどの別のシェルへのシンボリックリンクである場合、ボーンシェルと100%互換性があるはずです。それはそれ自体を限られた拡張セットに制限しますか?それで、私はそれらをFreeBSDで実行できますか?例外はありますか?それとも私はそれがうまくいくと仮定しても安全でしょうか? したがって、ディストリビューションで、bin/shへのシンボリックリンクbin/bashであり、スクリプトの使用#!/bin/shとスクリプトにbashismが含まれている場合、bashはshモードのようになるため、実行されません。

6
端末を使用してツイートする方法は?
端末でメッセージをツイートしたいのですが。 私は次のようなことを試しました: curl -u 'TwitterUsername':'TwitterPassword' -d status=”Your Message Here” https://twitter.com/statuses/update.xml しかし、これはもう機能していないようです。 次のようなエラーが発生します。 <?xml version="1.0" encoding="UTF-8"?> <errors> <error code="53">Basic authentication is not supported</error> </errors> では、ターミナルからツイートするにはどうすればよいでしょうか。 PS .:私のやる気は私が屋久家ターミナルをよく使うからで、そこからツイートするのは素晴らしいことです。

5
KornシェルでサブシェルのPIDを取得する方法($ BASHPIDと同等)
bashでは、この便利な変数があります。$ BASHPIDは常に、現在実行中のサブシェルのPIDを常に返します。kshでサブシェルのPIDを取得するにはどうすればよいですか?たとえば、次のコードを参照してください。 #!/usr/bin/ksh93 echo "PID at start: $$" function run_in_background { echo "PID in run_in_background $$" run_something & echo "PID of backgrounded run_something: $!" } function run_something { echo "*** PID in run_something: $$" sleep 10; } run_in_background echo "PID of run in background $!" これは以下を出力します: PID at start: 5328 …

1
事前に定義されたリストを除くすべてのディスクで「echo 1> / sys / block / sdX / device / delete」
削除する必要のあるSCSIディスクのリストがあります。リストはせいぜいランダムであり、時々変更されます。自分で作成した定義済みのリスト以外はすべて削除したい。とりあえず保持したいだけだとしましょう: /dev/sda /dev/sdb 私が実行する必要があるコマンドは次のとおりです。 "echo 1 > /sys/block/sdX/device/delete" Xは削除するデバイスです。 私はbashスクリプトが得意ではないので、どこから始めればいいのか本当にわかりません。 要約すると、明確でないためにDVされないようにします。 事前に定義されたリストを除いて、システム上のすべてのsdXデバイスに対して「エコー1> / sys / block / sdX / device / delete」を実行する必要があります。 編集:以下の答えの後、これは私が使用することに決めたものです。「LocalDisks.txt」には「/ dev / sda」のような行が含まれている必要があります #!/bin/bash exclude=$(cut -d/ -f3 LocalDisks.txt) for sysfile in /sys/block/sd* ; do dev=$(basename $sysfile) del=$sysfile/device/delete if [[ $exclude == *$dev* ]] ; then echo "Device …

6
タブ区切りデータをコンマ区切りデータに変換するにはどうすればよいですか?
アマゾンのec2コマンドラインツールを介してec2スナップショットのリストをリクエストしています。 ec2-describe-snapshots -H --hide-tags > snapshots.csv データは次のようになります。 SnapshotId VolumeId StartTime OwnerId VolumeSize Description snap-00b66464 vol-b99a38d0 2012-01-05 5098939 160 my backup リダイレクトする前にデータを傍受snapshots.csvし、次のことを行うにはどうすればよいですか。 「タブ」をコンマに置き換えます 引用符で値をカプセル化する 値がすべて数値の場合は、プレフィックスとしてを付けて、=Excelでテキストとして扱われるようにします。たとえばOwnerId、"=5098939"にする必要があります(これはインラインで実行できず、代わりにスクリプトファイルまたは関数が必要な場合は必要ありません)。 望ましい出力: "SnapshotId","VolumeId","StartTime","OwnerId","VolumeSize","Description" "snap-00b66464","vol-b99a38d0","2012-01-05","=5098939","=160","my backup"

3
スクリプト内の時間の測定
このスレッドは、スクリプトの実行にかかる時間を測定する方法を示しています。私の場合、スクリプト内の2点間の時間を測定することに興味が あります。これが私がこれをどのように使用したいかの例です: start_measuring_time Line 1 Line 2 .. Line N stop_measuring_time show_elapsed_time 可能であれば、表示される時間を人間が読めるようにしたい(秒、分、時間、日など)。これを行う方法はありますか?

4
ショートカットにbashスクリプトまたはエイリアスを使用しますか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 3年前休業。 1つまたは2つの小さな行スクリプトをたくさん保存する~/binディレクトリ(にありますPATH)があります。それらのいくつかはちょうどcdディレクトリに移動し、ファイルのようなコマンドを実行しますvim。しかし.bash_aliases、同じ目的で使用する多くのエイリアスがファイルにあります。 小さなbashスクリプトを作成するか、エイリアスを作成するかをどのように決定しますか?どちらに行っても問題ありませんか?

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